简介

Dockerfile 是用来构建 Docker 镜像的文件,可以理解为命令参数脚本

Dockerfile 是面向开发的,想要打包项目,就要编写 Dockerfile 文件。

由于 Docker 的流行,Docker 镜像逐渐替代 jar 或者 war 成为企业的交付标准。

官方 Dockerfile

首先看一下官方的 Dockerfile。

这里以 centos 的镜像为例。

Docker Hub 搜索 centos 镜像,选择官方镜像。

点击 The CentOS Project

选择版本分支。这里以 CentOS-7.6.1810 为例。

查看 Dockerfile。

可以看出官方的 Dockerfile 是很简洁的,这就是 Docker 极致精简的原因。

不过,官方镜像都是基础包,很多功能是没有的,比如 centos 的官方镜像是没有 vim 命令的。

像这种基础命令比较常用,如果想要使用可以在容器内安装,但这样很不方便,因为每个新启动的容器都要安装。

我们通常会选择自己搭建镜像,这就要用到 Dockerfile 了。

命令

以上面的 centos 官方镜像的 Dockerfile 为例。

  1. FROM scratch
  2. ADD centos-7-docker.tar.xz /
  3. LABEL org.label-schema.schema-version="1.0" \
  4. org.label-schema.name="CentOS Base Image" \
  5. org.label-schema.vendor="CentOS" \
  6. org.label-schema.license="GPLv2" \
  7. org.label-schema.build-date="20181204"
  8. CMD ["/bin/bash"]

Docker Hub 中 99% 的镜像都是从 FROM scratch 开始的。

规则

  • 每个指令都必须是大写字母。

  • 按照从上到下顺序执行。

  • # 表示注释。

  • 每一条指令都会创建一个新的镜像层。

解释

  • FROM:基础镜像,比如 centos。
  • MAINTAINER:镜像是谁写的。建议以此格式:姓名<邮箱>
  • RUN:镜像构建时需要运行的命令。
  • ADD:添加,比如添加一个 tomcat 压缩包。
  • WORKDIR:镜像的工作目录。
  • VOLUME:挂载的目录。
  • EXPOSE:指定暴露端口,跟 -p 一个道理。
  • RUN:最终要运行的。
  • CMD:指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代。
  • ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令。
  • ONBUILD:当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令。
  • COPY:将文件拷贝到镜像中。
  • ENV:构建的时候设置环境变量。

构建镜像

docker build

Dockerfile 编写好后,需要使用 docker build 命令运行。

语法

  1. docker build [参数] 路径 | 网络地址 | -

参数

  • -f:指定要使用的Dockerfile路径。
  • -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • -m:设置内存最大值。

Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回报错信息。

  1. Error response from daemon: Unknown instruction: RUNCMD

查看构建记录

docker history

语法

  1. docker history 镜像

CMD 与 ENTRYPOINT 区别

CMD 命令演示

编写 Dockerfile

  1. [root@sail dockerfile]# vim Dockerfile-cmd-test
  2. [root@sail dockerfile]# cat Dockerfile-cmd-test
  3. FROM centos
  4. CMD ["ls","-a"]

构建镜像

  1. [root@sail dockerfile]# docker build -f Dockerfile-cmd-test -t cmdtest .
  2. Sending build context to Docker daemon 2.048kB
  3. Step 1/2 : FROM centos
  4. ---> 5d0da3dc9764
  5. Step 2/2 : CMD ["ls","-a"]
  6. ---> Running in 0a743e929fff
  7. Removing intermediate container 0a743e929fff
  8. ---> 1683c0790d49
  9. Successfully built 1683c0790d49
  10. Successfully tagged cmdtest:latest
  1. [root@sail dockerfile]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. cmdtest latest 1683c0790d49 13 minutes ago 231MB

运行镜像

  1. [root@sail dockerfile]# docker run cmdtest
  2. .
  3. ..
  4. .dockerenv
  5. bin
  6. dev
  7. etc
  8. home
  9. lib
  10. lib64
  11. lost+found
  12. media
  13. mnt
  14. opt
  15. proc
  16. root
  17. run
  18. sbin
  19. srv
  20. sys
  21. tmp
  22. usr
  23. var

此时 Dockerfile 中编写的命令生效了。

追加 -l 命令

  1. [root@sail dockerfile]# docker run cmdtest -l
  2. docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
  3. ERRO[0000] error waiting for container: context canceled

没有达到预期的 ls -al 命令。

CMD替换的方式, -l 不是命令,所以报错。

ENTRYPOINT 命令演示

编写 Dockerfile

  1. [root@sail dockerfile]# vim Dockerfile-entrypoint-test
  2. [root@sail dockerfile]# cat Dockerfile-entrypoint-test
  3. FROM centos
  4. ENTRYPOINT ["ls","-a"]

构建镜像

  1. [root@sail dockerfile]# docker build -f Dockerfile-entrypoint-test -t entrypoint-test .
  2. Sending build context to Docker daemon 3.072kB
  3. Step 1/2 : FROM centos
  4. ---> 5d0da3dc9764
  5. Step 2/2 : ENTRYPOINT ["ls","-a"]
  6. ---> Running in a02d55ae0a00
  7. Removing intermediate container a02d55ae0a00
  8. ---> 795973a0ed43
  9. Successfully built 795973a0ed43
  10. Successfully tagged entrypoint-test:latest
  1. [root@sail dockerfile]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. entrypoint-test latest 795973a0ed43 22 seconds ago 231MB

运行镜像

  1. [root@sail dockerfile]# docker run entrypoint-test
  2. .
  3. ..
  4. .dockerenv
  5. bin
  6. dev
  7. etc
  8. home
  9. lib
  10. lib64
  11. lost+found
  12. media
  13. mnt
  14. opt
  15. proc
  16. root
  17. run
  18. sbin
  19. srv
  20. sys
  21. tmp
  22. usr
  23. var

此时 Dockerfile 中编写的命令也生效了。

追加 -l 命令

  1. [root@sail dockerfile]# docker run entrypoint-test -l
  2. total 56
  3. drwxr-xr-x 1 root root 4096 Dec 23 06:46 .
  4. drwxr-xr-x 1 root root 4096 Dec 23 06:46 ..
  5. -rwxr-xr-x 1 root root 0 Dec 23 06:46 .dockerenv
  6. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  7. drwxr-xr-x 5 root root 340 Dec 23 06:46 dev
  8. drwxr-xr-x 1 root root 4096 Dec 23 06:46 etc
  9. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  10. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  11. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  12. drwx------ 2 root root 4096 Sep 15 14:17 lost+found
  13. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  14. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  15. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  16. dr-xr-xr-x 106 root root 0 Dec 23 06:46 proc
  17. dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
  18. drwxr-xr-x 11 root root 4096 Sep 15 14:17 run
  19. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  20. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  21. dr-xr-xr-x 13 root root 0 Oct 31 15:00 sys
  22. drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
  23. drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
  24. drwxr-xr-x 20 root root 4096 Sep 15 14:17 var

运行了预期的 ls -al 命令。

ENTRYPOINT追加的方式。

Docker 中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试。

实战

创建包含vim命令的centos镜像

编写 Dockerfile

  1. [root@sail dockerfile]# vim Dockerfile-centos-test
  2. [root@sail dockerfile]# cat Dockerfile-centos-test
  3. FROM centos
  4. MAINTAINER sail<yifansailing@163.com>
  5. ENV MYPATH /usr/local
  6. WORKDIR $MYPATH
  7. RUN yum -y install vim
  8. RUN yum -y install net-tools
  9. EXPOSE 81
  10. CMD echo $MYPATH
  11. CMD echo "---end---"
  12. CMD ["/bin/bash"]

构建镜像

  1. [root@sail dockerfile]# docker build -f Dockerfile-centos-test -t centos-test .
  2. Sending build context to Docker daemon 5.632kB
  3. Step 1/10 : FROM centos
  4. ---> 5d0da3dc9764
  5. Step 2/10 : MAINTAINER sail<yifansailing@163.com>
  6. ---> Running in 8b7340768878
  7. Removing intermediate container 8b7340768878
  8. ---> 9616888f3b10
  9. Step 3/10 : ENV MYPATH /usr/local
  10. ---> Running in 2c73446a56ff
  11. Removing intermediate container 2c73446a56ff
  12. ---> be89377d4c2c
  13. Step 4/10 : WORKDIR $MYPATH
  14. ---> Running in db113c4f7cb2
  15. Removing intermediate container db113c4f7cb2
  16. ---> fb41ece5d944
  17. Step 5/10 : RUN yum -y install vim
  18. ---> Running in eccee60c0389
  19. CentOS Linux 8 - AppStream 12 MB/s | 8.4 MB 00:00
  20. CentOS Linux 8 - BaseOS 1.7 MB/s | 3.6 MB 00:02
  21. CentOS Linux 8 - Extras 17 kB/s | 10 kB 00:00
  22. Last metadata expiration check: 0:00:01 ago on Sat Dec 25 05:09:40 2021.
  23. Dependencies resolved.
  24. ================================================================================
  25. Package Arch Version Repository Size
  26. ================================================================================
  27. Installing:
  28. vim-enhanced x86_64 2:8.0.1763-16.el8 appstream 1.4 M
  29. Installing dependencies:
  30. gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
  31. vim-common x86_64 2:8.0.1763-16.el8 appstream 6.3 M
  32. vim-filesystem noarch 2:8.0.1763-16.el8 appstream 49 k
  33. which x86_64 2.21-16.el8 baseos 49 k
  34. Transaction Summary
  35. ================================================================================
  36. Install 5 Packages
  37. Total download size: 7.8 M
  38. Installed size: 30 M
  39. Downloading Packages:
  40. (1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 582 kB/s | 39 kB 00:00
  41. (2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 1.2 MB/s | 49 kB 00:00
  42. (3/5): vim-common-8.0.1763-16.el8.x86_64.rpm 40 MB/s | 6.3 MB 00:00
  43. (4/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 7.1 MB/s | 1.4 MB 00:00
  44. (5/5): which-2.21-16.el8.x86_64.rpm 252 kB/s | 49 kB 00:00
  45. --------------------------------------------------------------------------------
  46. Total 6.4 MB/s | 7.8 MB 00:01
  47. warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
  48. CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
  49. Importing GPG key 0x8483C65D:
  50. Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
  51. Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
  52. From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
  53. Key imported successfully
  54. Running transaction check
  55. Transaction check succeeded.
  56. Running transaction test
  57. Transaction test succeeded.
  58. Running transaction
  59. Preparing : 1/1
  60. Installing : which-2.21-16.el8.x86_64 1/5
  61. Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 2/5
  62. Installing : vim-common-2:8.0.1763-16.el8.x86_64 3/5
  63. Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
  64. Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
  65. Installing : vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
  66. Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
  67. Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
  68. Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
  69. Verifying : vim-common-2:8.0.1763-16.el8.x86_64 2/5
  70. Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 3/5
  71. Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 4/5
  72. Verifying : which-2.21-16.el8.x86_64 5/5
  73. Installed:
  74. gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
  75. vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
  76. which-2.21-16.el8.x86_64
  77. Complete!
  78. Removing intermediate container eccee60c0389
  79. ---> 9f54f48660ac
  80. Step 6/10 : RUN yum -y install net-tools
  81. ---> Running in 6caa7361b001
  82. Last metadata expiration check: 0:00:08 ago on Sat Dec 25 05:09:40 2021.
  83. Dependencies resolved.
  84. ================================================================================
  85. Package Architecture Version Repository Size
  86. ================================================================================
  87. Installing:
  88. net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k
  89. Transaction Summary
  90. ================================================================================
  91. Install 1 Package
  92. Total download size: 322 k
  93. Installed size: 942 k
  94. Downloading Packages:
  95. net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 1.0 MB/s | 322 kB 00:00
  96. --------------------------------------------------------------------------------
  97. Total 449 kB/s | 322 kB 00:00
  98. Running transaction check
  99. Transaction check succeeded.
  100. Running transaction test
  101. Transaction test succeeded.
  102. Running transaction
  103. Preparing : 1/1
  104. Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
  105. Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
  106. Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
  107. Installed:
  108. net-tools-2.0-0.52.20160912git.el8.x86_64
  109. Complete!
  110. Removing intermediate container 6caa7361b001
  111. ---> a9431f90fd3f
  112. Step 7/10 : EXPOSE 81
  113. ---> Running in ad67fa23940a
  114. Removing intermediate container ad67fa23940a
  115. ---> b5bd21416741
  116. Step 8/10 : CMD echo $MYPATH
  117. ---> Running in fb1d08538689
  118. Removing intermediate container fb1d08538689
  119. ---> 5c5def0bbb85
  120. Step 9/10 : CMD echo "---end---"
  121. ---> Running in a9d955b6b389
  122. Removing intermediate container a9d955b6b389
  123. ---> ad95558eb658
  124. Step 10/10 : CMD ["/bin/bash"]
  125. ---> Running in 190651202e7b
  126. Removing intermediate container 190651202e7b
  127. ---> d58be7785771
  128. Successfully built d58be7785771
  129. Successfully tagged centos-test:latest

查看构建的镜像

  1. [root@sail dockerfile]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. centos-test latest d58be7785771 About a minute ago 323MB

查看本地镜像的构建记录

  1. [root@sail dockerfile]# docker history centos-test
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. d58be7785771 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  4. ad95558eb658 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  5. 5c5def0bbb85 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  6. b5bd21416741 5 minutes ago /bin/sh -c #(nop) EXPOSE 81 0B
  7. a9431f90fd3f 5 minutes ago /bin/sh -c yum -y install net-tools 27.3MB
  8. 9f54f48660ac 5 minutes ago /bin/sh -c yum -y install vim 64.8MB
  9. fb41ece5d944 5 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
  10. be89377d4c2c 5 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
  11. 9616888f3b10 5 minutes ago /bin/sh -c #(nop) MAINTAINER sail<yifansail… 0B
  12. 5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  13. <missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  14. <missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB

运行测试

  1. [root@sail ~]# docker run -it centos-test
  2. [root@530551bc2162 local]# pwd
  3. /usr/local
  4. [root@530551bc2162 local]# vim test.java
  5. [root@530551bc2162 local]#

默认的工作目录正是 Dockerfile 中设置的 /usr/local ,且可以使用 vim 命令了。

自定义tomcat环境镜像

编写 Dockerfile

  1. FROM centos
  2. MAINTAINER sail<yifansailing@163.com>
  3. COPY readme.txt /usr/local/readme.txt
  4. ENV MYPATH /usr/local/
  5. WORKDIR $MYPATH
  6. ADD jdk-8u301-linux-x64.tar.gz $MYPATH
  7. ADD apache-tomcat-9.0.55.tar.gz $MYPATH
  8. RUN yum -y install vim
  9. ENV JAVA_HOME $MYPATH/jdk1.8.0_301-amd64
  10. ENV CLASSPATH $JAVA_HOME/lib/
  11. ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.55
  12. ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.55
  13. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
  14. EXPOSE 8080
  15. CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

其中的 readme.txt 一般作为镜像说明文件,可以在里面编写镜像的信息。

构建镜像

  1. [root@sail tomcat]# docker build -t tomcat-test .
  2. Sending build context to Docker daemon 157.1MB
  3. Step 1/15 : FROM centos
  4. ---> 5d0da3dc9764
  5. Step 2/15 : MAINTAINER sail<yifansailing@163.com>
  6. ---> Using cache
  7. ---> 9616888f3b10
  8. Step 3/15 : COPY readme.txt /usr/local/readme.txt
  9. ---> da792df641f8
  10. Step 4/15 : ENV MYPATH /usr/local/
  11. ---> Running in e4a5b13decd7
  12. Removing intermediate container e4a5b13decd7
  13. ---> 7b1e6970b4b3
  14. Step 5/15 : WORKDIR $MYPATH
  15. ---> Running in 835dabd080dd
  16. Removing intermediate container 835dabd080dd
  17. ---> 7be17b1556ee
  18. Step 6/15 : ADD jdk-8u301-linux-x64.tar.gz $MYPATH
  19. ---> 480721043fda
  20. Step 7/15 : ADD apache-tomcat-9.0.55.tar.gz $MYPATH
  21. ---> c7bfa13bfcd1
  22. Step 8/15 : RUN yum -y install vim
  23. ---> Running in 85532523d784
  24. CentOS Linux 8 - AppStream 9.0 MB/s | 8.4 MB 00:00
  25. CentOS Linux 8 - BaseOS 5.6 MB/s | 3.6 MB 00:00
  26. CentOS Linux 8 - Extras 20 kB/s | 10 kB 00:00
  27. Dependencies resolved.
  28. ================================================================================
  29. Package Arch Version Repository Size
  30. ================================================================================
  31. Installing:
  32. vim-enhanced x86_64 2:8.0.1763-16.el8 appstream 1.4 M
  33. Installing dependencies:
  34. gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
  35. vim-common x86_64 2:8.0.1763-16.el8 appstream 6.3 M
  36. vim-filesystem noarch 2:8.0.1763-16.el8 appstream 49 k
  37. which x86_64 2.21-16.el8 baseos 49 k
  38. Transaction Summary
  39. ================================================================================
  40. Install 5 Packages
  41. Total download size: 7.8 M
  42. Installed size: 30 M
  43. Downloading Packages:
  44. (1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 973 kB/s | 39 kB 00:00
  45. (2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 726 kB/s | 49 kB 00:00
  46. (3/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 10 MB/s | 1.4 MB 00:00
  47. (4/5): which-2.21-16.el8.x86_64.rpm 901 kB/s | 49 kB 00:00
  48. (5/5): vim-common-8.0.1763-16.el8.x86_64.rpm 27 MB/s | 6.3 MB 00:00
  49. --------------------------------------------------------------------------------
  50. Total 6.6 MB/s | 7.8 MB 00:01
  51. warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
  52. CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
  53. Importing GPG key 0x8483C65D:
  54. Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
  55. Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
  56. From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
  57. Key imported successfully
  58. Running transaction check
  59. Transaction check succeeded.
  60. Running transaction test
  61. Transaction test succeeded.
  62. Running transaction
  63. Preparing : 1/1
  64. Installing : which-2.21-16.el8.x86_64 1/5
  65. Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 2/5
  66. Installing : vim-common-2:8.0.1763-16.el8.x86_64 3/5
  67. Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
  68. Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
  69. Installing : vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
  70. Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
  71. Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
  72. Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
  73. Verifying : vim-common-2:8.0.1763-16.el8.x86_64 2/5
  74. Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 3/5
  75. Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 4/5
  76. Verifying : which-2.21-16.el8.x86_64 5/5
  77. Installed:
  78. gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
  79. vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
  80. which-2.21-16.el8.x86_64
  81. Complete!
  82. Removing intermediate container 85532523d784
  83. ---> e091ece0364d
  84. Step 9/15 : ENV JAVA_HOME $MYPATH/jdk1.8.0_301-amd64
  85. ---> Running in 473066cf57f4
  86. Removing intermediate container 473066cf57f4
  87. ---> 0a8963a2c1ab
  88. Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/
  89. ---> Running in 78a2cb9b06cd
  90. Removing intermediate container 78a2cb9b06cd
  91. ---> 3dd34a2857b4
  92. Step 11/15 : ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.55
  93. ---> Running in 4ca540479e3d
  94. Removing intermediate container 4ca540479e3d
  95. ---> fa38f4581510
  96. Step 12/15 : ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.55
  97. ---> Running in 31dc5b38478c
  98. Removing intermediate container 31dc5b38478c
  99. ---> 8ae919106bf6
  100. Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
  101. ---> Running in d3fe1f81fab7
  102. Removing intermediate container d3fe1f81fab7
  103. ---> dd8b07b2adfd
  104. Step 14/15 : EXPOSE 8080
  105. ---> Running in 1f1601f2dcc2
  106. Removing intermediate container 1f1601f2dcc2
  107. ---> 9078648b7a2e
  108. Step 15/15 : CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out
  109. ---> Running in 6a3b2aefaf44
  110. Removing intermediate container 6a3b2aefaf44
  111. ---> 23a538c107a0
  112. Successfully built 23a538c107a0
  113. Successfully tagged tomcat-test:latest

查看镜像

  1. [root@sail tomcat]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. tomcat-test latest 23a538c107a0 25 minutes ago 673MB

启动镜像

  1. [root@sail tomcat]# docker run -d -p 8080:8080 --name sail-tomcat -v /home/sail/tomcat/webapps:/usr/local/apache-tomcat-9.0.55/webapps -v /home/sail/tomcat/logs:/usr/local/apache-tomcat-9.0.55/logs tomcat-test
  2. 9d391e13efdc495206429dbdb0392180a7bd3a4750cbc1419c31c80cd69c6b7b
  3. [root@sail tomcat]#

启动时将 tomcat 的 webappslogs 目录都挂载到了本机。

查看挂载目录

  1. [root@sail tomcat]# ls /home/sail/tomcat
  2. logs webapps

这里找到了挂载到本机的两个目录,说明挂载成功了。

进入容器

  1. [root@sail tomcat]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 9d391e13efdc tomcat-test "/bin/sh -c '$CATALI…" 24 minutes ago Up 24 minutes 0.0.0.0:8080->8080/tcp sail-tomcat
  1. [root@sail tomcat]# docker exec -it 9d391e13efdc /bin/bash
  2. [root@9d391e13efdc local]# ls
  3. apache-tomcat-9.0.55 bin etc games include jdk1.8.0_301 lib lib64 libexec readme.txt sbin share src
  1. [root@9d391e13efdc local]# cd apache-tomcat-9.0.55/
  2. [root@9d391e13efdc apache-tomcat-9.0.55]# ls
  3. BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs temp webapps work

jdk 和 readme.txt 都是具备了的,且 tomcat 目录下的文件也是完整的。

查看挂载文件

这里以 logs 为例,我们先进入 tomcat 容器中的 logs 文件夹查看日志内容。

  1. [root@9d391e13efdc apache-tomcat-9.0.55]# cd logs
  2. [root@9d391e13efdc logs]# ls
  3. catalina.out
  4. [root@9d391e13efdc logs]# cat catalina.out
  5. /usr/local//apache-tomcat-9.0.55/bin/catalina.sh: line 504: /usr/local//jdk1.8.0_301-amd64/bin/java: No such file or directory

然后再退出查看主机上挂载的 logs 文件夹。

  1. [root@9d391e13efdc logs]# exit
  2. exit
  3. [root@sail tomcat]# cd /home/sail/tomcat/logs
  4. [root@sail logs]# ls
  5. catalina.out
  6. [root@sail logs]# cat catalina.out
  7. /usr/local//apache-tomcat-9.0.55/bin/catalina.sh: line 504: /usr/local//jdk1.8.0_301-amd64/bin/java: No such file or directory

两个地方 logs 下的文件内容一致,说明挂载成功。

发布镜像到 Docker Hub

注册账号

如果没有 Docker Hub 账号,先注册账号:https://hub.docker.com/

登录 Docker Hub 账号

  1. [root@sail logs]# docker login -u asailing
  2. Password:
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded

发布镜像

docker push

直接发布镜像

  1. [root@sail logs]# docker push centos-test
  2. Using default tag: latest
  3. The push refers to repository [docker.io/library/centos-test]
  4. de70c523870b: Preparing
  5. 909db45c4bc4: Preparing
  6. 74ddd0ec08fa: Preparing
  7. denied: requested access to the resource is denied

访问资源被拒绝了。拒绝的原因是我们没有带标签,默认的 latest 标签是不能被识别的。

指定镜像标签

docker tag

我们可以使用 docker tag 命令给镜像加一个标签。

必须以 账号名/镜像名:标签 的格式命令才能提交。

  1. [root@sail logs]# docker tag d58be7785771 asailing/centos:1.0
  2. [root@sail logs]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. asailing/centos 1.0 d58be7785771 29 hours ago 323MB
  5. centos-test latest d58be7785771 29 hours ago 323MB

此时会多出一个相同 ID 但是标签和名字不同的镜像。

再次发布镜像

  1. [root@sail logs]# docker push asailing/centos:1.0
  2. The push refers to repository [docker.io/asailing/centos]
  3. de70c523870b: Pushed
  4. 909db45c4bc4: Pushed
  5. 74ddd0ec08fa: Pushed
  6. 1.0: digest: sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1 size: 953

这样就能发布成功了。且可以发现,镜像的发布也是分层发布的

配置国内镜像站

由于对国外网络的限制,发布镜像到 DockerHub 是比较缓慢的。

这里可以使用配置 Docker 国内镜像站的方式实现加速。

运行以下命令即可:

  1. [root@sail ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
  2. docker version >= 1.12
  3. {
  4. "registry-mirrors": ["http://f1361db2.m.daocloud.io"]
  5. }
  6. Success.
  7. You need to restart docker to take effect: sudo systemctl restart docker
  1. [root@sail ~]# systemctl restart docker
  2. [root@sail ~]#

该脚本可以将 --registry-mirror 加入到 Docker 配置文件 /etc/docker/daemon.json 中。

适用于 Ubuntu14.04DebianCentOS6CentOS7FedoraArch LinuxopenSUSE Leap 42.1,其他版本可能有细微不同。

去 Docker Hub 上以 账号名/镜像名 搜索我们刚发布的镜像,发现是可以搜索到的。

查看详情也可以镜像的具体信息。

DIGEST 的值正是刚才发布后返回值 ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1 的缩写。

且镜像的大小是小于我们本地镜像的,说明发布的过程中也会压缩镜像

拉取我们发布的镜像

  1. [root@sail logs]# docker pull asailing/centos:1.0
  2. 1.0: Pulling from asailing/centos
  3. Digest: sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  4. Status: Image is up to date for asailing/centos:1.0
  5. docker.io/asailing/centos:1.0

无法拉取。原因很简单,因为我们本地存在了同名镜像。

我们先删除这个镜像再拉取

  1. [root@sail logs]# docker rmi -f d58be7785771
  2. Untagged: asailing/centos:1.0
  3. Untagged: asailing/centos@sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  4. Untagged: centos-test:latest
  5. Untagged: sail/centos:1.0
  6. Deleted: sha256:d58be7785771bd95d8016fa5807a486d6c50e195879eddd88cb602172fc51ffe
  7. Deleted: sha256:ad95558eb65801f5871215837558156c5e33ba351b3b52e0a50aac045abb46c1
  8. Deleted: sha256:5c5def0bbb85d8779d02f115c3d072fe9adb1fd07556ee8c5a130823ecf6811d
  9. Deleted: sha256:b5bd21416741daec348f417dbea1b73001e257f1e63a5d2abddabc8554fca611
  10. Deleted: sha256:a9431f90fd3f23387c456ad5b925dbb9531beece3eab825848db99db29c6a1fa
  11. Deleted: sha256:9f54f48660acb350921aefab74769e51fc7917a1e1e730d3df2edd1513517c42
  12. Deleted: sha256:fb41ece5d944c667762945fdf7275a1d267acd92fe9dc56709fc3adaca6f087f
  13. Deleted: sha256:be89377d4c2ccea11308d8196ba53f03985882db015e01ed8b54fc114f4ba058
  14. Deleted: sha256:9616888f3b103230ed5f378af4afc11b7ce7ed3d96653e5bd918c49152bbdf8c
  1. [root@sail logs]# docker pull asailing/centos:1.0
  2. 1.0: Pulling from asailing/centos
  3. a1d0c7532777: Already exists
  4. 0594d57f8468: Already exists
  5. 9c13f720f33e: Already exists
  6. Digest: sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  7. Status: Downloaded newer image for asailing/centos:1.0
  8. docker.io/asailing/centos:1.0
  1. [root@sail logs]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. asailing/centos 1.0 d58be7785771 29 hours ago 323MB

拉取成功,且大小又恢复到了之前本地的镜像大小,说明拉取的过程中也会解压镜像

启动拉取的镜像

  1. [root@sail logs]# docker run -it asailing/centos:1.0 /bin/bash
  2. [root@168c9e550886 local]# vim test.java
  3. [root@168c9e550886 local]#

vim 命令也是可以使用的,镜像发布成功。

发布镜像到阿里云镜像仓库

登录阿里云,点击我的阿里云

创建实例

这里以创建个人版实例为例。

我这里已经创建好了,如果没有创建点击创建即可。

进入镜像仓库

创建好个人实例后,点击进入。

创建命名空间

一个账号只能创建 3 个命名空间,需要谨慎创建。

创建好后就是这样。

创建镜像仓库

点击下一步,创建本地仓库

至此,我们就创建好了阿里云的镜像仓库,具体的操作步骤上图也写得非常清楚。

退出登录的账号

如果之前登录了 Docker Hub 账号或者其他阿里云账号,先退出账号。

  1. [root@sail logs]# docker logout
  2. Removing login credentials for https://index.docker.io/v1/

登录阿里云账号

  1. [root@sail logs]# docker login --username=内有千丘外无锋 registry.cn-hangzhou.aliyuncs.com
  2. Password:
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded

设置镜像标签

  1. [root@sail logs]# docker tag d58be7785771 registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  2. [root@sail logs]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. asailing/centos 1.0 d58be7785771 32 hours ago 323MB
  5. registry.cn-hangzhou.aliyuncs.com/asailing/sail 1.0 d58be7785771 32 hours ago 323MB

提交镜像

  1. [root@sail logs]# docker push registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  2. The push refers to repository [registry.cn-hangzhou.aliyuncs.com/asailing/sail]
  3. de70c523870b: Pushed
  4. 909db45c4bc4: Pushed
  5. 74ddd0ec08fa: Pushed
  6. 1.0: digest: sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1 size: 953

查看提交的镜像

提交的镜像可以在这里查看。

拉取镜像

先删除本地镜像, 再拉取测试。

  1. [root@sail logs]# docker rmi -f d58be7785771
  2. Untagged: asailing/centos:1.0
  3. Untagged: asailing/centos@sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  4. Untagged: registry.cn-hangzhou.aliyuncs.com/asailing/sail/centos:1.0
  5. Untagged: registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  6. Untagged: registry.cn-hangzhou.aliyuncs.com/asailing/sail@sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  7. Deleted: sha256:d58be7785771bd95d8016fa5807a486d6c50e195879eddd88cb602172fc51ffe
  1. [root@sail logs]# docker pull registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  2. 1.0: Pulling from asailing/sail
  3. a1d0c7532777: Already exists
  4. 0594d57f8468: Already exists
  5. 9c13f720f33e: Already exists
  6. Digest: sha256:ecefaae6c5a2cab84693175ea3b18d0d0a7aa0160e33a0bf3eb4ab626b10f0f1
  7. Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  8. registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  1. [root@sail logs]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. registry.cn-hangzhou.aliyuncs.com/asailing/sail 1.0 d58be7785771 32 hours ago 323MB

启动镜像

  1. [root@sail logs]# docker run -it registry.cn-hangzhou.aliyuncs.com/asailing/sail:1.0
  2. [root@c612099a94a2 local]# vim test.java
  3. [root@c612099a94a2 local]#

vim 命令可以使用,说明提交镜像成功。


参考

https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0

https://www.bilibili.com/video/BV1kv411q7Qc?spm_id_from=333.999.0.0

版本

CentOS 7.6

Docker 20.10.11

Docker 12 Dockerfile的更多相关文章

  1. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

  2. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  3. docker:Dockerfile构建LNMP平台

    docker:Dockerfile构建LNMP平台   1.dockerfile介绍  Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...

  4. docker容器dockerfile详解

    docker公司在容器技术发展中提出了镜像分层的理念,可以说也是这个革命性的理念让原本只不过是整合linux内核特性的容器,开始野蛮生长. docker通过UnionFS联合文件系统将镜像的分层实现合 ...

  5. Docker 13 Dockerfile

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  6. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  7. Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?

    老生常谈,再再再……普及一下: Docker:最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker. Dockerfile: ...

  8. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  9. (转)Docker 基础 : Dockerfile

    全文来自 Docker 基础 : Dockerfile Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像.我们会先介绍 Dockerfile 的 ...

  10. 【docker】Dockerfile

    [docker]Dockerfile 转载: ============================================================= =============== ...

随机推荐

  1. Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分

    什么是GTH GTH 是Xilinx UltraScale系列FPGA上高速收发器的一种类型,本质上和其它名称如GTP, GTX等只是器件类型不同.速率有差异:GTH 最低速率在500Mbps,最高在 ...

  2. 【Azure 环境】使用az login登录遇见OSError: [WinError -2146893813] : '' 错误

    问题描述 使用 az login指令登录,遇见 OS Error: [WinError -2146893813] : '', 在指令中添加 --debug后,输出的错误消息为: urllib3.con ...

  3. C++ //常用算法 adjacent_find //查找相邻的重复元素

    1 //常用算法 adjacent_find 2 //查找相邻的重复元素 3 #include<iostream> 4 #include<string> 5 #include& ...

  4. 上来就对标 20k Star 的开源项目,是自不量力还是后起之秀?

    先来一段紧箍咒:nvm.fvm.gvm.sdkman.fnm.n.g.rvm.jenv.phpbrew.rustup.swiftenv.pyenv.rbenv... 这些都是用来解决编程语言多版本管理 ...

  5. 如何避免MYSQL主从延迟带来的读写问题?

    在MYSQL 部署架构选型上,许多公司都会用到主从读写分离的架构,如下是一个一主一从的架构,主库master负责写入,从库slave进行读取. 但是既然是读写分离,必然会面临这样一个问题,当在主库上进 ...

  6. XAF新手入门 - 数据字典示例

    前言 通过前面文章的介绍,大家应该对模块与类型信息子系统有所了解,再通过一个示例来加深大家对它的理解. 在准备写这个系列文章之前,就准备是概念+示例的组合,这样大家对概念的理解会更深刻.之前的规划是在 ...

  7. .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件

    .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件 .vscode/extensions.json { "recommendati ...

  8. vue 可选链 功能 ?. 替代 res && res.status 可以变成 res?.status

    安装 cnpm install --save-dev @babel/plugin-proposal-optional-chaining .babelrc { "presets": ...

  9. 关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径

    SQL Server 2008版本之后的新类型HierarchyID 不知道大家有没有了解, 该类型作为取代id, parentid的一种解决方案,让人非常惊喜. 官方给的案例浅显易懂,但是没有实现我 ...

  10. auto推导类型注意

    auto推导类型忽略顶层const,不忽略底层const. 顶层const:指针或引用本身是const不可变,也就是指针指向的内存地址不可变,但指向的内存内容可变. 底层const:指针指向的内存地址 ...