使用Dockerfile创建镜像

admin
admin 2019年05月10日
  • 在其它设备中阅读本文章

创建镜像命令

docker build 命令用于使用 Dockerfile 创建镜像,常用参数有

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

使用当前目录的 Dockerfile 创建镜像,标签为 myimg。

docker build -t myimg .

也可以通过 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .

Dockerfile 简述

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile 从 FROM 命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。Dockerfile 语法由两部分构成, 注释 命令 + 参数

命令的分类:
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME 等
容器启动时执行指令 CMD、ENTRYPOINT

命令详解

FROM
指定哪种镜像作为新镜像的基础镜像,如:

FROM ubuntu:14.04

MAINTAINER
指明该镜像的作者和其电子邮件,如:

MAINTAINER vector4wang "xxxxxxx@qq.com"

RUN
在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用 \ 来换行,如:

RUN echo 'hello docker!' \
    > /usr/local/file.txt

也可以使用 exec 格式 RUN ["executable", "param1", "param2"] 的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable 是命令,后面的 param 是参数

COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker 会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在 Dockerfile 文件的同级目录下
原因:
因为构建环境将会上传到 Docker 守护进程,而复制是在 Docker 守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY 指令的目的的位置则必须是容器内部的一个绝对路径。
---《THE DOCKER BOOK》

ADD
将主机的文件复制到镜像中,跟 COPY 一样,限制条件和使用方式都一样,如:

ADD application.yml /etc/springboot/hello-service/src/resources

但是 ADD 会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用 - P 参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

EXPOSE 8080 
EXPOSE 8081
...

WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如

WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...

最终会在 /usr/local/webservice/ 目录下生成 text.txt 文件

ONBUILD
当一个包含 ONBUILD 命令的镜像被用作其他镜像的基础镜像时 (比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像 image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

然后创建镜像 image-B,指定 image- A 为基础镜像,如

FROM image-A
...

然后在构建 image- B 的时候,日志上显示如下:

Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

USER
指定该镜像以什么样的用户去执行,如:

USER mongo

VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将 mongodb 镜像中存储数据的 data 文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主机目录 容器目录

CMD
容器启动时需要执行的命令,如:

CMD /bin/bash

同样可以使用 exec 语法,如

CMD ["/bin/bash"]

当有多个 CMD 的时候,只有最后一个生效。

ENTRYPOINT
作用和用法和 CMD 一模一样