Docker 学习笔记15 Dockerfile详解
- 1. 准备
- 三、构建命令
一、说明
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 | 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。格式: |
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
/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