Docker 学习笔记15 Dockerfile详解

一、说明

Dockerfile文件是Docker容器的描述文件,当中包含一行行命令,用来指导构建容器的顺序。

二、Dockerfile的关键字

1.关键字列表

关键字

解释

FROM

# 基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER

# 镜像维护者的姓名混合邮箱地址

RUN

# 容器构建时需要运行的命令

EXPOSE

# 当前容器对外保留出的端口

WORKDIR

# 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

ENV

# 用来在构建镜像过程中设置环境变量

ARG

构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

ADD

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

COPY

# 类似ADD,拷贝文件和目录到镜像中!

VOLUME

# 容器数据卷,用于数据保存和持久化工作

CMD

# 指定一个容器启动时要运行的命令,dockerFile 中可以有多个 CMD 指令,但只有最后一个生效!

ENTRYPOINT

# 指定一个容器启动时要运行的命令!和CMD一样

ONBUILD

# 当构建一个被继承的 DockerFile 时运行命令,父镜像在被子镜像继承后,父镜像的 ONBUILD 被触发

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。格式:​​USER <用户名>[:<用户组>]​

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

2. 行合并

Dockerfile 的指令每执行一次都会在 docker 上新建一层,能合并的尽量合并,如:

FROM centos
RUN yum 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 install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

3. run shell 格式:

RUN <命令行命令>
# <命令行命令> 相当于在终端操作的 shell 命令。

4. run exec 格式:

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

二、一个简单的Dockerfile说明

1. 准备

vim run.sh
#!/bin/bash
/usr/local/apache2/bin/httpd -D FOREGROUND
#新生成的镜像是基于sshd:dockerfile镜像
FROM centos:latest
MAINTAINER eden

#安装wget
RUN yum install -y wget
WORKDIR /usr/local/src

#下载并解压源码包
RUN wget http://archive.apache.org/dist/httpd/httpd-2.4.41.tar.gz
RUN tar -zxvf httpd-2.4.41.tar.gz
WORKDIR httpd-2.4.41

#编译安装apache
RUN yum -y install epel-release.noarch && yum makecache #fast
RUN yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel
RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so
RUN make
RUN make install

#修改apache配置文件
RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf

#启动apache服务
RUN /usr/local/apache2/bin/httpd

#复制服务启动脚本并设置权限
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh

#开放80端口
EXPOSE 80
CMD ["/usr/local/sbin/run.sh"]

三、构建命令

docker build -t centos:test .
# 启动一个容器
docker run -p 80:80 -d centos:test