docker构建镜像,RUN vs CMD vs ENTRYPOINT,dockerfile实操配置镜像案例
构建镜像
Docker 提供了两种构建镜像的方法:
- docker commit 命令
- Dockerfile 构建文件
docker commit
docker commit 命令是创建新镜像最直观的方法,其过程包含三个步骤:
- 运行容器
- 修改容器
- 将容器保存为新的镜像
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内容基础知识:
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
常用参数
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
简单来说
- RUN 经常用于安装软件包。
- CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。
- 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 有两种格式:
- Shell 格式:RUN
- 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 没有指定其他命令时运行。
- 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。
- 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。
CMD 有三种格式: - Exec 格式:CMD [“executable”,“param1”,“param2”] 这是 CMD 的推荐格式。
- CMD [“param1”,“param2”] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec
格式。 - 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 有两种格式:
- Exec 格式:ENTRYPOINT [“executable”, “param1”, “param2”] 这是 ENTRYPOINT 的推荐格式。
- 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
更多推荐

所有评论(0)