基于Dockerfile制作镜像

1.  Dockerfile 编写的基本结构:Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为Dockerfile 中的注释。

2.  一台主机可以有多个Dockerfile要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构建新的镜像。

     注意:Dockerfile 中所包含需要的内容;如COPY的文件、目录等,都需要在Dockerfile 同级目录下存在。

3.  docker build命令:docker build是基于dockerfile制作镜像的命令。命令格式为:

docker build [OPTIONS] PATH | URL | -

    选项:
        -t: 指定要创建的目标镜像名

        -c,- cpu-shares int: CPU份额(相对权重)
        
        -m,- memory bytes: 内存限制

        --build-arg: 设置构建时变量,就是构建的时候修改ARG指令的参数

        1>.  PATH: 一般用" . ",( 即当前工作目录 )作为上下文路径。

        一般来说, 应该会将 Dockerfile 置于一个空目录下, 或者项目根目录下。 如果该目录下没有所需文件, 那么应该把所需文件复制一份过来。 如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore , 该文件是用于剔除不需要作为上下文传递给Docker 引擎的。
        
        实际上 Dockerfile 的文件名并不要求必须为 Dockerfile , 而且并不要求必须位于上下文目录中, 比如可以用 " -f ../Dockerfile.php "参数指定某个文件作为Dockerfile ,一般大家习惯性的会使用默认的文件名 Dockerfile , 以及会将其置于镜像构建上下文目录中 。
        2>.  URL:  docker build 还支持从 URL 构建, docker build http://server/context.tar.gz ,如果所给出的 URL 是个 tar 压缩包,那么 docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。
        3>.   - ": docker build还支持从标准输入中读取 Dockerfile 进行构建:
                
        ·  docker build - < Dockerfile 或者cat Dockerfile | docker build -
如果标准输入传入的是文本文件,则将其视为 Dockerfile ,并开始构建。这种形式由于直接从标准输入中读取Dockerfile 的内容,它没有上下文,因此不可以像其他方法那样可以将本地文件 COPY 进镜像之类的事情。

        ·  docker build - < context.tar.gz

如果发现标准输入的文件格式是 gzip bzip2 以及 xz 的话, 将会使其为上下文压缩包,直接将其展开, 将里面视为上下文, 并开始构建。
4.  Dockerfile指令---FROM指令:
        1>.   介绍: FROM 指令必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始;FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境。
        2>.  语法格式:
FROM <repository>[:<tag>] 或 

FROM <repository>@<digest>

        3>.  示例:

# Description: test image 

FROM busybox:latest

5.  Dockerfile指令---MAINTAINER指令:

        1>.  介绍:用于让dockerfile制作者提供本人的详细信息。dockerfile 并不限制MAINTAINER 指令可以出现的位置,但推荐将其放置于FROM指令之后。

        2>.  格式:

MAINTAINER <authtor's detail>

        3>.  示例: 

# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>"

6.  Dockerfile指令---COPY指令:

        1>.  介绍:从上下文目录中复制文件或目录到容器里指定的路径。

        2>.  格式:

COPY <src>... <dest> 或 

COPY ["<src>",... "<dest>"]

        注意:

                ·  要复制的源文件或目录可以是多个,支持使用通配符; 如:
                   COPY hom* /mydir/  或  COPY hom?.txt /mydir/
                ·  要复制的文件必须是build上下文中的路径,不能是其父目录中的文件;
                ·  如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制;
                ·  使用 COPY 指令, 源文件的各种元数据都会保留。 比如读、 写、 执行权限、 文件变更时间等;
                ·  目标路径,即正在创建的image的文件系统路径;建议使用绝对路径, 也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定);
                ·  目标路径不需要事先创建, 如果目录不存在会在复制文件前先行创建缺失目录;
                ·  在路径中有空白字符时,通常使用第2种格式;
        3>.  示例:
# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

COPY index.html /data/web/html/ #要确保dockerfile 同级路径下有index.html文件

7.  Dockerfile指令---ADD指令:

        1>.  介绍:ADD 指令类似于COPY指令,ADD支持使用TAR文件和URL路径。

        2>.  格式:

ADD <src> .. <dest> 或 

ADD ["<src>".. "<dest>"]

        注意:同COPY指令,但是如果是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tar-x"命令;然而,通过URL获取到的tar文件将不会自动展开。

        示例:

# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

COPY index.html /data/web/html/ 

COPY yum.repos.d /etc/yum.repos.d/ 

ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/

8.  Dockerfile指令---WORKDIR指令:

        1>.  介绍:用于为Dockerfile中所有的RUNCMDENTRYPOINTCOPYADD指令设定工作目录。

        2>.  格式:

WORKDIR <dirpath>

        注意:在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,是相对此前一个WORKDIR指令指定的路径;

                   如该目录不存在, WORKDIR 会帮你建立目录。另外,WORKDIR也可调用由ENV指令定义的变量。
        3>.  示例:
# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

COPY index.html /data/web/html/ 

COPY yum.repos.d /etc/yum.repos.d/ 

WORKDIR /usr/local/ 

ADD nginx-1.15.8.tar.gz ./src/

9.  Dockerfile指令---VOLUME指令:

        1>.  介绍:用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷。

                         在Dockerfile 中, 我们可以事先指定某些目录挂载为匿名卷, 这样在运行时如果用户不指定挂载, 其应用也可以正常运行, 不会向容器存储层写入大量数据。
        2>.  语法:
VOLUME <mountpoint> 或 

VOLUME ["<mountpoint>"]

        例如:VOLUME /data

                ·  这里的 /data 目录就会在运行时自动挂载为匿名卷, 任何向 /data 中写入的信息都不会记录进容器存储层, 从而保证了容器存储层的无状态化。 当然, 运行时可以覆盖这个挂载设置。 比如:
                docker run -d - v mydata:/data xxxx
                ·  在这行命令中, 就使用了 mydata 这个命名卷挂载到了 /data 这个位置, 替代了Dockerfile 中定义的匿名卷的挂载配置。

       

        3>.  示例:

# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

COPY index.html /data/web/html/ 

COPY yum.repos.d /etc/yum.repos.d/ 

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/ 

WORKDIR /usr/local/ 

ADD nginx-1.15.8.tar.gz ./src/ 

VOLUME /data/mysql

10.  Dockerfile指令---EXPOSE指令:

        1>.  介绍:声明运行时容器提供服务端口, 这只是一个声明, 在运行时并不会因为这个声明应用就会开启这个端口的服务。

                          在 Dockerfile 中写入这样的声明有两个好处, 一个是帮助镜像使用者理解这个镜像服务的守护端口, 以方便配置映射; 另一个用处则是在运行时使用随机端口映射时, 也就是 docker run -P时, 会自动随机映射 EXPOSE 的端口。
        2>.  语法:
EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ....EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ....

        注意: 用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

                    EXPOSE指令可一次指定多个端口,例如:EXPOSE 11211/udp 11211/tcp

     3>. 示例:

# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

COPY index.html /data/web/html/ 

COPY yum.repos.d /etc/yum.repos.d/ 

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/ 

WORKDIR /usr/local/ 

ADD nginx-1.15.8.tar.gz ./src/

VOLUME /data/mysql 

EXPOSE 80/tcp

 11.  Dockerfile指令---ENV指令:

        1>.  介绍:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(ENVADD、COPY等)所调用

                          调用格式为 $variable_ name 或 ${variable_ name}
        2>.  格式:
ENV <key> <value> 或 

ENV <key>=<value> . .

                注意:第一种格式中,之后的所有内容均会被视作其组成部分, 因此,一次只能设置一个变量。

                           第二种格式可以一次设置多个变量,每个变量为一个”="的键值对,如果包含空格,可以以反斜线(\)进行转义,也可通过对其加引号进行标识;另外,反斜线也可用于续行。

                           定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。

        3>.  示例: 

# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

ENV DOC_ROOT=/data/web/html/ \ 
WEB_SERVER_PACKAGE="nginx-1.15.8" 

COPY index.html ${DOC_ROOT} 

COPY yum.repos.d /etc/yum.repos.d/ 

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/ WORKDIR /usr/local/ 

ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/ 

VOLUME /data/mysql 

EXPOSE 8080:80/tcp

12.  Dockerfile指令---RUN指令:

        1>.  介绍:用于指定docker build过程中运行的程序,其可以是任何命令。

        2>.  语法:

RUN <command> 或 

RUN ["<executable>", "<param1>", "<param2>"]

        注意: 第一种格式中,通常是一个shell命令, 且以“/bin/sh -c”来运行它;

                    第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令的可执行文件,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式: RUN ["/bin/bash", "-c", "", ""] 。
        3>.  示例:
# Description: test image 

FROM busybox:latest 

MAINTAINER "Along <along@along.com>" 

ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="nginx-1.15.8.tar.gz" 

COPY index.html ${DOC_ROOT} 

COPY yum.repos.d /etc/yum.repos.d/ 

WORKDIR /usr/local/ 

ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} ./src/ 

#ADD ${WEB_SERVER_PACKAGE} ./src/ 

VOLUME /data/mysql 

EXPOSE 8080:80/tcp 

RUN cd ./src && \ 
tar -xf ${WEB_SERVER_PACKAGE}.tar.gz

13.  Dockerfile指令---CMD指令:

        1>.  介绍:类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同。

                            RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时。
                           CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过, CMD指定的命令可以被docker run的命令行选项所覆盖。
                            在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。
        2>.  语法:
CMD <command> 或 

CMD ["<executable>","<param1>","<param2>"] 或 

CMD ["<param1>","<param2>"]

        注意:前两种语法格式的意义同RUN

                   第三种则用于为ENTRYPOINT指令提供默认参数
                   json数组中,要使用双引号,单引号会出错
        3>.  示例:
FROM busybox 

LABEL maintainer="Along <along@along.com>" app="httpd" 

ENV WEB_DOC_ROOT="/data/web/html" 

RUN mkdir -p ${WEB_DOC_ROOT} && \ 
echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html 

CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

14.  Dockerfile指令---ENTRYPOINT指令:

        1>.  介绍:类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。

                          与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指令指定的程序。

                          docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT 指令指定的程序。
                          当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变, 不再是直接的运行其命令, 而是将 CMD的内容作为参数传给 ENTRYPOINT 指令。
        2>.  语法:
ENTRYPOINT <command> 

ENTRYPOINT ["<executable>", "<param1>", "<param2>"]

                注意:docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。

                           Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
        
        3>.  示例:
FROM busybox 

LABEL maintainer="Along <along@along.com>" app="httpd" 

ENV WEB_DOC_ROOT="/data/web/html" 

RUN mkdir -p ${WEB_DOC_ROOT} && \ 
echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html 

ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值