三、Dockerfile 操作常用的指令
3.1 FROM 镜像
指定新镜像所基于的基础镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令
3.2 MAINTAINER 名字
说明新镜像的维护人信息
3.3 RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中
3.4 ENTRYPOINT
ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
ENTRYPOINT ["rm", "-rf", "/*"]
3.5 CMD
exec形式:CMD ["要运行的程序", "参数1", "参数2"] shell形式:CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本 ,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。
CMD 可以为 ENTRYPOINT 指令提供默认参数。
ENTRYPOINT和CMD共存的情形: ENTRYPOIN指定命令,CMD传参
容器运行时的优先级:
docker run 指定的命令 > ENTRYPOINT > CMD
3.6 EXPOSE
EXPOSE 端口号
指定新镜像加载到 Docker 时要开启的端口
3.7 ENV
ENV 环境变量 变量值
设置一个环境变量的值,会被后面的 RUN 使用
linxu PATH=$PATH:/opt ENV PATH $PATH:/opt
3.8 ADD
ADD 源文件/目录 目标文件/目录
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
有如下注意事项:
1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。
如果目标路径不存在,则会自动创建目标路径。
2、如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。
3.9 COPY
COPY 源文件/目录 目标文件/目录
只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中
3.10 VOLUME
VOLUME [“目录”]
在容器中创建一个挂载点
3.11 USER
USER 用户名/UID
指定运行容器时的用户
3.12 WORKDIR
WORKDIR 路径
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录
3.13 ONBUILD
ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
注:请各位自己在生产中如果有的是别的dockerfile 请自习阅读,否则后果自付
3.14 HEALTHCHECK
健康检查
在编写 Dockerfile 时,有严格的格式需要遵循:
- 第一行必须使用 FROM 指令指明所基于的镜像名称;
- 之后使用 MAINTAINER 指令说明维护该镜像的用户信息;
- 然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
- 最后使用 CMD 指令指定启动容器时要运行的命令操作。
四、Dockerfile 案例
4.1 构建apache镜像
#建立工作目录 mkdir /opt/apache cd /opt/apache
vim Dockerfile #基于的基础镜像 FROM centos:7 #维护镜像的用户信息 MAINTAINER this is apache image <xc> #镜像操作指令安装apache软件 RUN yum -y update RUN yum -y install httpd #开启 80 端口 EXPOSE 80 #复制网站首页文件 ADD index.html /var/www/html/index.html //方法一: #将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #启动容器时执行脚本 CMD ["/run.sh"] //方法二: ENTRYPOINT [ "/usr/sbin/apachectl" ] CMD ["-D", "FOREGROUND"]
//准备执行脚本 vim run.sh #!/bin/bash rm -rf /run/httpd/* #清理httpd的缓存 /usr/sbin/apachectl -D FOREGROUND #指定为前台运行 #因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
//准备网站页面 echo "this is test web" > index.html
//生成镜像 docker build -t httpd:centos . #注意别忘了末尾有"."
//新镜像运行容器 docker run -d -p 1216:80 httpd:centos
//测试 http://192.168.147.105:1216/ ########如果有网络报错提示######## [Warning] IPv4 forwarding is disabled. Networking will not work. 解决方法: vim /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p systemctl restart network systemctl restart docker
4.2 构建SSH镜像
mkdir /opt/sshd cd /opt/sshd
vim Dockerfile #第一行必须指明基于的基础镜像 FROM centos:7 #作者信息 MAINTAINER this is ssh image <xc> #镜像的操作指令 RUN yum -y update RUN yum -y install openssh* net-tools lsof telnet passwd RUN echo 'abc1234' | passwd --stdin root RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config #不使用PAM认证 RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd #取消pam限制 RUN ssh-keygen -t rsa -A #生成密钥认证文件 RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh EXPOSE 22 CMD ["/usr/sbin/sshd" , "-D"] #/usr/sbin/sshd -D 用于前台启动sshd服务
//生成镜像 docker build -t sshd:centos .
//启动容器并修改root密码 docker run -d -P sshd:centos docker ps -a ssh localhost -p 49153