Docker从入门到精通

时间:2024-01-22 17:49:25

系列文章目录

docker常见用法之镜像构建1

docker

  • 系列文章目录
  • 一、镜像的分层结构
  • 二、容器的用法
  • 三、镜像的构建
    • 3.1docker commit 构建新镜像三部曲
      • 3.1.1运行容器并且修改容器
      • 3.1.2提交容器
      • 3.1.2删除docker镜像
    • 3.2Dockerfile构建镜像
  • 系列文章目录
  • 一、 Dockerfile写法详解
    • 1.1 copy指令用法
    • 1.2 ADD指令用法
    • 1.3ENV指令用法
    • 1.4EXPOSE指令用法
    • 1.5VOLUME指令用法
    • 1.6WORKDIR指令用法
    • 1.7将数据存入宿主机原因
    • 1.8RUN指令的用法
    • 1.9CMD与ENTRYPOINT指令的用法
    • 1.10Shell 和exec格式的区别
    • 1.11ENTRYPOINT与CMD混合使用
  • 系列文章目录
  • 一、本文内容
  • 二、基础的镜像的选取,通过docker查找拉取
  • 三、nginx容器化
  • 系列文章目录
  • 一、镜像优化的意义及方法
  • 二、使用多阶段构建
  • 系列文章目录
  • 配置docker镜像加速器
  • 系列文章目录
  • docker公有仓库
  • docker私有仓库registry
  • 系列文章目录
  • 搭建私有仓库的意义
  • 搭建私有仓库
  • 搭建私有仓库的功能
    • 实验环境的搭建:
    • 无认证加密功能认证仓库的搭建
    • 搭建认证加密功能的仓库(生成证书并启动registry)
    • 搭建registry的认证功能
  • 系列文章目录
  • 一、harbor仓库(最小化安装)的搭建及用法
  • 二、 harbor仓库添加功能模板(安全模块签名和扫描)
  • 系列文章目录
  • 一、本文内容
  • 二、 docker原生网络
    • 2.1容器间如何通信
      • 2.1.1桥接模式
      • 2.1.2host共享宿主机的网络
      • 2.1.3none模式
  • 三、docker自定义网络
  • 四、Docker容器通信
  • 五、 跨主机容器网络
  • 系列文章目录
  • docker卷
    • bind mount
    • docker managed volume
  • bind mount 与 docker manager
  • 卷插件
  • convoy卷插件


一、镜像的分层结构

在这里插入图片描述
共享宿主机的内核(kernel)(容器的安全把宿主机安全管控好就好)
base镜像提供的是最小的linux发行版
同一docker主机支持运行多种linux发行版(因为linux内核一样,不一样的是文件系统)
采用分层结构的最大好处:共享资源(底层共享资源)
分层结构:降低了网络带宽和磁盘空间
(下载网上的镜像时候会判断你有该层没,你有相同层的话,你便不用下载了已经有的层。本机只要存储同样的镜像层一份,本机的镜像也可以共享)
在这里插入图片描述Copy-on-Write(linux内核的写时复制技术)容器层可以写
容器层以下都不可以写(都是只读)
docker从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何的修改
一个镜像最多127层(一般不会有那么大,因为优化就是减少镜像层)


二、容器的用法

容器常用用法:

-i交互式 -t打开一个tty终端
-d打入后台 -name给容器起个名字
ctrl +d 退出容器终端并且容器停掉 docker ps显示正在运行的容器
ctrl +pq 退出容器终端并且容器后台运行 docker ps +a 显示所有的容器
docker rm +容器名字 删掉已经停止的容器 容器正在running状态需要先stop,在rm
强制删除,不用停止容器直接删除rm-f + 容器名字 docker -p 宿主机端口:容器内的端口,用宿主机的端口号映射容器内的端口
docker start + 容器名字,开启容器 docker container attach +容器名字,进入该容器
docker images 查看容器已经有的镜像 docker history +容器名字,查看之前打包的历史记录
docker rmi +镜像名字,删除镜像 docker load 导入镜像
docker port + 容器名字,可以查看容器的端口映射 –restart=always随着docker引擎的开启该容器自动启动
docker inspect + 容器名字或者id,查看容器具体信息 docker inspect +镜像,查看镜像的具体信息
docker -v 宿主机路径:容器路径,数据持久化 docker exec -it 容器名字 sh 重新进入交互式容器中不能tab补齐
docker -v 将宿主机资源挂载到容器内
docker exec -it 容器名字 bash 重新进入交互式容器中能tab补齐
[root@docker1 docker]# docker container 
attach   diff     kill     port     rm       stop     wait     
commit   exec     logs     prune    run      top      
cp       export   ls       rename   start    unpause  
create   inspect  pause    restart  stats    update   

三、镜像的构建

镜像的名称是不能冲突的

3.1docker commit 构建新镜像三部曲

不推荐该方法

运行容器 docker run
修改容器
将容器保存为新的镜像
缺点:效率低、可重复性弱、容易出错
       使用者无法对镜像进行审计,存在安全隐患

3.1.1运行容器并且修改容器

[root@docker1 docker]# docker run -it --name test busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # ls
bin    etc    file2  home   root   tmp    var
dev    file1  file3  proc   sys    usr
ctrl +d
[root@docker1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker1 docker]# docker start test 
test
[root@docker1 docker]# docker container attach test 
/ # 
ctrl +pq
[root@docker1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7d589bd8615e        busybox             "sh"                27 minutes ago      Up 5 minutes                            test

3.1.2提交容器

[root@docker1 docker]# docker commit --help
Usage:	docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[root@docker1 docker]# docker commit -m "v1" test test:v1
sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
[root@docker1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                v1                  dc00eef3c58e        55 seconds ago      1.24MB
busybox             latest              beae173ccac6        3 weeks ago         1.24MB

missing 表示在别人机器上打包的你看不到,v1创建了3个文件
只能看到sh,不知道用户在其中具体干了什么,不便于用户审计和重用,安全隐患。

[root@docker1 docker]# docker history test:v1 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dc00eef3c58e        2 minutes ago       sh                                              166B                v1
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB              
[root@docker1 docker]# docker history busybox:latest 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB              

分层结构的好处,共享资源。两个镜像都用了最后2层,但操作系统上面只用保存一份。彼此共享,镜像层是只读的

[root@docker1 docker]# docker run -it --name demo test:v1
/ # ls
bin    dev    etc    file1  file2  file3  home   proc   root   sys    tmp    usr    var

3.1.2删除docker镜像

删除原先docker三部曲创建的镜像
当前有容器占用镜像,所以删不了该镜像。删除镜像的时候,先保证没有容器占用该镜像

[root@docker1 docker]# docker rmi test:v1
Error response from daemon: conflict: unable to remove repository reference "test:v1" (must force) - container 1e534ccc1bb7 is using its referenced image dc00eef3c58e

docker ps-a 找到占用镜像的容器删掉,然后删除容器镜像

[root@docker1 docker]# docker rm -f demo 
demo
[root@docker1 docker]# docker rmi test:v1 
Untagged: test:v1
Deleted: sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
Deleted: sha256:9e982fbda3a1bbb95e62de21d15b305daef87bab314f218a62afbfd3f9939c2e

3.2Dockerfile构建镜像

创建一个Dockerfile (必须在一个空目录中创建) 因为一开始会发送内容给Docker引擎,如果在很大/目录上面构建,会把整个/发送去构建
构建镜像

[root@docker1 docker]# cd 
[root@docker1 ~]# ls
[root@docker1 ~]# mkdir docker 
[root@docker1 ~]# cd docker/
[root@docker1 docker]# ls
[root@docker1 docker]# vim Dockerfile

FROM 从那个基础镜像开始构建,给予它一个环境(构建方式,通过基础镜像,运行一个容器,(后台)在里面执行指令)
RUN在容器里面运行什么指令
.是从当前目录读取

[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1

里面有构建镜像的具体参数

[root@docker1 docker]# docker build --help

每一个RUN,一层。相当于,你每一次运行,执行了一次Docker commit

[root@docker1 docker]# docker build -t test:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM busybox
 ---> beae173ccac6
Step 2/4 : RUN touch file1
 ---> Running in 0121d9c6c701
Removing intermediate container 0121d9c6c701
 ---> 884a1d2fcbd4
Step 3/4 : RUN mkdir dir1
 ---> Running in f45072d8860b
Removing intermediate container f45072d8860b
 ---> 3f7259a48bfc
Step 4/4 : RUN mv file1 dir1
 ---> Running in 612208e6db5b
Removing intermediate container 612208e6db5b
 ---> b6b7f570cc47
Successfully built b6b7f570cc47
Successfully tagged test:v1

在这里插入图片描述
便于审计并且便于重用,因为这个文件Dockerfile已经写下来了
在Dockerfile中写的每一行通过Docker commit提交成镜像层
在这里插入图片描述


END

系列文章目录

docker常用方法之dockerfile入门指令用法2

docker

  • 系列文章目录
  • 一、镜像的分层结构
  • 二、容器的用法
  • 三、镜像的构建
    • 3.1docker commit 构建新镜像三部曲
      • 3.1.1运行容器并且修改容器
      • 3.1.2提交容器
      • 3.1.2删除docker镜像
    • 3.2Dockerfile构建镜像
  • 系列文章目录
  • 一、 Dockerfile写法详解
    • 1.1 copy指令用法
    • 1.2 ADD指令用法
    • 1.3ENV指令用法
    • 1.4EXPOSE指令用法
    • 1.5VOLUME指令用法
    • 1.6WORKDIR指令用法
    • 1.7将数据存入宿主机原因
    • 1.8RUN指令的用法
    • 1.9CMD与ENTRYPOINT指令的用法
    • 1.10Shell 和exec格式的区别
    • 1.11ENTRYPOINT与CMD混合使用
  • 系列文章目录
  • 一、本文内容
  • 二、基础的镜像的选取,通过docker查找拉取
  • 三、nginx容器化
  • 系列文章目录
  • 一、镜像优化的意义及方法
  • 二、使用多阶段构建
  • 系列文章目录
  • 配置docker镜像加速器
  • 系列文章目录
  • docker公有仓库
  • docker私有仓库registry
  • 系列文章目录
  • 搭建私有仓库的意义
  • 搭建私有仓库
  • 搭建私有仓库的功能
    • 实验环境的搭建:
    • 无认证加密功能认证仓库的搭建
    • 搭建认证加密功能的仓库(生成证书并启动registry)
    • 搭建registry的认证功能
  • 系列文章目录
  • 一、harbor仓库(最小化安装)的搭建及用法
  • 二、 harbor仓库添加功能模板(安全模块签名和扫描)
  • 系列文章目录
  • 一、本文内容
  • 二、 docker原生网络
    • 2.1容器间如何通信
      • 2.1.1桥接模式
      • 2.1.2host共享宿主机的网络
      • 2.1.3none模式
  • 三、docker自定义网络
  • 四、Docker容器通信
  • 五、 跨主机容器网络
  • 系列文章目录
  • docker卷
    • bind mount
    • docker managed volume
  • bind mount 与 docker manager
  • 卷插件
  • convoy卷插件


一、 Dockerfile写法详解

看docker官方的网站学习docker具体指令
常用指令:

FROM 指定base镜像,如果本地不存在会从远程仓库下载 MAINTAINER 设置镜像的作者,比如用户邮箱等
COPY 把文件从build context 复制到镜像 支持两种形式:COPY src dest 和 COPY 【“src,”“dest”】 src必须指定build context 中的文件或目录

1.1 copy指令用法

src必须指定build context 中的文件或目录即当前目录
实验环境:

[root@docker1 docker]# vim index.html
[root@docker1 docker]# cat index.html 
www.yan.com

编写Dockerfile:

[root@docker1 docker]# vim Dockerfile 
[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /

前面镜像用的cache,因为之前编译过,Dockerfile没有改变都是用缓存来执行,加速构建过程

[root@docker1 docker]# docker build -t test:v2 .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM busybox
 ---> beae173ccac6
Step 2/5 : RUN touch file1
 ---> Using cache
 ---> 884a1d2fcbd4
Step 3/5 : RUN mkdir dir1
 ---> Using cache
 ---> 3f7259a48bfc
Step 4/5 : RUN mv file1 dir1
 ---> Using cache
 ---> b6b7f570cc47
Step 5/5 : COPY index.html /
 ---> 317f587b99ce
Successfully built 317f587b99ce
Successfully tagged test:v2

拷贝文件到容器中

[root@docker1 docker]# docker history test:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
317f587b99ce        2 minutes ago       /bin/sh -c #(nop) COPY file:d88a99d823b18eab…   12B                 
b6b7f570cc47        34 minutes ago      /bin/sh -c mv file1 dir1                        0B                  
3f7259a48bfc        34 minutes ago      /bin/sh -c mkdir dir1                           0B                  
884a1d2fcbd4        34 minutes ago      /bin/sh -c touch file1                          0B                  
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB              

执行的指令,ls /接在镜像的后面会覆盖掉镜像原有的操作指令。
–rm帮助运行完容器指令后自动删除该容器

[root@docker1 docker]# docker run --rm test:v2 ls /
bin
dev
dir1
etc
home
index.html
proc
root
sys
tmp
usr
var
[root@docker1 docker]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1.2 ADD指令用法

ADD用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:

实验环境:

[kiosk@foundation38 lamp]$ scp nginx-1.18.0.tar.gz root@172.25.254.1:/root/docker
[root@docker1 docker]# ls
Dockerfile  index.html  nginx-1.18.0.tar.gz

编写Dockefile:

[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /

[root@docker1 docker]# docker build -t test:v3 .
Sending build context to Docker daemon  1.043MB
Step 1/6 : FROM busybox
 ---> beae173ccac6
Step 2/6 : RUN touch file1
 ---> Using cache
 ---> 884a1d2fcbd4
Step 3/6 : RUN mkdir dir1
 ---> Using cache
 ---> 3f7259a48bfc
Step 4/6 : RUN mv file1 dir1
 ---> Using cache
 ---> b6b7f570cc47
Step 5/6 : COPY index.html /
 ---> Using cache
 ---> 317f587b99ce
Step 6/6 : ADD nginx-1.18.0.tar.gz  /
 ---> 88b81d3d9f28
Successfully built 88b81d3d9f28
Successfully tagged test:v3

解压后放入,基础镜像没有解压命令,所以在构建前用ADD构建。

[root@docker1 docker]# docker run --rm test:v3 ls /
bin
dev
dir1
etc
home
index.html
nginx-1.18.0
proc
root
sys
tmp
usr
var


1.3ENV指令用法

设置环境变量,变量可以被后续的指令使用:
变量名大写
Dockerfile写法:

[root@docker1 docker]# cat Dockerfile 
ENV HOSTNAME docker1

1.4EXPOSE指令用法

用于应用容器,要发布一个服务的容器。
如果容器中运行应用服务,可以把服务端口暴露出去:
EXPOSE 80

[root@docker1 docker]# cat Dockerfile 
EXPOSE 80

1.5VOLUME指令用法

应用容器的数据需要持久化
申明数据卷,通常指定的是应用的数据挂载点:

[root@docker1 docker]# cat Dockerfile 
VOLUME ["/data"]

1.6WORKDIR指令用法

为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。即,容器内切换目录。

前面3个用法的运行结果:

[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1

运行结果就不写在代码块了

[root@docker1 docker]# docker build -t test:v4 .

data是前面定义的数据卷

[root@docker1 docker]# docker run -it test:v4
/dir1 # cd /data/
/data # 

这个卷挂载你宿主机的上面

/data # mount |grep data
/dev/mapper/rhel-root on /data type xfs (rw,relatime,attr2,inode64,noquota)

docker里面看到的是宿主机的信息,磁盘、cpu、内存这些信息存在/proc,/proc是文件系统里面的不会被隔离。

/data # df
Filesystem           1K-blocks      Used Available Use% Mounted on
overlay               17811456   1594500  16216956   9% /
tmpfs                    65536         0     65536   0% /dev
tmpfs                  1023468         0   1023468   0% /sys/fs/cgroup
shm                      65536         0     65536   0% /dev/shm
/dev/mapper/rhel-root
                      17811456   1594500  16216956   9% /data
/dev/mapper/rhel-root
                      17811456   1594500  16216956   9% /etc/resolv.conf
/dev/mapper/rhel-root
                      17811456   1594500  16216956   9% /etc/hostname
/dev/mapper/rhel-root
                      17811456   1594500  16216956   9% /etc/hosts
tmpfs                  1023468         0   1023468   0% /proc/asound
tmpfs                  1023468         0   1023468   0% /proc/acpi
tmpfs                    65536         0     65536   0% /proc/kcore
tmpfs                    65536         0     65536   0% /proc/keys
tmpfs                    65536         0     65536   0% /proc/timer_list
tmpfs                    65536         0     65536   0% /proc/timer_stats
tmpfs                    65536         0     65536   0% /proc/sched_debug
tmpfs                  1023468         0   1023468   0% /proc/scsi
tmpfs                  1023468         0   1023468   0% /sys/firmware

docker运行的主机:

[root@docker1 ~]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root  17811456 1594500  16216956   9% /
devtmpfs                1011400       0   1011400   0% /dev
tmpfs                   1023468       0   1023468   0% /dev/shm
tmpfs                   1023468   17076   1006392   2% /run
tmpfs                   1023468       0   1023468   0% /sys/fs/cgroup
/dev/vda1               1038336  135172    903164  14% /boot
tmpfs                    204696       0    204696   0% /run/user/0
overlay                17811456 1594500  16216956   9% /var/lib/docker/overlay2/0d9fe361ffa5bec1667b38b2dc660e093a1dd319d69a23a6e498683163971fc5/merged

这个便是容器挂载在宿主机上面的卷

/dev/mapper/rhel-root  17811456 1594500  16216956   9% /

查看一下该容器的具体信息
docker inspect 后面可以加容器也可以镜像

[root@docker1 ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
4c626bd8688f        test:v4             "sh"                14 seconds ago      Up 13 seconds                     80/tcp              romantic_bhabha
999fd34ca89f        test:v4             "sh"                4 hours ago         Exited (255) About a minute ago   80/tcp              peaceful_wing
[root@docker1 ~]# docker inspect 4c626bd8688f

inspect查询部分信息:
Gateway是宿主机上面的地址,docker 0的地址。所以容器会通过桥接的模式到达宿主机的网关
所有容器的数据会放在宿主机的/var/lib/docker,如果把这个删掉,所有的镜像容器全没了。

[root@docker1 docker]# ls
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes

容器的卷的目录在/var/lib/docker/volumes

  "Gateway": "172.17.0.1"
  "IPAddress": "172.17.0.2",
       "Mounts": [
            {
                "Type": "volume",
                "Name": "a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171",
                "Source": "/var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

这个路径就被挂载在容器的目录里面

"Source": "/var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data",

容器里面:

/data # touch file1
/data # ls
file1

宿主机上:

[root@docker1 ~]# cd /var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data
[root@docker1 _data]# ls
file1

宿主机docker0的地址:

[root@docker1 ~]# ip addr | grep 172.17.0.1
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

容器里面查询ip的结果:

/dir1 # ip addr 
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

1.7将数据存入宿主机原因

1.容器的文件系统性能比宿主机差
2.数据过大放在容器不合适,不小心删掉容器,数据就丢失了

同理存在宿主机上面:
宿主机删掉该数据,容器里面的数据就没有了
宿主机:

[root@docker1 ~]# cd /var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data
[root@docker1 _data]# ls
file1
[root@docker1 _data]# rm -fr file1 

容器里面:

/data # ls
file1
/data # ls
/data # 

1.8RUN指令的用法

在容器中运行命令并创建新的镜像层,常用于安装软件包:
RUN yum install -y vim


1.9CMD与ENTRYPOINT指令的用法

这两个指令都是用于设置容器后执行的命令,但CMD会被docker run 后面的命令行覆盖(比如docker run -it /ls会覆盖掉),而ENTRYPOINT不会被忽略,一定会被执行
docker run 后面的参数可以传递给ENTRYPOINT指令当作参数
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效

CMD当用户进入后自动执行的指令,像busybox这个镜像第二层,意思就是当用户进去后,自动执行sh
官方推荐CMD用exec格式写

[root@docker1 docker]# docker history test:v1
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  

1.10Shell 和exec格式的区别

Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而exec格式不会
而用exec格式写的话:[“/bin/sh”,“-c”,“echo $变量名”]

Shell格式:

[root@docker1 docker]# vim Dockerfile 
[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD echo $HOSTNAME
[root@docker1 docker]# docker build -t test:v5 .
[root@docker1 docker]# docker run --rm test:v5
docker1

exec格式:

[root@docker1 docker]# vim Dockerfile 
[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v6 .
[root@docker1 docker]# docker run --rm test:v6
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "echo $HOSTNAME": executable file not found in $PATH: unknown.
[root@docker1 docker]# docker rmi test:v6
[root@docker1 docker]# vim Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["/bin/echo","echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v6 .
[root@docker1 docker]# docker run --rm test:v6
echo $HOSTNAME

用exec格式写:

[root@docker1 docker]# vim Dockerfile 
[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["/bin/echo","-c","echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v7 .
[root@docker1 docker]# docker run --rm test:v7
docker1

Exec格式时,ENTRYPOINT可以通过CMD提供额外的参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。即ENTRYPOINT与CMD混合使用

1.11ENTRYPOINT与CMD混合使用

[root@docker1 docker]# vim Dockerfile 
[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz  /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
[root@docker1 docker]# docker build -t test:v8 .
[root@docker1 docker]# docker run --rm test:v8
hello world
[root@docker1 docker]# docker run --rm test:v8 linux
hello linux
[root@docker1 docker]# docker run --rm test:v8 yan
hello yan

END

系列文章目录

docker之封装镜像之nginx容器化3

docker

  • 系列文章目录
  • 一、镜像的分层结构
  • 二、容器的用法
  • 三、镜像的构建
    • 3.1docker commit 构建新镜像三部曲
      • 3.1.1运行容器并且修改容器
      • 3.1.2提交容器
      • 3.1.2删除docker镜像
    • 3.2Dockerfile构建镜像
  • 系列文章目录
  • 一、 Dockerfile写法详解
    • 1.1 copy指令用法
    • 1.2 ADD指令用法
    • 1.3ENV指令用法
    • 1.4EXPOSE指令用法
    • 1.5VOLUME指令用法
    • 1.6WORKDIR指令用法
    • 1.7将数据存入宿主机原因
    • 1.8RUN指令的用法
    • 1.9CMD与ENTRYPOINT指令的用法
    • 1.10Shell 和exec格式的区别
    • 1.11ENTRYPOINT与CMD混合使用
  • 系列文章目录
  • 一、本文内容
  • 二、基础的镜像的选取,通过docker查找拉取
  • 三、nginx容器化
  • 系列文章目录
  • 一、镜像优化的意义及方法
  • 二、使用多阶段构建
  • 系列文章目录
  • 配置docker镜像加速器
  • 系列文章目录
  • docker公有仓库
  • docker私有仓库registry
  • 系列文章目录
  • 搭建私有仓库的意义
  • 搭建私有仓库
  • 搭建私有仓库的功能
    • 实验环境的搭建:
    • 无认证加密功能认证仓库的搭建
    • 搭建认证加密功能的仓库(生成证书并启动registry)
    • 搭建registry的认证功能
  • 系列文章目录
  • 一、harbor仓库(最小化安装)的搭建及用法
  • 二、 harbor仓库添加功能模板(安全模块签名和扫描)
  • 系列文章目录
  • 一、本文内容
  • 二、 docker原生网络
    • 2.1容器间如何通信
      • 2.1.1桥接模式
      • 2.1.2host共享宿主机的网络
      • 2.1.3none模式
  • 三、docker自定义网络
  • 四、Docker容器通信
  • 五、 跨主机容器网络
  • 系列文章目录
  • docker卷
    • bind mount
    • docker managed volume
  • bind mount 与 docker manager
  • 卷插件
  • convoy卷插件


一、本文内容

学会如何自己封装一个完整的镜像,将nginx容器化并且优化该镜像
容器启动后,宿主机能上网,容器也能上网。


二、基础的镜像的选取,通过docker查找拉取

[root@docker1 yum.repos.d]# docker search rhel7

STARS是下载量