欢迎来到魔幻小生的博客

DockerFile文件详解

概述

Dockerfile 是一个文本文件,里面包含组装新镜像时用到的基础镜像和各种指令。

使用 dockerfile 文件来定义镜像,然后运行镜像,启动容器。

基本结构

一个dockerfile文件包含以下部分:

  • 基础镜像信息: 使用 FROM 关键字指定基础镜像信息,FROM 是 dockerfile 文件的第一条指令。
  • 维护者信息: 使用 MAINTAINER 关键字指定,通常可以使用 dockerfile 文件创建者的名字或者邮件作为维护者的信息。
  • 镜像操作指令: 每执行一条镜像操作指令,都会在镜像中添加新的一层。如 RUN,CMD,FROM,EXPOSE,ENV 等指令。
  • 容器启动执行命令: 用户指定在启动容器时需要执行的命令,通过:CMD ENTRYPOINT 指定。

常用指令

FROM 指定基础镜像

FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。

格式:
	FROM <image>
	FROM <image>:<tag>
	FROM <image>@<digest>

示例:
	FROM mysql:5.6

注:
	tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

通过 FROM 指定的镜像,可以是任何有效的基础镜像。FROM 有以下限制:

  • FROM 必须 是 Dockerfile 中第一条非注释命令
  • 在一个 Dockerfile 文件中创建多个镜像时,FROM 可以多次出现。只需在每个新命令 FROM 之前,记录提交上次的镜像 ID
  • tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像

MAINTAINER 维护者信息

格式:
	MAINTAINER <name>

示例:
	MAINTAINER Jasper Xu
	MAINTAINER sorex@163.com
	MAINTAINER Jasper Xu <sorex@163.com>

WORKDIR 指定工作目录

WORKDIR用于在容器内设置一个工作目录:

格式:
	WORKDIR /path/to/workdir

示例:
	WORKDIR /opt/infosec/NetCertCA_6

RUN 执行命令

在镜像的构建过程中执行特定的命令,并生成一个中间镜像。

shell执行
格式:
	RUN <command>
exec执行
格式:
	RUN ["executable", "param1", "param2"]

示例:
	RUN ["executable", "param1", "param2"]
	RUN apk update
	RUN ["/etc/execfile", "arg1", "arg1"]

COPY 复制文件

格式:
	COPY <源路径> <目标路径>

示例:
	COPY package.json /usr/src/app/

ADD 复制文件并解压

ADD 指令和 COPY 的格式和性质基本一致。在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。

另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。

格式:
	ADD <源路径> <目标路径>

ENV 设置环境变量

这个指令很简单,就是设置环境变量而已。

格式:
	ENV <key><value>
	ENV <key1>=<value1><key2>=<value2>...

示例:
	ENV JAVA_HOME /usr/local/jdk1.8
	ENV PATH $PATH:$JAVA_HOME/bin

EXPOSE 设置监听端口

格式:
	EXPOSE <port> [<port>...]

EXPOSE 指令并不会让容器监听 host 的端口,如果需要,需要在 docker run 时使用 -p 参数来发布容器端口到 host 的某个端口上。

CMD 容器启动命令

CMD用于指定在容器启动时所要执行的命令。

格式:
	CMD ["executable","param1","param2"] (执行可执行文件,优先)
	CMD command param1 param2 (执行shell内部命令)

示例:
	CMD echo "This is a test." | wc -
	CMD ["/usr/bin/wc","--help"]

注:
    CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

注意 与 RUN 指令的区别:RUN 在构建的时候执行,并生成一个新的镜像,CMD 在容器运行的时候执行,在构建时不进行任何操作。

构建一个简单 nginx 镜像

在本地创建一个文件名为Dockerfile的文件

# This is my first dockerfile.
# Version 1.0

# 指定基础镜像
FROM centos:7.9:2009

# 维护者信息
MAINTAINER magicboy

# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

# 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

# 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

# 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

构建镜像

docker build -t nginx:v1.0 ./
posted @ 2024-04-11 15:06  魔幻小生  阅读(53)  评论(0编辑  收藏  举报