系列文章目录

容器学习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 定义随机变量 dockerfile创建容器_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 构建自己的镜像。