Dockerfile小记
什么是dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile
中的指令自动生成映像。简单来说Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。
docker build
命令用于从Dockerfile构建映像。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。
举个🌰:
docker build -f /tmp/Dockerfile
Dockerfile组成:
基础镜像(必须的)、运行指令、容器默认执行命令。
Dockerfile文件说明:
Docker以从上到下的顺序运行Dockerfile的指令。所以第一条指令必须是FROM来指定基本镜像。
Docker文件中使用FROM,RUN,ENV,CMD,EXPOSE等指令。
1.FROM [必须]
FROM 指定基础镜像,目的是为了给构建镜像提供一个基础环境。
格式:
FROM <image>
FROM <image>:<tag>
示例:
FROM nginx
2、MAINTAINER 指定维护者信息
格式: MAINTAINER <name>
示例:
MAINTAINER liusu xxxxxx
3、RUN
基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像。RUN指令后面执行的命令必须是镜像中已经存在了的命令。
格式: RUN <command>
4、CMD 构建容器后调用,也就是在容器启动时才进行调用
格式: CMD ["executable","param1","param2"] (执行可执行文件,优先) CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 (执行shell内部命令) 示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]
注意:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
5、ADD和COPY
ADD : 将本地文件添加到镜像
ADD支持自动解压,但是仅仅支持解压tar包
ADD支持远程下载,但是不会解压下载内容
格式: ADD /tmp/epel.repo /etc/yum.repos.d ADD curl -o xxxxxxxxxxx 远程下载
COPY : 将文件复制到镜像
6、ENV 设置一个容器的环境变量
格式: ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量 ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行 示例: ENV myName John Doe
7、EXPOSE
指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-P, 可以指定多个端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
注意:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run
运行容器时通过-p来发布这些端口,或通过-P
参数来发布EXPOSE导出的所有端口
8、ARG
指定运行时参数,用于构建docker镜像时传入参数 --build-arg=USER=root
格式:
ARG <name>[=<default value>] 示例: ARG site ARG build_user=www
9、VOLUME
设置需要挂载的目录,没有实现挂载。
10、WORKDIR 设置工作目录
1、程序运行的开始目录
2、进入容器的最初目录
格式:
WORKDIR /path/to/workdir 示例: WORKDIR /a (这时工作目录为/a)
11、ONBUILD
ONBUILD 后面跟的是Dockerfile指令不是linux命令
构建触发器 : 当当前镜像用作基础镜像时触发
格式:
ONBUILD [INSTRUCTION] 示例: ONBUILD ADD . /app/src 注意:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
二:案例
[root@Centos7 nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4
# 创建nginx
[root@Centos7 nginx]# vim Dockerfile
FROM nginx
RUN useradd www
ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx
EXPOSE 80
WORKDIR /root
CMD nginx -g "daemon off;"
## 修改nginx.conf
user www;
## 修改default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
# 创建PHP
[root@Centos7 php]# vim Dockerfile
FROM centos:7
RUN yum install php php-devel php-fpm -y
RUN useradd www
ADD www.conf /etc/php-fpm.d/
EXPOSE 9000
CMD ["php-fpm"]
## 修改www.conf
listen = 9000
;listen.allowed_clients = 127.0.0.1
user = www
group = www
request_terminate_timeout = 0
# 创建mysql
docker rm -f mysql && docker run -d --name mysql--network=lnmp -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
注意:
dockerfile执行是按照从上到下
如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache)
1、从互联网下载内容不会使用缓存
2、添加文件的内容(ADD、COPY)不使用缓存
如果上一步修改过,则下面的dockerfile步骤全部不使用缓存。