Dockerfile
文章目录
一、Dockerfile基本创建方法
1.1 Docker镜像的分层
-
镜像Dockerfile生成
-
FROM centos:7 基础镜像
-
ADD run.sh /run.sh 从宿主机复制run.sh文件到容器的/run.sh
-
VOLUME /data
-
CMD ["./run.sh"]
-
-
流程
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层时不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
1.2 Docker镜像的创建
1.3 案例:构建各类Docker镜像服务
1.3.1 基于已有镜像创建
-
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签] '//-m 说明信息' '//-a 作者信息' '//-p 生成过程中停止容器的运行' #下载镜像 docker pull centos:7 #创建容器 docker create -it centos:7 /bin/bash #基于已有的容器创建镜像 docker commit -m "new" -a "zhao" 容器ID zhao:test #查看镜像 docker images
1.3.2 基于本地模板创建
-
通过导入操作系统模板文件生成新的镜像
-
使用wget命令导入为本地镜像
wget http://download.openvz/template/precreated/debian-7.0-x86-minimal.tar.gz
-
导入成功后可查看本地镜像信息
docker images | grep new
#下载模板 wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal #基于模板创建镜像 cat debian-7.0-x86-minimal.tar.gz | docker import - zhao:test #查看镜像 docker images
1.3.3 基于Dockerfile创建
-
Dockerfile是由一组指令组成的文件
-
Dockerfile结构四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
-
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"开头的注释
#apache为例 mkdir apache cd apache vim Dockerfile FROM centos:7 '//基础镜像' MAINTAINER this is test '//维护镜像的用户信息' RUN yum -y update '//镜像操作指令安装apache' RUN yum -y install httpd EXPOSE 80 '//暴露80端口(内部端口)' ADD index.html /var/www/html/index.html '//复制网站首页文件' ADD run.sh /run.sh '//复制执行脚本到镜像中' RUN chmod +x /run.sh CMD ["/run.sh"] '//启动容器时执行脚本' vim run.sh rm -rf /var/run/httpd/* '//初始化' exec /usr/local/apachectl -D FOREGROUND '//启动apache' vim index.html <h1>this is test web</h1> docker build -t httpd:centos . '//注意最有有一个"."'
1.4 Dockerfile操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD [“要运行的程序”,“参数1”,“参数2”] | 指令启动容器时要运行的命令或脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
EXPOSE 端口号 | 内部端口;指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录(宿主系统) 目标文件/目录(容器) | 将源文件复制到目标文件,源文件要与Dockerfile位于相同的目录中,或者是一个URL |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的 |