Docker学习

视频地址:https://www.bilibili.com/video/BV1og4y1q7M4 狂神

image-20230423163241026

0.初识

思想:集装箱(隔离)

Docker 官网:Docker Docs: How to build, share, and run applications | Docker Documentation

Docker 容器官网:Docker Hub Container Image Library | App Containerization

名词解释:

  • Image 镜像:类似一个模板,可以通过这个模板创建多个容器。
  • Container 容器:独立运行一个或一组应用,通过镜像创建,容器之间互相独立
  • Repository 仓库:存放镜像的地方。

内部的镜像思想:分层思想。如 pull ngixn,最底层是 CentOS,上面是命令等等5层。当再下载MySQL 时,也需要最底层 CentOS,但是上一个镜像已经有了,可以直接拿来用,第一层不下载,由原来6层变为5层,第一层显示但不下载。(复用思想,为自定义镜像做铺垫)

image-20230424190135266.png

Docker 组成:

image-20230423165700732.png

Docker 底层运行原理图

  • 先去本地找,没有就去 Docker-Hub 上找,没有报错,有下载后执行

image-20230423180015859.png

底层原理

  • Docker 是 Client-Server 类型服务。Docker 的守护进程运行在主机上。

为什么 Docker 运行比虚机快

  1. Docker 不需要重新加载虚拟机内核,虚拟机每次启动都需要加载一次内核(Guest OS)。所以,VM 虚拟机启动是分钟级别,Docker 启动是秒级别。

1.入门 - Docker命令与镜像

官方命令图解

14968460b52c4d1eb8e1eaeeef4d2e54

帮助命令

1
2
3
docker --help # 万能命令
docker version # Docker 版本信息
docker info # 显示 Docker 系统信息,包含镜像

镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
docker images # 所有镜像

docker search --help# 搜索镜像
docker search mysql

docker pull --help # 下载镜像
docker pull mysql # 不指定版本默认 last
docker pull mysql:5.7 # 指定版本

docker rmi # 删除镜像 i 指 image
docker rmi -f 镜像Id # 删除指定镜像
docker rmi -f ${docker images -qa} # 复合命令。先查出所有镜像,当作参数进行删除。

说明:镜像名,标签,镜像Id,创建日期,镜像大小

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 19 months ago 13.3kB

容器命令Docker run 命令 | 菜鸟教程 (runoob.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
docker run 镜像名 # 根据镜像创建容器
# 可选 --name 指定容器名称,-d 后台运行容器
docker run --name newMysql -d mysql
docker run -p 主机端口:容器端口 镜像名
# -i 以交互模式运行容器,-t 分配伪终端,
docker run -it centos /bin/bash

# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#

# 列出当前正在运行的容器
docker ps

docker ps -a # 列出正在运行的容器,包含历史运行过的容器
docker ps -aq # 列出正在运行的容器Id
# 退出容器
exit
ctrl + p + q # 容器不停止退出

# 删除容器
docker rm 容器id
docker rm -f 容器id # 强制删除
docker rm `docker ps -a -q` # 删除所有容器

docker start 容器id
docker restart 容器id
docker stop 容器id # 停止正在运行的容器
docker kill 容器id # 强制停止

其他命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看容器内部日志
docker log -tf tail 10 容器id
# 查看容器内部进程
docker top 容器id
# inspect 容器内部信息(查看元数据)
docker inspect 容器id
# 进入容器命令操作
docker attach 容器id
# 进入容器,开启新终端
docker exec -it 容器id /bin/bash

# 拷贝容器中的文件
docker cp 容器id:容器文件路径 目的主机路径

创建自定义镜像镜像

命令

1
2
3
4
5
docker commit -a="wang" -m="add app" 镜像id 自定义镜像名称:版本
#
docker commit -a="wang" -m="add" 219e497de988 tomcatForWang:1.0
# 查看
docker images

2.基础 - 容器数据卷

容器数据卷:将容器内的目录,挂载到 Linux 上 -v

  • 匿名挂载: -v 容器路径
  • 具名挂载: -v 卷名:容器路径
  • 扩展,容器路径:ro 或 容器路径:rw 解释:ro readonly:容器内只能读;rw readwrite : 可以读写

容器的持久化与同步操作。防止容器删除了,数据就没有了。

-v 挂载后只需要操作 Linux 下的文件就可以,不需要修改容器中的文件,会自动同步。

命令:

1
2
3
4
5
6
docker run \ 
-p Linux端口:容器端口 \ # 容器端口映射
--name 自定义容器名称 \ # 自定义容器名称
-v Linux文件路径:容器内文件路径名称 # 文件挂载,可以理解为双向绑定
-d 镜像名 # 后台运行
-e 配置参数="值" # 环境配置

image-20230424172804933

3.Dockerfile 学习

Dockerfile:通过这个脚本可以生成一个镜像

DockerFile指令

1
2
3
4
5
6
7
8
9
10
FROM 			# 基础镜像,镜像基础
MAINTAINER # 镜像谁写的,姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载目录
EXPOSE # 保留端口配置
CMD # 容器启动时候会执行的命令,覆盖命令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时设置的环境变量

3.1 构建步骤

基础知识:

  1. 每个关键字(指令)都是大写。

  2. 执行从上到下顺序执行。

  3. 每一个指令都会创建提交一个新的镜像层,并提交!

    image-20230424190135266.png

步骤:开发,部署,运维

  • DockerFile:构建文件,定义了一切的步骤,源代码
  • DockerImages:通过DockerFile 构建生成的镜像,最终发布和运行的产品
  • Docker容器:容器就是镜像运行起来提供服务器
1
2
# 注意后面有个点
docker build -f dockerfile文件路径 -t 自定义容器名称:版本 .

3.2 构建自己的 DockerFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 文件名:mydockerfile-centos
FROM centos # 基层镜像
MAINTAINER wang<756545937@qq.com> # 作者

ENV MYPATH /usr/local # 变量
WORKDIR $MYPATH # 工作目录
RUN yum -y install vim # 构建镜像时执行命令
RUN yum -y install net-tools

EXPOSE 80 # 向外暴露80端口

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash # 操作命令选择?

# 构建命令 docker build -f dockerfile文件目录 -t 自定义镜像名:[版本号]
docker build -f mydockerfile-centos -t mycentos:1.0

# 查看镜像构建过程
docker history 镜像id

3.3 Docker 容器之间文件共享

1
docker run -it --name 自定义名称 --volumes-from 容器名称或id 镜像名

3.4 ★Dockerfile 实践

场景:通过 Docker 搭建 Tomcat 环境

环境:JDK 与 Tomcat 压缩包准备(用于 Dockerfile 复制),readme.txt 说明文档,Docker 服务

  1. 书写 Dockerfile 文件内容

  2. 通过 Dockerfile 构建容器

    1
    2
    # Dockerfile 是默认 build 对象,不需要 -f 指定文件 diytomcat 是构建的镜像名称
    docker build -t diytomcat
  3. 根据镜像构建容器

    启动命令

    1
    2
    3
    4
    5
    6
    7
    8
    # -v 挂载说名:虚拟机位置:容器内位置
    docker run \
    -d \
    -p 9090:8080 \
    --name mytomcat01 \
    -v /home/app/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
    -v /home/app/build/tomcat/tomcatlogs/:usr/local/apache-tomcat-9.0.22/logs \
    diytomcat # 上面 Dockerfile 构建的镜像名称
  4. 测试容器

    • 在 test 下 WEB-INF 下添加 web.xml

    • 在 test 下添加 index.jsp 文件。

      以上内容在虚拟机文件中添加,已挂载,自动同步

Docker 实践

  1. Docker安装Nginx

    Docker 安装Nginx容器 (完整详细版) - 腾讯云开发者社区-腾讯云 (tencent.com)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 提供外部挂载文件夹
    mkdir -p /usr/local/app/docker/nginx/conf
    mkdir -p /usr/local/app/docker/nginx/log
    mkdir -p /usr/local/app/docker/nginx/html

    # 生成容器
    docker run --name nginx -p 9001:80 -d nginx
    # 将容器nginx.conf文件复制到宿主机
    docker cp nginx:/etc/nginx/nginx.conf /usr/local/app/docker/nginx/conf/nginx.conf
    # 将容器conf.d文件夹下内容复制到宿主机
    docker cp nginx:/etc/nginx/conf.d /usr/local/app/docker/nginx/conf/conf.d
    # 将容器中的html文件夹复制到宿主机
    docker cp nginx:/usr/share/nginx/html /usr/local/app/docker/nginx/html

    # 挂载运行nginx
    docker run \
    -p 9001:80 \
    --name mynginx \
    -v /usr/local/app/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /usr/local/app/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v /usr/local/app/docker/nginx/log:/var/log/nginx \
    -v /usr/local/app/docker/nginx/html:/usr/share/nginx/html \
    -d nginx
  2. Docker安装tomcat

    1
    2
    3
    4
    5
    docker pull tomcat
    docker run \
    -p 8080:8080
    --name mytomcat \
    -d tomcat

    问题:外部与内部访问访问404 curl localhost:8080

    (117条消息) 解决Docker启动Tomcat容器,访问404问题_elsostal的博客-CSDN博客

    说明:进入 docker app 内部:docker exec -it mytomcat /bin/bash

    原因:webapps 下面为空,只需要将 webapps.dist 下内容复制到 webapps 下即可

    cp -r webapps.dist webapps

  3. 通过Dockerfile搭建自定义镜像

    1
    2
    3
    4
    5
    6
    注意点:
    1. FROM centos
    2. 环境搭建
    - JDK 等等
    - tomcat copy相关压缩包
    3. 配置环境变量 如 JAVA_HOME=