什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,这里你只要知道构建的流程即可。
1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

  1. FROM nginx
  2. RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

docker build 命令

用于使用 Dockerfile 创建镜像。

  1. $ docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  • **–build-arg=[] :**设置镜像创建时的变量;
  • **–cpu-shares :**设置 cpu 使用权重;
  • **–cpu-period :**限制 CPU CFS周期;
  • **–cpu-quota :**限制 CPU CFS配额;
  • **–cpuset-cpus :**指定使用的CPU id;
  • **–cpuset-mems :**指定使用的内存 id;
  • **–disable-content-trust :**忽略校验,默认开启;
  • **-f :**指定要使用的Dockerfile路径;
  • **–force-rm :**设置镜像过程中删除中间容器;
  • **–isolation :**使用容器隔离技术;
  • **–label=[] :**设置镜像使用的元数据;
  • **-m :**设置内存最大值;
  • **–memory-swap :**设置Swap的最大值为内存+swap,”-1”表示不限swap;
  • **–no-cache :**创建镜像的过程不使用缓存;
  • **–pull :**尝试去更新镜像的新版本;
  • **–quiet, -q :**安静模式,成功后只输出镜像 ID;
  • **–rm :**设置镜像成功后删除中间容器;
  • **–shm-size :**设置/dev/shm的大小,默认值是64M;
  • **–ulimit :**Ulimit配置。
  • **–squash :**将 Dockerfile 中所有的操作压缩为一层。
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • –network: 默认 default。在构建期间设置RUN指令的网络模式

实例

  1. $ docker build -t mynginx:v1 .

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

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

dockerfile命令

FROM 和 RUN

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:

  1. RUN <命令行命令>
  2. # <命令行命令> 等同于,在终端操作的 shell 命令。
  3. RUN ["可执行文件", "-c", "configs/user/srv.yaml"]
  4. #等效于 ./user-server -c configs/user/srv.yaml

COPY

复制命令, 可以将本机的文件复制到镜像中

  1. COPY 源路径 目标路径
  2. #通配符
  3. COPY hom* /mydir/
  4. COPY hom?.txt /mydir/

制作一个gin服务的镜像

CMD 命令
CMD是在docker run阶段运行的, RUN是在docker build阶段运行的

  1. CMD <shell 命令>
  2. CMD ["<可执行文件或命令>","<param1>","<param2>",...]
  3. CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

要打包linux可执行的文件 dockerfile - 图1

EXPOSE

声明端口

dockerfile - 图2

ENTRYPOINT

CMD命令设置容器启动后默认执行的命令及其参数,当Dockerfile中存在多个CMD命令,只有最后一个会被执行,但CMD设置的命令能够被docker run后面的命令行参数覆盖替换
ENTRYPOINT配置容器启动时的执行命令,当运行 docker run时指定了其他命令,docker run时指定的命令会追加到ENTRYPOINT配置命令行的参数一起执行。ENTRYPOINT 中的参数始终会被使用,与CMD不同,它不会被替换。

ENV和ARG

ENV 环境变量

  1. ENV key=value
  2. ENV AUTHOR="likezhu"
  3. ENV NAME="likezhu" PROJECT="shop"

当使用生成的镜像运行容器的时候, 使用ENV设置的环境变量将持久存储在容器中,当然你也可以在docker run的时候修改这个环境变量 docker run -e NAME=”likezhu2”
ARG 变量
如果我只是在构建的过程中使用的临时变量我们使用ARG来定义

  1. ARG NAME="likezhu"
  2. ${NAME}

假设我们现在想要通过dockerfile去构建一个nodejs的进行环境,但是我喜欢构建不同版本的nodejs的运行环境的时候这个时候我们不可能每次都写一个dockerfile

  1. FROM alpine
  2. ARG NODE_VERSION 7.2.0
  3. RUN curl https://nodejs.org/dist/node-v${NODE_VERSION}-linux-x64.tar.xz && curl xxx

你这样不还是写死了7.2.0版本了吗?
docker build 命令中有个参数 docker build –build-arg NODE_VERSION=7.3.0
留作作业大家自己去完成, 不同版版本的redis

WORKDIR

指定工作目录, 用workdir指定的工作目录, 会在构建镜像的每一层中都存在, 比如我们想要构建一个基础镜像,以后各层的当前目录就被改为workdir的目录,如果目录不存在,workdir会帮你建立目录