构建镜像

Docker 提供了两种构建镜像的方法:

  1. docker commit 命令
  2. Dockerfile 构建文件

docker commit
docker commit 命令是创建新镜像最直观的方法,其过程包含三个步骤:

  1. 运行容器
  2. 修改容器
  3. 将容器保存为新的镜像

docker commit

1.运行容器

[root@docker ~ 09:48:14]# docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6f5c5aa4e145: Pull complete
1c24335ddd46: Pull complete
Digest: sha256:f3d28607ddd78734bb7f71f117f3c6706c666b8b76cbff7c9ff6e5718d46ff64
Status: Downloaded newer image for ubuntu:latest

##确认vim没有安装
root@f16554ee2b65:/# vim
bash: vim: command not found

2.安装vim

root@f16554ee2b65:/# apt-get update
root@f16554ee2b65:/# apt-get install -y vim

Please select the geographic area in which you live. Subsequent configuration questions will
narrow this down by presenting a list of cities, representing the time zones in which they are
located.

  1. Africa   3. Antarctica  5. Asia      7. Australia  9. Indian    11. Etc
  2. America  4. Arctic      6. Atlantic  8. Europe     10. Pacific
Geographic area: 5

Please select the city or region corresponding to your time zone.

  1. Aden        19. Colombo      37. Kabul         55. Novosibirsk    73. Tbilisi
  2. Almaty      20. Damascus     38. Kamchatka     56. Omsk           74. Tehran
  3. Amman       21. Dhaka        39. Karachi       57. Oral           75. Tel_Aviv
  4. Anadyr      22. Dili         40. Kashgar       58. Phnom_Penh     76. Thimphu
  5. Aqtau       23. Dubai        41. Kathmandu     59. Pontianak      77. Tokyo
  6. Aqtobe      24. Dushanbe     42. Khandyga      60. Pyongyang      78. Tomsk
  7. Ashgabat    25. Famagusta    43. Kolkata       61. Qatar          79. Ulaanbaatar
  8. Atyrau      26. Gaza         44. Krasnoyarsk   62. Qostanay       80. Urumqi
  9. Baghdad     27. Harbin       45. Kuala_Lumpur  63. Qyzylorda      81. Ust-Nera
  10. Bahrain    28. Hebron       46. Kuching       64. Riyadh         82. Vientiane
  11. Baku       29. Ho_Chi_Minh  47. Kuwait        65. Sakhalin       83. Vladivostok
  12. Bangkok    30. Hong_Kong    48. Macau         66. Samarkand      84. Yakutsk
  13. Barnaul    31. Hovd         49. Magadan       67. Seoul          85. Yangon
  14. Beirut     32. Irkutsk      50. Makassar      68. Shanghai       86. Yekaterinburg
  15. Bishkek    33. Istanbul     51. Manila        69. Singapore      87. Yerevan
  16. Brunei     34. Jakarta      52. Muscat        70. Srednekolymsk
  17. Chita      35. Jayapura     53. Nicosia       71. Taipei
  18. Chongqing  36. Jerusalem    54. Novokuznetsk  72. Tashkent
Time zone: 68
##选择时区
##安装完成

打开一个新窗口中查看当前运行的容器。

[root@docker ~ 09:51:24]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
f16554ee2b65   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             thirsty_hawking

执行 docker commit 命令将容器保存为镜像

[root@docker ~ 09:51:29]# docker commit f16554ee2b65 ubuntu-with-vim:v1
## f16554ee2b65 容器的镜像id
## ubuntu-with-vim:v1 新容器名称
sha256:cf9dcab86ce9039d2a1fe74a564b78ff9daf3629d2fb9c53aec0639298214fbe

验证结果

##查看镜像属性
[root@docker ~ 09:52:59]# docker images
##本地有一个新增的ubuntu-with-vim
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
ubuntu-with-vim   v1        cf9dcab86ce9   15 seconds ago   213MB
ubuntu            latest    30ba44506a6d   2 weeks ago      100MB
centos            7         eeb6ee3f44bd   4 years ago      204MB
##运行程序
[root@docker ~ 09:53:04]# docker run -it ubuntu-with-vim:v1
root@8f783871ead9:/# vim 123
root@8f783871ead9:/#
##vim可以正常使用

Dockerfile

Dockerfile内容基础知识:

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

常用参数
docker build -f [Dockerfile路径] [构建上下文路径]
参数 作用
-f 或 --file 标志符,声明要使用自定义 Dockerfile
[Dockerfile路径] 绝对路径或相对于构建上下文的路径(如 subdir/Dockerfile.dev )
[构建上下文路径] Docker 打包发送给守护进程的目录(通常用 . 表示当前目录)

[root@docker ~ 10:07:15]# pwd
/root
[root@docker ~ 10:20:03]# mkdir dirA
[root@docker ~ 10:20:16]# cd dirA/
[root@docker dirA 10:20:20]# vim Dockerfile
[root@docker dirA 10:21:18]# cat Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y vim

[root@docker dirA 10:24:48]# docker build -t ubunt-with-vim-dockerfile .
[+] Building 32.3s (6/6) FINISHED                                                 docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 94B                                                         0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                            0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => [1/2] FROM docker.io/library/ubuntu:latest                                              0.0s
 => [2/2] RUN apt-get update && apt-get install -y vim                                     32.0s
 => exporting to image                                                                      0.3s
 => => exporting layers                                                                     0.3s
 => => writing image sha256:d68fd3613b26dc3af312da5fed94921201d9fcca918156a1fc293124940c7c  0.0s
 => => naming to docker.io/library/ubunt-with-vim-dockerfile                                0.0s

[root@docker dirA 10:27:48]# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED              SIZE
ubunt-with-vim-dockerfile   latest    d68fd3613b26   About a minute ago   213MB
ubuntu-with-vim             v1        cf9dcab86ce9   35 minutes ago       213MB
ubuntu                      latest    30ba44506a6d   2 weeks ago          100MB
centos                      7         eeb6ee3f44bd   4 years ago          204MB

镜像的缓存特性

Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。

[root@docker dirA 10:27:51]# pwd
/root/dirA
[root@docker dirA 10:39:06]# ls
Dockerfile
[root@docker dirA 10:39:12]# touch testfile
[root@docker dirA 10:39:22]# ls
Dockerfile  testfile
[root@docker dirA 10:39:23]# vim Dockerfile
[root@docker dirA 10:40:29]# cat Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y vim
COPY testfile /root/dirA
[root@docker dirA 10:40:36]# docker build -t ubuntu-with-vim-docker-2 .
[+] Building 0.1s (8/8) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 119B                                                        0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                            0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => [1/3] FROM docker.io/library/ubuntu:latest                                              0.0s
 => [internal] load build context                                                           0.0s
 => => transferring context: 29B                                                            0.0s
 => CACHED [2/3] RUN apt-get update && apt-get install -y vim                               0.0s
 => [3/3] COPY testfile /root/dirA                                                          0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:212bce962a05cc3cd60a0ebb5afa36ceee758fca9238df7e00df0298941d14  0.0s
 => => naming to docker.io/library/ubuntu-with-vim-docker-2                                 0.0s
 ##速度很快。因为上面已经有缓存

如果我们希望在构建镜像时不使用缓存,可以在 docker build 命令中加上 --no-cache 参数。
Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生
变化,其上面所有层的缓存都会失效。
也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。

调试Dockerfile

[root@docker dirA 10:44:31]# vim Dockerfile
[root@docker dirA 10:54:17]# cat Dockerfile
FROM busybox
RUN touch tmpfile
RUN /bin/bash -c "echo continue to build..."
COPY testfile /root/dirA

在这里插入图片描述

##在宿主机可以执行
[root@docker dirA 10:55:24]# /bin/bash -c "echo continue to build..."
continue to build...
[root@docker dirA 10:56:12]# docker run -it busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
481282afbc43: Already exists
Digest: sha256:1487d0af5f52b4ba31c7e465126ee2123fe3f2305d638e7827681e7cf6c83d5e
Status: Downloaded newer image for busybox:latest
##在busybox执行不了
/ # /bin/bash -c "echo continue to build..."
sh: /bin/bash: not found
/ # /bin/sh -c "echo continue to build..."
continue to build...

修改文件
在这里插入图片描述
执行成功
在这里插入图片描述
综合练习

[root@docker dirA 11:28:26]# ls
Dockerfile
[root@docker dirA 11:28:28]# vim Dockerfile
[root@docker dirA 11:32:50]# cat Dockerfile
# my dockerfile
FROM busybox    ##从busybox开始构建
MAINTAINER zzzzz   #声明作者信息
WORKDIR /tmp   #设置工作目录为/tmp
RUN touch tmpfile1  #在新镜像中创建tmpfille1
COPY ["tmpfile2","."] #将Dockerfile文件所在目录中的tmpfile2文件拷贝到新镜像中
ADD ["passwd.tar.gz","."] #将Dockerfile文件所在目录中的passwd.tar.gz拷贝到新镜像中并解压缩
ENV WELCOME "You are in my container,welcom!"  #设置环境变量为WELOCME

完整操作如下,配置如上

[root@docker dirA 11:32:54]# pwd
/root/dirA
[root@docker dirA 11:33:01]# ls
Dockerfile
[root@docker dirA 11:33:04]# touch tmpfile2
[root@docker dirA 11:33:18]# cp /etc/passwd .
[root@docker dirA 11:33:30]# tar -cvzf passwd.tar.gz passwd
passwd
[root@docker dirA 11:33:57]# rm passwd
rm: remove regular file 'passwd'? y
[root@docker dirA 11:34:18]# ls
Dockerfile  passwd.tar.gz  tmpfile2
[root@docker dirA 11:34:33]# docker build -t my-image .
[+] Building 0.3s (10/10) FINISHED                                                docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 211B                                                        0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/5] FROM docker.io/library/busybox:latest                                      0.0s
 => [internal] load build context                                                           0.0s
 => => transferring context: 619B                                                           0.0s
 => [2/5] WORKDIR /tmp                                                                      0.0s
 => [3/5] RUN touch tmpfile1                                                                0.2s
 => [4/5] COPY [tmpfile2,.]                                                                 0.0s
 => [5/5] ADD [passwd.tar.gz,.]                                                             0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:fcd4dede3cefa69cfa42774a09280e52fde1caf0995294f403e7eac15813c2  0.0s
 => => naming to docker.io/library/my-image                                                 0.0s
##查看my-image已经做好了
[root@docker dirA 11:35:00]# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED             SIZE
my-image                    latest    fcd4dede3cef   8 seconds ago       4.42MB
image-debug                 latest    2cc5c0b6f35b   34 minutes ago      4.42MB
ubuntu-with-vim-docker-2    latest    212bce962a05   54 minutes ago      213MB
ubunt-with-vim-dockerfile   latest    d68fd3613b26   About an hour ago   213MB
ubuntu-with-vim             v1        cf9dcab86ce9   2 hours ago         213MB
ubuntu                      latest    30ba44506a6d   2 weeks ago         100MB
busybox                     latest    925ff61909ae   19 months ago       4.42MB
centos                      7         eeb6ee3f44bd   4 years ago         204MB

验证结果

##进入刚做好的镜像运行
[root@docker dirA 11:35:08]# docker run -it my-image
##刚进入默认路径位置为/tmp
/tmp # pwd
/tmp
/tmp # ls
passwd    tmpfile1  tmpfile2  ##目录下面确实有三个文件
/tmp # echo $WELCOME  ##环境变量没问题
You are in my container,welcom!

新增标签

[root@docker dirA 11:41:41]# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED             SIZE
my-image                    latest    fcd4dede3cef   11 minutes ago      4.42MB
image-debug                 latest    2cc5c0b6f35b   45 minutes ago      4.42MB

[root@docker dirA 11:46:19]# docker image tag image-debug:latest hello.debug:v1
[root@docker dirA 11:47:04]# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED             SIZE
my-image                    latest    fcd4dede3cef   12 minutes ago      4.42MB
image-debug                 latest    2cc5c0b6f35b   46 minutes ago      4.42MB
hello.debug                 v1        2cc5c0b6f35b   46 minutes ago      4.42MB

RUN vs CMD vs ENTRYPOINT

简单来说

  1. RUN 经常用于安装软件包。
  2. CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。
  3. ENTRYPOINT 配置容器启动时运行的命令。(运行完之后直接结束进程)
    当指令执行时,shell 格式底层会调用 /bin/sh -c 。

shell与exec格式

[root@docker ~ 13:55:38]# cd dirA/
[root@docker dirA 13:56:24]# ls
Dockerfile  passwd.tar.gz  tmpfile2
[root@docker dirA 13:56:26]# vim Dockerfile
[root@docker dirA 13:57:55]# docker build -t dockerfile1 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 95B                                                         0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:2cba8611a943e3076672ad52257b1f7b046ce4619c5b75b9b9c18cdc653232  0.0s
 => => naming to docker.io/library/dockerfile1                                              0.0s
[root@docker dirA 13:58:20]# docker run dockerfile1
hello, zzzz
[root@docker dirA 13:58:34]# cat Dockerfile
FROM busybox
ENV name zzzz
ENTRYPOINT echo "hello, $name"
[root@docker dirA 13:58:47]# vim Dockerfile
[root@docker dirA 14:00:04]# cat Dockerfile
FROM busybox
ENV name zzzz
ENTRYPOINT ["/bin/echo","hello , $name"]

[root@docker dirA 14:00:26]# docker build -t dockerfile2 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 105B                                                        0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:6ca049726a7049c8da679b7b685f72cfe6f52532b0da3e8689ac4b1b28ce11  0.0s
 => => naming to docker.io/library/dockerfile2                                              0.0s
[root@docker dirA 14:00:29]# docker run dockerfile2
hello , $name

[root@docker dirA 14:00:44]# vim Dockerfile
[root@docker dirA 14:01:26]# cat Dockerfile
FROM busybox
ENV name zzzz
ENTRYPOINT ["/bin/echo","-c","hello , $name"]
[root@docker dirA 14:01:29]# docker build -t dockerfile3 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 110B                                                        0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:0cbdb213070af7b29c00351c23064b82c8f3febb58bca42cd45cdeba77dff2  0.0s
 => => naming to docker.io/library/dockerfile3                                              0.0s
[root@docker dirA 14:01:45]# docker run dockerfile3
-c hello , $name

[root@docker dirA 14:01:53]# vim Dockerfile
[root@docker dirA 14:02:35]# cat Dockerfile
FROM busybox
ENV name zzzz
ENTRYPOINT ["/bin/sh","-c","echo hello , $name"]
[root@docker dirA 14:02:39]# docker build -t dockerfile4 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 113B                                                        0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:b582fea38ecb3320f5a736dc7a1e7e0dfffe06ea869b401f1af1aecd8b8bc6  0.0s
 => => naming to docker.io/library/dockerfile4                                              0.0s
[root@docker dirA 14:02:56]# docker run dockerfile4
hello , zzzz

RUN

RUN 指令通常用于安装应用和软件包。
RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。
RUN 有两种格式:

  1. Shell 格式:RUN
  2. Exec 格式:RUN [“executable”, “param1”, “param2”]
[root@docker dirA 14:06:01]# vim Dockerfile
[root@docker dirA 14:35:34]# cat Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
[root@docker dirA 14:35:38]# docker build -t dockerfile5 .
[+] Building 467.0s (6/6) FINISHED                                                docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 133B                                                        0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                            0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/2] FROM docker.io/library/ubuntu:latest                                       0.0s
 => [2/2] RUN apt-get update && apt-get install -y bzr cvs git mercurial subversion       466.1s
 => exporting to image                                                                      0.9s
 => => exporting layers                                                                     0.9s
 => => writing image sha256:c258c8c31ed4576c50951bfdd3ec080f476e37110b11c722d622c8c4a290ae  0.0s
 => => naming to docker.io/library/dockerfile5                                              0.0s
[root@docker dirA 14:43:47]# docker run -it dockerfile5
root@a531f3beb716:/# apt list install brz cvs git mercurial subversion
brz/resolute,now 3.3.21-1build1 amd64 [installed]
cvs/resolute,now 2:1.12.13+real-31 amd64 [installed]
git/resolute,now 1:2.53.0-1ubuntu1 amd64 [installed]
mercurial/resolute,now 7.2-3build1 amd64 [installed]
subversion/resolute,now 1.14.5-6build1 amd64 [installed]

CMD

CMD 指令允许用户指定容器的默认执行的命令。
此命令会在容器启动且 docker run 没有指定其他命令时运行。

  1. 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。
  2. 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。
    CMD 有三种格式:
  3. Exec 格式:CMD [“executable”,“param1”,“param2”] 这是 CMD 的推荐格式。
  4. CMD [“param1”,“param2”] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec
    格式。
  5. Shell 格式:CMD command param1 param2
[root@docker dirA 14:42:46]# vim Dockerfile
[root@docker dirA 14:43:40]# cat Dockerfile
FROM busybox
CMD echo "hello,world"
[root@docker dirA 14:43:44]# docker build -t dockerfile6 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 73B                                                         0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:9ff0c8a8f5a95f520c7f69fa58f3f8fa2f8ba7aef082202516a17fd1064418  0.0s
 => => naming to docker.io/library/dockerfile6                                              0.0s
[root@docker dirA 14:44:11]# docker run -it dockerfile6
hello,world
[root@docker dirA 14:44:34]# docker run -it dockerfile6 /bin/sh
/ # exit

ENTRYPOINT

ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
ENTRYPOINT 有两种格式:

  1. Exec 格式:ENTRYPOINT [“executable”, “param1”, “param2”] 这是 ENTRYPOINT 的推荐格式。
  2. Shell 格式:ENTRYPOINT command param1 param2
Exec 格式
[root@docker dirA 14:47:05]# vim Dockerfile
[root@docker dirA 14:48:16]# cat Dockerfile
FROM busybox
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
[root@docker dirA 14:48:19]# docker build -t dockerfile7 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 98B                                                         0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:00117dd4e663d4eb0f4f130c4274165852ecd9e80944f0d811095fd000b560  0.0s
 => => naming to docker.io/library/dockerfile7                                              0.0s
[root@docker dirA 14:48:47]# docker run -it dockerfile7
Hello world
[root@docker dirA 14:49:01]# docker run -it dockerfile7 abc
Hello abc
Shell 格式

ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。

[root@docker dirA 14:49:16]# vim Dockerfile
[root@docker dirA 14:50:06]# cat Dockerfile
FROM busybox
ENTRYPOINT echo "Hello"
CMD ["world"]
[root@docker dirA 14:50:09]# docker build -t dockerfile8 .
[+] Building 0.0s (5/5) FINISHED                                                  docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 88B                                                         0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                           0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/1] FROM docker.io/library/busybox:latest                                      0.0s
 => exporting to image                                                                      0.0s
 => => exporting layers                                                                     0.0s
 => => writing image sha256:521e4896eb6a5603693366a5a21595b785dc8aa683a9c1b8a0be7126d81b9f  0.0s
 => => naming to docker.io/library/dockerfile8   
 ##entrypoint执行时,cmd会被忽略                                          
[root@docker dirA 14:50:25]# docker run -it dockerfile8
Hello
##entpypiont不会被忽略,一定会执行
[root@docker dirA 14:50:42]# docker run -it dockerfile8 123
Hello

Dockerfile案例:

配置SSH镜像

[root@docker ~ 15:37:56]# mkdir ssh.centos
[root@docker ~ 15:38:44]# cd ssh.centos/
[root@docker ssh.centos 15:38:47]# vim Dockerfile

[root@docker ssh.centos 15:52:48]# cat Dockerfile
FROM centos:8.4.2105
MAINTAINER zzzzzz
RUN minorver=8.4.2105 && \
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$minorver|g" \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN echo "root:huawei" | chpasswd
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

[root@docker ssh.centos 15:51:40]# docker build -t centos.sshd .
[+] Building 58.7s (10/10) FINISHED                    docker:default
 => [internal] load build definition from Dockerfile             0.0s
 => => transferring dockerfile: 528B                             0.0s
 => [internal] load metadata for docker.io/library/centos:8.4.2  0.0s
 => [internal] load .dockerignore                                0.0s
 => => transferring context: 2B                                  0.0s
 => [1/6] FROM docker.io/library/centos:8.4.2105                 0.0s
 => [2/6] RUN minorver=8.4.2105 && sed -e "s|^mirrorlist=|#mirr  0.3s
 => [3/6] RUN yum install -y openssh-server                     57.4s
 => [4/6] RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key     0.4s
 => [5/6] RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_ke  0.2s
 => [6/6] RUN echo "root:huawei" | chpasswd                      0.3s
 => exporting to image                                           0.1s
 => => exporting layers                                          0.1s
 => => writing image sha256:916df8bd0267c324e95d6510c8d8329e10c  0.0s
 => => naming to docker.io/library/centos.sshd                   0.0s

测试

[root@docker ssh.centos 15:59:04]# docker run -d -p 2022:22 --name sshtest centos.sshd
84fa11c75bc2a72743242f9547000ccec07cfeb801cc9ebdd84aa02677cb4286
[root@docker ssh.centos 15:59:45]# docker ps
CONTAINER ID   IMAGE         COMMAND               CREATED         STATUS         PORTS                                   NAMES
84fa11c75bc2   centos.sshd   "/usr/sbin/sshd -D"   8 seconds ago   Up 7 seconds   0.0.0.0:2022->22/tcp, :::2022->22/tcp   sshtest

[root@docker ssh.centos 16:00:05]# ssh root@localhost -p 2022
The authenticity of host '[localhost]:2022 ([::1]:2022)' can't be established.
ECDSA key fingerprint is SHA256:oR29H91Nj3jxLhxm+tpvpoBN+sq0l526CFCX6gurouI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2022' (ECDSA) to the list of known hosts.

root@localhost's password:
"System is booting up. Unprivileged users are not permitted to log in yet. Please come back later. For technical details, see pam_nologin(8)."
Last failed login: Sat May  9 08:00:42 UTC 2026 from 172.17.0.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
[root@84fa11c75bc2 ~]#

自定义httpd镜像

[root@docker ~ 16:02:06]# mkdir httpd
[root@docker ~ 16:02:32]# cd httpd
[root@docker httpd 16:02:37]# vim Dockerfile
[root@docker httpd 16:06:25]# cat Dockerfile
FROM centos:8.4.2105
MAINTAINER zzzzz
RUN minorver=8.4.2105 \
&& sed -e "s|^mirrorlist=|#mirrorlist=|g" -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$minorver|g" -i.bak /etc/yum.repos.d/CentOS-*.repo
RUN yum install -y httpd && yum clean all && rm -rf /var/cache/yum
copy index.html /var/www/html
EXPOSE 80
CMD ["/usr/sbin/httpd","-DFOREGROUND"]


[root@docker httpd 16:07:56]# ls
Dockerfile
[root@docker httpd 16:09:02]# echo hello world > index.html
[root@docker httpd 16:09:32]# docker build -t httpd.centos .
[+] Building 0.1s (9/9) FINISHED                               docker:default
 => [internal] load build definition from Dockerfile                     0.0s
 => => transferring dockerfile: 455B                                     0.0s
 => [internal] load metadata for docker.io/library/centos:8.4.2105       0.0s
 => [internal] load .dockerignore                                        0.0s
 => => transferring context: 2B                                          0.0s
 => [1/4] FROM docker.io/library/centos:8.4.2105                         0.0s
 => [internal] load build context                                        0.0s
 => => transferring context: 49B                                         0.0s
 => CACHED [2/4] RUN minorver=8.4.2105 && sed -e "s|^mirrorlist=|#mirro  0.0s
 => CACHED [3/4] RUN yum install -y httpd && yum clean all && rm -rf /v  0.0s
 => [4/4] COPY index.html /var/www/html                                  0.0s
 => exporting to image                                                   0.1s
 => => exporting layers                                                  0.1s
 => => writing image sha256:8b82a40260a4367ef1a05540ae4ff8f4b7443f92af3  0.0s
 => => naming to docker.io/library/httpd.centos                          0.0s

测试

#基于刚才dockerfile创建的镜像httpd:centos创建容器myweb
[root@docker httpd 16:11:20]# docker run -d -p 80:80 --name myweb httpd.centos
e29a25b438727db67cfafbcdf8426e095d1a4df9b389ccc2601b49158bcdd156
[root@docker httpd 16:11:30]# curl localhost
hello world

在这里插入图片描述

自定义java

[root@docker ~ 16:17:18]# mkdir porject
[root@docker ~ 16:25:45]# cd porject/
[root@docker porject 16:25:51]# vim Dockerfile
[root@docker porject 16:34:59]# cat Dockerfile
FROM centos:8.4.2105
MAINTAINER zzzz
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置yum源
RUN minorver=8.4.2105 \
&& sed -e "s|^mirrorlist=|#mirrorlist=|g" -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$minorver|g" -i.bak /etc/yum.repos.d/CentOS-*.repo
#安装vim编辑器
RUN yum install -y vim
#安装java8及lib库
RUN yum install -y glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u461-linux-x64.tar.gz添加到容器中,安装包必须要Dockerfile文件在同一位置
ADD jdk-8u461-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_461
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "susses-----ok"
CMD /bin/bash
##确保目录里面有jdk。tar包
[root@docker porject 16:35:03]# ls
Dockerfile  jdk-8u461-linux-x64.tar.gz

[root@docker porject 16:35:53]# docker build -t java.centos .
[+] Building 115.2s (12/12) FINISHED                                              docker:default
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 928B                                                        0.0s
 => [internal] load metadata for docker.io/library/centos:8.4.2105                          0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => CACHED [1/7] FROM docker.io/library/centos:8.4.2105                                     0.0s
 => [internal] load build context                                                           0.9s
 => => transferring context: 79.45MB                                                        0.9s
 => [2/7] WORKDIR /usr/local                                                                0.0s
 => [3/7] RUN minorver=8.4.2105 && sed -e "s|^mirrorlist=|#mirrorlist=|g" -e "s|^#baseurl=  0.9s
 => [4/7] RUN yum install -y vim                                                           51.6s
 => [5/7] RUN yum install -y glibc.i686                                                    60.6s
 => [6/7] RUN mkdir /usr/local/java                                                         0.3s
 => [7/7] ADD jdk-8u461-linux-x64.tar.gz /usr/local/java/                                   1.4s
 => exporting to image                                                                      0.3s
 => => exporting layers                                                                     0.3s
 => => writing image sha256:a97d030fd858c6dcc4d413e0cd9755527a63a5158c53a8ce479174d427999a  0.0s
 => => naming to docker.io/library/java.centos                                              0.0s

测试

[root@docker porject 16:38:18]# docker run -it java.centos
##vim没有报错,说明已经安装了vim
[root@88285eb9bf12 local]# vim
##可以正常查看ip
[root@88285eb9bf12 local]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0@if55        UP             172.17.0.4/16
##查看java版本,说明java安装成功
[root@88285eb9bf12 local]# java -version
java version "1.8.0_461"
Java(TM) SE Runtime Environment (build 1.8.0_461-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.461-b11, mixed mode)
##pwd查看路径没问题,而且默认进入的路径为local
[root@88285eb9bf12 local]# pwd
/usr/local
[root@88285eb9bf12 local]#

export和import容器

docker save 和 docker export 对比:

docker save :将镜像保存为文件,save会保存该镜像的所有元数据和历史记录。

docker export :将容器导出为文件,文件会丢失所有元数据和历史记录,仅保存容器当时的状 态,再次导入会当作全新的镜像。

[root@docker ~ 10:10:44]# docker run -d --name httpd1 httpd
60aa85d4d68ff852feacd7439e2c6f7fe7dae9996b8d176a9eaf706497d328fe
[root@docker ~ 10:11:07]# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS     NAMES
60aa85d4d68f   httpd     "httpd-foreground"   3 seconds ago   Up 2 seconds   80/tcp    httpd1
[root@docker ~ 10:11:09]# docker export --help

Usage:  docker export [OPTIONS] CONTAINER

Export a container's filesystem as a tar archive

Aliases:
  docker container export, docker export

Options:
  -o, --output string   Write to a file, instead of STDOUT
##将容器导出为一个tar包
[root@docker ~ 10:11:24]# docker export httpd1 -o export_httpd
[root@docker ~ 10:12:07]# ls
allimages.tar    dirA        export_httpd  harbor-offline-installer-v2.9.1.tgz  httpd.tar   porject
anaconda-ks.cfg  Dockerfile  harbor        httpd                                index.html  ssh.centos
[root@docker ~ 10:12:39]# docker import --help

Usage:  docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Import the contents from a tarball to create a filesystem image

Aliases:
  docker image import, docker import

Options:
  -c, --change list       Apply Dockerfile instruction to the created image
  -m, --message string    Set commit message for imported image
      --platform string   Set platform if server is multi-platform capable
[root@docker ~ 10:12:53]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
ubuntu-with-stress   latest    0659db69e990   18 hours ago    139MB
httpd                latest    c194ed9b9e8f   3 days ago      117MB
ubuntu               latest    30ba44506a6d   2 weeks ago     100MB
busybox              latest    925ff61909ae   19 months ago   4.42MB
[root@docker ~ 10:13:02]# docker import export_httpd httpd_1:v1
sha256:8c6e0d5248b05c37dd3d03f2db2d999b47c30eef7ebaa592bad9faa7a9bb0521
[root@docker ~ 10:13:48]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
httpd_1              v1        8c6e0d5248b0   7 seconds ago   115MB
ubuntu-with-stress   latest    0659db69e990   18 hours ago    139MB
httpd                latest    c194ed9b9e8f   3 days ago      117MB
ubuntu               latest    30ba44506a6d   2 weeks ago     100MB
busybox              latest    925ff61909ae   19 months ago   4.42MB

更多推荐