Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建
编写命令:
1.FROM
作用:声明使用哪个基础镜像
格式:FROM IMAGE:TAG
例: FROM nginx:latest
2.LABEL
作用:指明作者
格式:LABEL author=tian
3.ENV
作用:声明环境变量
格式:ENV KEY=VALUE
例:ENV workdir=/var/www/html
4.WORKDIR
作用:声明工作目录
格式:WORKDIR 工作目录
例:WORKDIR $wrkdir
WORKDIR /var/www/html
WORKDIR /usr/local/apache2
5.RUN
作用:执行命令
格式: RUN cmd && cmd2
例:RUN yum install httpd -y && systemctl enable httpd
相当的指令尽量放到一层
6.EXPOSE
作用:声明暴露的端口
格式:EXPOSE 80 3306
7.COPY
作用:复制Dockerfile 工作目录下的文件至镜像内
格式:COPY SRC DEST
例:COPY psswd /etc/
注意:源文件路径用相对路径 目标一般用绝对路径
也可使用通配符
源文件必须在工作目录或者工作目录的子目录中
目标路径可以不存在,会自动创建
如果源文件是一个目录,会自动递归复制目录下的文件到目标位置,目录本身不会被复制
如果复制多个文件,或者源文件中用了通配符,那么目标路径必须以 / 为结尾
8.ADD
作用:复制
格式:ADD SRC DEST
例:ADD tian.tar.gz /etc/
ADD 和COPY区别
ADD会自动解压tar 包
ADD 可以从网络上下载,但是这时候的tar包不会被解压
9.VOLUME
声明挂载点
格式:VOLUME DEST
例:VOLUME /var/www/html
10.触发器 #当别人用你的镜像制作新的镜像时候会触发一个动作
格式:ONBUILD 动作
例:ONBUILD ADD https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/adwaita-qt-common-1.0-1.el7.x86_64.rpm /date
11.CMD
作用:执行命令 PID为1的指令
格式:CMD 命令
例:CMD nginx -g daemon off;
CMD ["nginx","-g","daemon off;"]
12.ENTRYPOINT
作用:执行命令 PID 为1的指令
格式:ENTRYPOINT 指令
例:ENTRYPOINT nginx -q daemon off;
ENTRYPOINT ["nginx","-g","daemon off;"]
CMD ["-g","daemon off;"]
ENTRYPOINT ["nginx"]
# :指备注,注释
指令参数,指令的大小写不敏感 #通常情况下一般使用大写
第一个非注释行必须是FROM指令 #在没有注释的Dockerfile中。FROM必须是首行
编写Dockerfile必须在一个目录下进行,这个目录称之为 工作目录(WORKSPACE)
Dockerfile文件命令的首字母必须大写
制作镜像所要用的文件必须放在工作目录或者工作目录的子目录之下,不能放在父目录
可以通过隐藏文件 .dockeringnore 来指定不要放入到镜像中的文件,一行是一个文件,可以用通配符
基于dockerfile做镜像,本质上还是基于一个现有的镜像做新镜像
例:基于httpd镜像演示上面所有的指令
第一步:创建Dockerfile工作目录
mkdir test
cd test
vim Dockerfile
#this is my first Dockerfile
FROM httpd:latest
LABEL author=tian
ENV dir=/usr/local/apache2/htdocs
WORKDIR $dir
COPY test1 ./
RUN touch test2
ADD https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/adwaita-qt-common-1.0-1.el7.x86_64.rpm ./
EXPOSE 80 3306
VOLUME $dir
CMD ["httpd-foreground"]
第二步:基于dockerfile创建镜像
docker build -t httpd:tian1 .
第三步:基于新创建的镜像启动容器
docker run -d httpd:tian1