参考源

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

版本

本文章基于 Docker 20.10.11


简介

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 为例。

FROM scratch
ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20181204" 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 命令运行。

语法

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

参数

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

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

Error response from daemon: Unknown instruction: RUNCMD

查看构建记录

docker history

语法

docker history 镜像

CMD 与 ENTRYPOINT 区别

CMD 命令演示

编写 Dockerfile

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

构建镜像

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

运行镜像

[root@sail dockerfile]# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

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

追加 -l 命令

[root@sail dockerfile]# docker run cmdtest -l
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.
ERRO[0000] error waiting for container: context canceled

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

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

ENTRYPOINT 命令演示

编写 Dockerfile

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

构建镜像

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

运行镜像

[root@sail dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

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

追加 -l 命令

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

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

ENTRYPOINT追加的方式。

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

实战

创建包含vim命令的centos镜像

编写 Dockerfile

[root@sail dockerfile]# vim Dockerfile-centos-test
[root@sail dockerfile]# cat Dockerfile-centos-test
FROM centos MAINTAINER sail<yifansailing@163.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 81 CMD echo $MYPATH CMD echo "---end---" CMD ["/bin/bash"]

构建镜像

[root@sail dockerfile]# docker build -f Dockerfile-centos-test -t centos-test .
Sending build context to Docker daemon 5.632kB
Step 1/10 : FROM centos
---> 5d0da3dc9764
Step 2/10 : MAINTAINER sail<yifansailing@163.com>
---> Running in 8b7340768878
Removing intermediate container 8b7340768878
---> 9616888f3b10
Step 3/10 : ENV MYPATH /usr/local
---> Running in 2c73446a56ff
Removing intermediate container 2c73446a56ff
---> be89377d4c2c
Step 4/10 : WORKDIR $MYPATH
---> Running in db113c4f7cb2
Removing intermediate container db113c4f7cb2
---> fb41ece5d944
Step 5/10 : RUN yum -y install vim
---> Running in eccee60c0389
CentOS Linux 8 - AppStream 12 MB/s | 8.4 MB 00:00
CentOS Linux 8 - BaseOS 1.7 MB/s | 3.6 MB 00:02
CentOS Linux 8 - Extras 17 kB/s | 10 kB 00:00
Last metadata expiration check: 0:00:01 ago on Sat Dec 25 05:09:40 2021.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-16.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-16.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-16.el8 appstream 49 k
which x86_64 2.21-16.el8 baseos 49 k Transaction Summary
================================================================================
Install 5 Packages Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 582 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 1.2 MB/s | 49 kB 00:00
(3/5): vim-common-8.0.1763-16.el8.x86_64.rpm 40 MB/s | 6.3 MB 00:00
(4/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 7.1 MB/s | 1.4 MB 00:00
(5/5): which-2.21-16.el8.x86_64.rpm 252 kB/s | 49 kB 00:00
--------------------------------------------------------------------------------
Total 6.4 MB/s | 7.8 MB 00:01
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
CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-16.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-16.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-16.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 4/5
Verifying : which-2.21-16.el8.x86_64 5/5 Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
which-2.21-16.el8.x86_64 Complete!
Removing intermediate container eccee60c0389
---> 9f54f48660ac
Step 6/10 : RUN yum -y install net-tools
---> Running in 6caa7361b001
Last metadata expiration check: 0:00:08 ago on Sat Dec 25 05:09:40 2021.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k Transaction Summary
================================================================================
Install 1 Package Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 1.0 MB/s | 322 kB 00:00
--------------------------------------------------------------------------------
Total 449 kB/s | 322 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Installed:
net-tools-2.0-0.52.20160912git.el8.x86_64 Complete!
Removing intermediate container 6caa7361b001
---> a9431f90fd3f
Step 7/10 : EXPOSE 81
---> Running in ad67fa23940a
Removing intermediate container ad67fa23940a
---> b5bd21416741
Step 8/10 : CMD echo $MYPATH
---> Running in fb1d08538689
Removing intermediate container fb1d08538689
---> 5c5def0bbb85
Step 9/10 : CMD echo "---end---"
---> Running in a9d955b6b389
Removing intermediate container a9d955b6b389
---> ad95558eb658
Step 10/10 : CMD ["/bin/bash"]
---> Running in 190651202e7b
Removing intermediate container 190651202e7b
---> d58be7785771
Successfully built d58be7785771
Successfully tagged centos-test:latest

查看构建的镜像

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

查看本地镜像的构建记录

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

运行测试

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

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

自定义tomcat环境镜像

编写 Dockerfile

FROM centos

MAINTAINER sail<yifansailing@163.com>

COPY readme.txt /usr/local/readme.txt

ENV MYPATH /usr/local/

WORKDIR $MYPATH

ADD jdk-8u301-linux-x64.tar.gz $MYPATH

ADD apache-tomcat-9.0.55.tar.gz $MYPATH

RUN yum -y install vim

ENV JAVA_HOME $MYPATH/jdk1.8.0_301-amd64

ENV CLASSPATH $JAVA_HOME/lib/

ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.55

ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.55

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

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

构建镜像

[root@sail tomcat]# docker build -t tomcat-test .
Sending build context to Docker daemon 157.1MB
Step 1/15 : FROM centos
---> 5d0da3dc9764
Step 2/15 : MAINTAINER sail<yifansailing@163.com>
---> Using cache
---> 9616888f3b10
Step 3/15 : COPY readme.txt /usr/local/readme.txt
---> da792df641f8
Step 4/15 : ENV MYPATH /usr/local/
---> Running in e4a5b13decd7
Removing intermediate container e4a5b13decd7
---> 7b1e6970b4b3
Step 5/15 : WORKDIR $MYPATH
---> Running in 835dabd080dd
Removing intermediate container 835dabd080dd
---> 7be17b1556ee
Step 6/15 : ADD jdk-8u301-linux-x64.tar.gz $MYPATH
---> 480721043fda
Step 7/15 : ADD apache-tomcat-9.0.55.tar.gz $MYPATH
---> c7bfa13bfcd1
Step 8/15 : RUN yum -y install vim
---> Running in 85532523d784
CentOS Linux 8 - AppStream 9.0 MB/s | 8.4 MB 00:00
CentOS Linux 8 - BaseOS 5.6 MB/s | 3.6 MB 00:00
CentOS Linux 8 - Extras 20 kB/s | 10 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-16.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-16.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-16.el8 appstream 49 k
which x86_64 2.21-16.el8 baseos 49 k Transaction Summary
================================================================================
Install 5 Packages Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 973 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 726 kB/s | 49 kB 00:00
(3/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 10 MB/s | 1.4 MB 00:00
(4/5): which-2.21-16.el8.x86_64.rpm 901 kB/s | 49 kB 00:00
(5/5): vim-common-8.0.1763-16.el8.x86_64.rpm 27 MB/s | 6.3 MB 00:00
--------------------------------------------------------------------------------
Total 6.6 MB/s | 7.8 MB 00:01
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
CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-16.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-16.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-16.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 4/5
Verifying : which-2.21-16.el8.x86_64 5/5 Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
which-2.21-16.el8.x86_64 Complete!
Removing intermediate container 85532523d784
---> e091ece0364d
Step 9/15 : ENV JAVA_HOME $MYPATH/jdk1.8.0_301-amd64
---> Running in 473066cf57f4
Removing intermediate container 473066cf57f4
---> 0a8963a2c1ab
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/
---> Running in 78a2cb9b06cd
Removing intermediate container 78a2cb9b06cd
---> 3dd34a2857b4
Step 11/15 : ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.55
---> Running in 4ca540479e3d
Removing intermediate container 4ca540479e3d
---> fa38f4581510
Step 12/15 : ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.55
---> Running in 31dc5b38478c
Removing intermediate container 31dc5b38478c
---> 8ae919106bf6
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
---> Running in d3fe1f81fab7
Removing intermediate container d3fe1f81fab7
---> dd8b07b2adfd
Step 14/15 : EXPOSE 8080
---> Running in 1f1601f2dcc2
Removing intermediate container 1f1601f2dcc2
---> 9078648b7a2e
Step 15/15 : CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out
---> Running in 6a3b2aefaf44
Removing intermediate container 6a3b2aefaf44
---> 23a538c107a0
Successfully built 23a538c107a0
Successfully tagged tomcat-test:latest

查看镜像

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

启动镜像

[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
9d391e13efdc495206429dbdb0392180a7bd3a4750cbc1419c31c80cd69c6b7b
[root@sail tomcat]#

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

查看挂载目录

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

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

进入容器

[root@sail tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d391e13efdc tomcat-test "/bin/sh -c '$CATALI…" 24 minutes ago Up 24 minutes 0.0.0.0:8080->8080/tcp sail-tomcat
[root@sail tomcat]# docker exec -it 9d391e13efdc /bin/bash
[root@9d391e13efdc local]# ls
apache-tomcat-9.0.55 bin etc games include jdk1.8.0_301 lib lib64 libexec readme.txt sbin share src
[root@9d391e13efdc local]# cd apache-tomcat-9.0.55/
[root@9d391e13efdc apache-tomcat-9.0.55]# ls
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 文件夹查看日志内容。

[root@9d391e13efdc apache-tomcat-9.0.55]# cd logs
[root@9d391e13efdc logs]# ls
catalina.out
[root@9d391e13efdc logs]# cat catalina.out
/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 文件夹。

[root@9d391e13efdc logs]# exit
exit
[root@sail tomcat]# cd /home/sail/tomcat/logs
[root@sail logs]# ls
catalina.out
[root@sail logs]# cat catalina.out
/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 账号

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

发布镜像

docker push

直接发布镜像

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

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

指定镜像标签

docker tag

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

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

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

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

再次发布镜像

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

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

配置国内镜像站

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

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

运行以下命令即可:

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

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

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

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

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

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

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

拉取我们发布的镜像

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

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

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

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

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

启动拉取的镜像

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

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

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

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

创建实例

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

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

进入镜像仓库

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

创建命名空间

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

创建好后就是这样。

创建镜像仓库

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

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

退出登录的账号

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

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

登录阿里云账号

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

设置镜像标签

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

提交镜像

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

查看提交的镜像

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

拉取镜像

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

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

启动镜像

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

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

Docker 13 Dockerfile的更多相关文章

  1. docker 13 dockerfile的保留字指令

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

  2. docker:Dockerfile构建LNMP平台

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

  3. docker容器dockerfile详解

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

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

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

  5. docker之Dockerfile指令介绍

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

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

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

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

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

  8. (转)Docker 基础 : Dockerfile

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

  9. 【docker】Dockerfile

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

随机推荐

  1. Vue问题

    vue问题 #(1)vouter的addRoutes方法---用户权限 //自定义添加路由方法,防止重复添加路由 #使用后 路由结构 const user = () => import('../ ...

  2. 爷青回,canal 1.1.6来了,几个重要特性和bug修复

    刚刚在群里看到消息说,时隔一年,canal 1.1.6正式release了,赶紧上去看看有什么新特性. (居然才发布了6个小时,前排围观) 1.什么是canal canal [kə'næl],译意为水 ...

  3. 从零开始实现lmax-Disruptor队列(一)RingBuffer与单生产者、单消费者工作原理解析

    1.lmax-Disruptor队列介绍 disruptor是英国著名的金融交易所lmax旗下技术团队开发的一款java实现的高性能内存队列框架 其发明disruptor的主要目的是为了改进传统的内存 ...

  4. Java随谈(六)## 我们真的理解 Java 里的整型吗?

    我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...

  5. python+selenium 自动化测试——显式等待详解

    1.前言 之前有提到过等待函数,等待函数分为:强制等待(sleep).隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是 ...

  6. SAP Display picture

    program sap_picture_demo. set screen 200. TYPE-POOLS cndp. ***************************************** ...

  7. orcal恢复delete误删除的数据

    orcal的删除有3种:delete.truncate.drop. delete可以手动提交和回滚,且可以使用where:而truncate.drop执行即对表数据进行了修改,且不能使用where. ...

  8. VisionPro · C# · 加密狗检查程序

    写VisionPro C#项目时,我们需要在程序的启动时加载各种配置文件,以及检查软件授权,以下代码即检查康耐视加密狗在线状态,如查无加密狗,关闭程序启动进程并抛出异常. 1 using System ...

  9. C语言动态输出等腰三角形

    C语言动态输出等腰三角形 题目要求:输入行数 打印出对应行数的等腰三角形,要求使用for循环嵌套. 思路 while语句写外层死循环 用于判断输出的数据: 分析: 最外层for,来控制最外层行数,存储 ...

  10. react antd上拉加载与下拉刷新与虚拟列表使用

    创建项目 create-react-app antdReact 安装:antd-mobile.react-virtualized npm i antd-mobile -S npm i react-vi ...