Dockerfile篇

Dockerfile是用来构建Docker镜像的文本文件, 由一条条构建镜像所需的指令和参数构成的脚本。

  • 文件名首字母D大写
  • 构建三部曲

    • 编写 Dockerfile文件
    • 构建 docker build -t 新镜像名字:TAG .

      • (.)代表当前目录
    • 运行 docker run -it 新镜像名字:TAG

使用 Dockerfile 定制镜像

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。

1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

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

2、FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

Dockerfile 保留关键字

  当前容器对外暴露出的端口
  EXPOSE

  容器启动命令
  Dockerfile 中可以有多个CMD指令, 但只有最后一个生效,CMD会被docker run 之后的参数替换
  CMD ["可执行文件", "参数", "参数2"]

  用来在构建镜像过程中设置环境变量
  ENV MY_PATH /user/test
  
  容器数据卷, 用于数据保持
  VOLUME

  当指定ENTRYPOINT后,CMD含义就发生了变化, 不再是直接运行其命令,二十将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成<ENTRYPOINT>"<CMD>".
  例子:
  FROM nginx
  ENTRYPOINT ["nginx", "-c"] # 定参
  CMD ["/etc/nginx/nginx.conf"] # 变参

  指定一个已经存在的镜像作为模板:
  From

  作者/维护者
  MAINTAINER

  容器构建时执行的命令 两种格式 shell格式 exec格式 RUN是在docker build时运行
  RUN 命令

  将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
  ADD

  复制文件 宿主机文件 复制进目标文件夹
  COPY

  指定创建容器后,终端默认登录的进来工作目录,一个落脚点, 可以配合ENV使用
  WORKDIR 

标签: none

已有 2 条评论

  1. [...]目录1. Docker介绍 点我跳转.2. Docker命令篇 点我跳转.3. Docker-Dockerfile篇 点我跳转.3. Docker-Network网络篇 点我跳转.4. Docker-compose篇 点我跳转.[...]

  2. 1

添加新评论