系列文章目录
容器学习Day01-初识容器
容器学习Day02-VMware Workstation安装Ubuntu
容器学习Day03-Ubuntu常用命令(一)
容器学习Day04-Ubuntu常用命令(二)
容器学习Day05-Ubuntu常用命令(三)
容器学习Day06-Ubuntu常用命令(四)
容器学习Day07-Docker基础(一)
容器学习Day08-Docker基础(二)
容器学习Day09-理解容器镜像
容器学习Day10-搭建私有镜像仓库
容器学习Day11-docker commit构建容器镜像
容器学习Day12-使用Dockerfile构建容器镜像
容器学习Day13-Docker容器网络
容器学习Day14-Docker容器存储
容器学习Day15-Docker容器底层实现技术
容器学习Day16-Docker Compose容器编排
文章目录
前言
一、什么是 Dockerfile ?
二、Dockerfile 基本结构
三、Dockerfile 常用指令
四、构建镜像
1、docker build 命令
2、基于OS基础镜像构建
3、基于厂商提供的基础镜像构建
总结
前言
前面了解了使用 docker commit 命令构建自己的容器镜像,今天主要是了解 Dockerfile 的具体使用方法。
一、什么是 Dockerfile ?
Linux 环境下的程序员都应该使用过 GNU make 来构建和管理自己的工程,使用 make 工具能够比较方便地构建一个属于自己的工程,整个工程只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要投入一些时间去完成一个称为 Makefile 文件的编写。
Makefile 文件描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。其中包括:工程中哪些源文件需要编译以及如何编译,需要创建哪些库文件以及如何创建这些库文件,如何最后产生我们想要的可执行文件。
Docker 提供了和 Makefile 一样的机制来管理镜像,这就是 Dockerfile。Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。 Dockerfile 是一个文本文档,其中包含了用户创建镜像的所有命令和说明。
二、Dockerfile 基本结构
Dockerfile 是一组文件指令集,描述如何创建 Docker 镜像。文件中的指令执行后,会创建一个个新的镜像层,为了减少分层和镜像大小,应尽可能将多条指令合并成一条指令。Dockerfile 文件一般包含四部分内容,基础镜像、维护者信息、镜像操作指令、容器启动时执行的指令,以"#"作为注释符。
Dockerfile 指令不区分大小写,但通常会把指令写成大写,以便与参数进行区分。Docker 按照从上到下的顺序执行 Dockerfile 中的指令,Dockerfile 文件开头的第一个指令往往都是 FROM 指令,FROM 指令之前也可能有解析器指令、注释、全局的 ARG 变量。Dockerfile 全程无交互,所以整个镜像构建过程要保证命令集能一直持续不断执行下去。
三、Dockerfile 常用指令
- FROM
FROM 指令用于指定基础镜像,镜像可以是任意可用的镜像,建议使用官方的镜像,这样比较安全。如果本地没有指定的镜像,则会自动从 Docker 的公共镜像仓库拉取镜像下来。同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令。
格式:
FROM image FROM image:tag
示例:
FROM httpd
FROM httpd:2.4.54
- LABEL
LABEL 指令用于定义镜像的元数据,如镜像版本、作者信息等。一条 LABEL 指令可以指定一条或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条 LABEL 指令指定,以免生成过多的中间镜像。MAINTAINER 指令也可以指定维护者信息,已过时,用 LABEL 指令替代。
格式:
LABEL <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="web服务器"
- WORKDIR
WORKDIR 指令用于指定工作目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内的默认目录。
格式:
WORKDIR path
示例:
WORKDIR /usr/local/apache2
- RUN
RUN 指令用于指定构建镜像时执行的命令,一个文件中可以包含多个 RUN 指令,如果要运行多条命令可以用 && 连接,每一个 RUN 指令都会建立一层,所以尽可能合并成一条指令,命令较长的时候可以使用 \ 来换行。
格式:
RUN <command> ( shell 形式,命令在 shell 中运行,在 linux 默认是 /bin/sh -c,在 Windows 默认是 cmd /S /C ) RUN ["executable", "param1", "param2"] ( exec 形式,executable是命令,param是参数 )
示例:
RUN yum install -y nginx
RUN ["yum", "install", "-y", "nginx"]
理解shell form和exec form
- ENV
ENV 指令用于指定环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
格式:
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
示例:
ENV MYPATH /usr/local
ENV HTTPD_PREFIX=/usr/local/apache2
- COPY
COPY 指令用于复制本地主机文件或目录到镜像中。COPY 指令从 <src> 复制新文件或目录,并将它们添加到镜像的文件系统中的 <dest> 路径。可以指定多个 <src> 资源,但它们必须相对于正在构建的源目录(构建的上下文)。每个 <src> 可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成。
格式:
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例:
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY --chown=55:mygroup files* /somedir/
- ADD
ADD 指令用于复制本地主机文件或目录到镜像中,功能和 COPY 类似,可以认为是增强版的COPY。除了复制文件和目录,ADD 指令还可以访问网络 URL,类似 wget 。如果 <src> 是常用压缩格式(identity、gzip、bzip2或xz)的本地 tar 归档文件,将会解压成目录,类似执行 tar -x ,如果是 URL 远端的,则不会被解压。
格式:
ADD [--chown=<user>:<group>] [--checksum=<checksum>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例: ADD hom* /mydir/
ADD http://example.com/foobar /
ADD jdk-8u301-linux-x64.tar.gz /usr/java/jdk/
- USER
USER 指令用于指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户,当服务不需要管理员权限时,可以通过该命令指定运行用户,这个用户必须是事先建立好的,否则无法切换。
格式:
USER <user>[:<group>] USER <UID>[:<GID>]
示例:
USER mysql
USER 1001
- EXPOSE
EXPOSE 指令用于指定 Docker 服务器需要映射的端口,供容器外部连接使用。可以指定使用 TCP 或 UDP 协议,默认是 TCP 协议。EXPOSE 指令不是真的发布这个端口,它其实是作为在构建镜像的人和使用容器的人之间的一个文档。在启动容器的使用使用 -P,Docker会自动分配一个端口和转发指定的端口,使用 -p 可以具体指定使用哪个本地的端口来映射对外开放的端口。
格式:
EXPOSE <port> [<port>/<protocol>...]
示例:
EXPOSE 80
EXPOSE 123/udp
- VOLUME
VOLUME 指令用于定义匿名数据卷,可以将宿主机上的目录挂载至 VOLUME 指令指定的容器目录,即使容器后期删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。在启动容器时不挂载数据卷,会自动挂载到匿名卷。
格式:
VOLUME path VOLUME ["path"]
示例:
VOLUME /data
VOLUME ["/data","/data2"]
- CMD
CMD 指令用于指定容器启动时需要运行的命令。每个 Dockerfile 只能有一条 CMD 命令,如果指定了多条,只有最后一条被执行。如果用户启动容器时指定了运行的命令,则会覆盖 CMD 指定的命令。
格式:
CMD ["executable","param1","param2"](exec形式,推荐方式) CMD command param1 param2(shell形式) CMD ["param1","param2"](为 ENTRYPOINT 指令指定的程序提供默认参数)
示例:
CMD ["ping", "localhost"]
CMD ping localhost
理解shell form和exec form
- ENTRYPOINT
ENTRYPOINT 指令功能类似于 CMD 指令,用于配置容器启动后执行的命令及参数。不同的是 ENTRYPOINT 指令不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。同样,Dockerfile 中如果存在多个 ENTRYPOINT 指令,只有最后一个生效。
格式:
ENTRYPOINT ["executable", "param1", "param2"](exec形式,推荐方式) ENTRYPOINT command param1 param2(shell形式)
示例:
ENTRYPOINT ["ping", "localhost"]
ENTRYPOINT ping localhost
理解shell form和exec form
- ARG
ARG 指令定义了一个变量,用户可以在构建时使用,效果同docker build --build-arg一样,可以在构建时设定参数,这个参数只会在构建时存在,与 ENV 类似,不同的是 ENV 不会在镜像构建后消失,而 ARG 会消失无效。ARG 是唯一可以在 FROM 前使用的指令,一个 Dockerfile 中可以包括多个 ARG 指令。
格式:
ARG <name>[=<default value>]
示例:
ARG user1
ARG CODE_VERSION=latest
- ONBUILD
ONBUILD 指令将一条触发器指令添加到镜像中,后面跟的是其它指令,比如 RUN、COPY 等。这些指令,在当前镜像构建时并不会被执行。只有当前镜像作为基础镜像,去构建下一级镜像的时候才会被执行。
格式:
ONBUILD <INSTRUCTION>
示例:
ONBUILD RUN yum install -y vim
四、构建镜像
了解了 Dockerfile 的基本用法,如何来构建一个镜像呢?
1、docker build 命令
在 docker 客户端命令行中我们可以通过 docker build 命令使用 Dockerfile 文件来创建镜像。如果构建镜像时没有明确指定 Dockerfile,那么 Docker 客户端默认在构建镜像时指定的上下文路径下找名字为 Dockerfile 的构建文件,Dockerfile 可以不在构建上下文路径下,此时需要构建时通过 -f 参数明确指定使用哪个构建文件,并且名称可以自己任意命名。
格式:
docker build [OPTIONS] PATH | URL | -
常用参数:
-f :指定要使用的Dockerfile路径。
-t :镜像的名字及标签,通常 name:tag 或者 name 格式。
示例:
docker build -t httpd:v1 .
docker build -f /path/to/a/Dockerfile .
一个典型的 docker build 构建镜像的流程大概分为如下三步:
1)执行 " docker build -t <imageName:imageTag> . ",注意命令中有一个点号 "." 在 Linux 中表示当前目录,就是这次build的上下文 build context。
2)Docker 客户端会将构建命令后面指定的路径 "." 下的所有文件打包成一个 tar 包,发送给 Docker 服务端。
3)Docker 服务端收到客户端发送的 tar 包进行解压,根据 Dockerfile 里面的指令进行镜像的分层构建。
2、基于OS基础镜像构建
前一天的学习中使用 docker commit 制作了 httpd 的镜像,这里把当时的步骤一步步对应到 Dockerfile 中,配置文件和证书使用之前配置好的即可,目录结构如下:
root@docker:/docker/app# pwd
/docker/app
root@docker:/docker/app# ls
Dockerfile certs conf logs myapp
Dockerfile示例:
FROM centos LABEL version="3.0" description="apache with ssl" WORKDIR /etc/httpd RUN rm -rf /etc/yum.repos.d/CentOS-Linux-* \ && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo \ && yum makecache \ && yum install -y httpd mod_ssl \ && mkdir -p conf/certs COPY certs/* conf/certs/ COPY conf/ssl.conf conf.d/ COPY conf/httpdstart /usr/local/bin/ CMD ["sh","httpdstart"]
使用 docker build 命令构建镜像,并运行容器测试。
###使用docker build构建镜像,之前已经生成过v1和v2版本的镜像,这里用v3版本以区分。
root@docker:/docker/app# docker build -t httpd:v3 .
Sending build context to Docker daemon 40.96kB
Step 1/8 : FROM centos
---> 5d0da3dc9764
Step 2/8 : LABEL version="3.0" description="apache with ssl"
---> Running in 515dbdb49520
Removing intermediate container 515dbdb49520
---> 77f1a7662fb1
Step 3/8 : WORKDIR /etc/httpd
---> Running in 87638ddb10c8
Removing intermediate container 87638ddb10c8
---> 2ce26a0bd744
Step 4/8 : RUN rm -rf /etc/yum.repos.d/CentOS-Linux-* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && yum makecache && yum install -y httpd mod_ssl && mkdir -p conf/certs
---> Running in 4886b25b7343
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2495 100 2495 0 0 7845 0 --:--:-- --:--:-- --:--:-- 7821
CentOS-8.5.2111 - Base - mirrors.aliyun.com 4.1 MB/s | 4.6 MB 00:01
CentOS-8.5.2111 - Extras - mirrors.aliyun.com 46 kB/s | 10 kB 00:00
CentOS-8.5.2111 - AppStream - mirrors.aliyun.co 2.8 MB/s | 8.4 MB 00:03
Metadata cache created.
Last metadata expiration check: 0:00:05 ago on Sun Jan 8 14:07:56 2023.
Dependencies resolved.
=======================================================================================
Package Arch Version Repo Size
=======================================================================================
Installing:
httpd x86_64 2.4.37-43.module_el8.5.0+1022+b541f3b1 AppStream 1.4 M
mod_ssl x86_64 1:2.4.37-43.module_el8.5.0+1022+b541f3b1 AppStream 136 k
Installing dependencies:
apr x86_64 1.6.3-12.el8 AppStream 129 k
apr-util x86_64 1.6.1-6.el8 AppStream 105 k
brotli x86_64 1.0.6-3.el8 base 323 k
centos-logos-httpd noarch 85.8-2.el8 base 75 k
httpd-filesystem noarch 2.4.37-43.module_el8.5.0+1022+b541f3b1 AppStream 39 k
httpd-tools x86_64 2.4.37-43.module_el8.5.0+1022+b541f3b1 AppStream 107 k
libpath_utils x86_64 0.2.1-39.el8 base 34 k
libtalloc x86_64 2.3.2-1.el8 base 49 k
mailcap noarch 2.1.48-3.el8 base 39 k
mod_http2 x86_64 1.15.7-3.module_el8.4.0+778+c970deab AppStream 154 k
sscg x86_64 2.3.3-14.el8 AppStream 49 k
Installing weak dependencies:
apr-util-bdb x86_64 1.6.1-6.el8 AppStream 25 k
apr-util-openssl x86_64 1.6.1-6.el8 AppStream 27 k
Enabling module streams:
httpd 2.4
Transaction Summary
=======================================================================================
Install 15 Packages
Total download size: 2.7 M
Installed size: 7.6 M
Downloading Packages:
(1/15): libpath_utils-0.2.1-39.el8.x86_64.rpm 317 kB/s | 34 kB 00:00
(2/15): centos-logos-httpd-85.8-2.el8.noarch.rp 600 kB/s | 75 kB 00:00
(3/15): libtalloc-2.3.2-1.el8.x86_64.rpm 664 kB/s | 49 kB 00:00
(4/15): mailcap-2.1.48-3.el8.noarch.rpm 359 kB/s | 39 kB 00:00
(5/15): apr-1.6.3-12.el8.x86_64.rpm 1.3 MB/s | 129 kB 00:00
(6/15): apr-util-1.6.1-6.el8.x86_64.rpm 1.0 MB/s | 105 kB 00:00
(7/15): brotli-1.0.6-3.el8.x86_64.rpm 937 kB/s | 323 kB 00:00
(8/15): apr-util-bdb-1.6.1-6.el8.x86_64.rpm 407 kB/s | 25 kB 00:00
(9/15): apr-util-openssl-1.6.1-6.el8.x86_64.rpm 451 kB/s | 27 kB 00:00
(10/15): httpd-filesystem-2.4.37-43.module_el8. 601 kB/s | 39 kB 00:00
(11/15): httpd-tools-2.4.37-43.module_el8.5.0+1 1.2 MB/s | 107 kB 00:00
(12/15): mod_http2-1.15.7-3.module_el8.4.0+778+ 1.3 MB/s | 154 kB 00:00
(13/15): mod_ssl-2.4.37-43.module_el8.5.0+1022+ 1.5 MB/s | 136 kB 00:00
(14/15): sscg-2.3.3-14.el8.x86_64.rpm 672 kB/s | 49 kB 00:00
(15/15): httpd-2.4.37-43.module_el8.5.0+1022+b5 2.2 MB/s | 1.4 MB 00:00
--------------------------------------------------------------------------------
Total 2.7 MB/s | 2.7 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : apr-1.6.3-12.el8.x86_64 1/15
Running scriptlet: apr-1.6.3-12.el8.x86_64 1/15
Installing : apr-util-bdb-1.6.1-6.el8.x86_64 2/15
Installing : apr-util-openssl-1.6.1-6.el8.x86_64 3/15
Installing : apr-util-1.6.1-6.el8.x86_64 4/15
Running scriptlet: apr-util-1.6.1-6.el8.x86_64 4/15
Running scriptlet: httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b54 5/15
Installing : httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b54 5/15
Installing : httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1 6/15
Installing : mailcap-2.1.48-3.el8.noarch 7/15
Installing : libtalloc-2.3.2-1.el8.x86_64 8/15
Installing : libpath_utils-0.2.1-39.el8.x86_64 9/15
Installing : sscg-2.3.3-14.el8.x86_64 10/15
Installing : centos-logos-httpd-85.8-2.el8.noarch 11/15
Installing : brotli-1.0.6-3.el8.x86_64 12/15
Installing : mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86 13/15
Installing : httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_6 14/15
Running scriptlet: httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_6 14/15
Installing : mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x 15/15
Running scriptlet: httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_6 15/15
Running scriptlet: mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x 15/15
Verifying : brotli-1.0.6-3.el8.x86_64 1/15
Verifying : centos-logos-httpd-85.8-2.el8.noarch 2/15
Verifying : libpath_utils-0.2.1-39.el8.x86_64 3/15
Verifying : libtalloc-2.3.2-1.el8.x86_64 4/15
Verifying : mailcap-2.1.48-3.el8.noarch 5/15
Verifying : apr-1.6.3-12.el8.x86_64 6/15
Verifying : apr-util-1.6.1-6.el8.x86_64 7/15
Verifying : apr-util-bdb-1.6.1-6.el8.x86_64 8/15
Verifying : apr-util-openssl-1.6.1-6.el8.x86_64 9/15
Verifying : httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_6 10/15
Verifying : httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b54 11/15
Verifying : httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1 12/15
Verifying : mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86 13/15
Verifying : mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x 14/15
Verifying : sscg-2.3.3-14.el8.x86_64 15/15
Installed:
apr-1.6.3-12.el8.x86_64
apr-util-1.6.1-6.el8.x86_64
apr-util-bdb-1.6.1-6.el8.x86_64
apr-util-openssl-1.6.1-6.el8.x86_64
brotli-1.0.6-3.el8.x86_64
centos-logos-httpd-85.8-2.el8.noarch
httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64
httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b541f3b1.noarch
httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64
libpath_utils-0.2.1-39.el8.x86_64
libtalloc-2.3.2-1.el8.x86_64
mailcap-2.1.48-3.el8.noarch
mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86_64
mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64
sscg-2.3.3-14.el8.x86_64
Complete!
Removing intermediate container 4886b25b7343
---> 9438049db973
Step 5/8 : COPY certs/* conf/certs/
---> 6ef922944e24
Step 6/8 : COPY conf/ssl.conf conf.d/
---> 787e5d8883f1
Step 7/8 : COPY conf/httpdstart /usr/local/bin/
---> c1a2327e9f8d
Step 8/8 : CMD ["sh","httpdstart"]
---> Running in cfc34299443c
Removing intermediate container cfc34299443c
---> 84db9d0dd542
Successfully built 84db9d0dd542
Successfully tagged httpd:v3
###查看镜像。
root@docker:/docker/app# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd v3 84db9d0dd542 10 minutes ago 280MB
httpd v2 379d5e9087db 4 weeks ago 144MB
httpd v1 c893a0ca5ab6 4 weeks ago 307MB
httpd latest dabbfbe0c57b 12 months ago 144MB
centos latest 5d0da3dc9764 15 months ago 231MB
###运行容器,进行测试。
root@docker:/docker/app# docker run -d -p 443:443 -v /docker/app/logs:/etc/httpd/logs -v /docker/app/conf/httpd.conf:/etc/httpd/conf/httpd.conf -v /docker/app/myapp/:/var/www/html httpd:v3
34f5895ce3428f1b9dbf85bff6580e708ac8d23f7a5623066708e5c2d152edd2
root@docker:/docker/app# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34f5895ce342 httpd:v3 "sh httpdstart" 2 seconds ago Up 2 seconds 0.0.0.0:443->443/tcp, :::443->443/tcp elastic_noyce
root@docker:/docker/app# curl -k https://192.168.1.128/index.html
Hello,New World!!!
3、基于厂商提供的基础镜像构建
还是使用之前 docker commit 构建镜像时的目录及文件,目录结构如下:
root@docker:/docker/app2# pwd
/docker/app2
root@docker:/docker/app2# ls
Dockerfile certs conf logs myapp
Dockerfile示例:
FROM httpd LABEL version="4.0" description="apache with ssl" WORKDIR /usr/local/apache2/ COPY certs/* conf/ COPY conf/httpd-ssl.conf conf/extra/
使用 docker build 命令构建镜像,并运行容器测试。
###将之前v3版本启动的容器停止并删除。
root@docker:/docker/app2# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34f5895ce342 httpd:v3 "sh httpdstart" 49 minutes ago Up 37 minutes 0.0.0.0:443->443/tcp, :::443->443/tcp elastic_noyce
root@docker:/docker/app2# docker stop 34f5
34f5
root@docker:/docker/app2# docker rm 34f5
34f5
root@docker:/docker/app2# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
###构建v4版本镜像。
root@docker:/docker/app2# docker build -t httpd:v4 .
Sending build context to Docker daemon 47.62kB
Step 1/5 : FROM httpd
---> dabbfbe0c57b
Step 2/5 : LABEL version="4.0" description="apache with ssl"
---> Running in 0a03e11b95f0
Removing intermediate container 0a03e11b95f0
---> 8062d452444f
Step 3/5 : WORKDIR /usr/local/apache2/
---> Running in 234519b94649
Removing intermediate container 234519b94649
---> b2bfcf685363
Step 4/5 : COPY certs/* conf/
---> cbaeee1f7ad4
Step 5/5 : COPY conf/httpd-ssl.conf conf/extra/
---> 5a6ab209e3c2
Successfully built 5a6ab209e3c2
Successfully tagged httpd:v4
###查看镜像。
root@docker:/docker/app2# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd v4 5a6ab209e3c2 About a minute ago 144MB
httpd v3 84db9d0dd542 50 minutes ago 280MB
httpd v2 379d5e9087db 4 weeks ago 144MB
httpd v1 c893a0ca5ab6 4 weeks ago 307MB
httpd latest dabbfbe0c57b 12 months ago 144MB
centos latest 5d0da3dc9764 15 months ago 231MB
###使用v4镜像运行容器。
root@docker:/docker/app2# docker run -d -p 443:443 -v /docker/app2/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v /docker/app2/logs/:/usr/local/apache2/logs/ -v /docker/app2/myapp/:/usr/local/apache2/htdocs/ httpd:v4
4e54b44238f574d65e2aa5b5e3ee175ab5b8b1cccd9200ed1550cf484f558ab2
root@docker:/docker/app2# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e54b44238f5 httpd:v4 "httpd-foreground" 4 seconds ago Up 3 seconds 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp sweet_morse
###测试。
root@docker:/docker/app2# curl https://192.168.1.128/index.html -k
Thank You!
总结
以上就是今天了解的内容,使用 Dockerfile 构建自己的镜像。