目录
一.基于现有镜像创建
1.首先启动一个镜像,在容器里做修改
2.然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
二.基于本地模板创建
三.基于Dockerfile 创建
联合文件系统(UnionFS)
镜像加载原理
为什么Docker里的centos的大小才200M?
Dockerfile
Docker 镜像结构的分层
Dockerfile 操作常用的指令:
1.FROM 镜像
2.MAINTAINER 名字
3.RUN 命令
4.ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]
5.CMD ["要运行的程序", "参数1", "参数2"]
6.EXPOSE 端口号
7.ENV 环境变量 变量值
8.ADD 源文件/目录 目标文件/目录
(1)、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
(2)、如果源路径是个文件,且目标路径是不以 / 结尾,则docker会把目标路径当作一个文件。
(3)、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
(4)、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
9.COPY 源文件/目录 目标文件/目录
10.VOLUME [“目录”]
11. USER 用户名/UID
12.WORKDIR 路径 /home
13.ONBUILD 命令
14.HEALTHCHECK
Dockerfile 案例
1.建立工作目录
2.准备执行脚本
3.准备网站页面
4.生成镜像
5.新镜像运行容器
6.测试
创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。
docker create -it centos:7 /bin/bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
000550eb36da centos:7 "/bin/bash" 3 seconds ago Created gracious_bassi
docker commit -m "new" -a "centos" 000550eb36da centos:test
#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。
docker images
通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test
指定新镜像所基于的基础镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令
说明新镜像的维护人信息
在所基于的镜像上执行命令,并提交到新的镜像中
cd cp
设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
ENTRYPOINT ["rm", "-rf", "/*"]
上面的是exec形式,shell形式:CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。
CMD 可以为 ENTRYPOINT 指令提供默认参数。
ENTRYPOINT ["rm"]
CMD ["cp" ,"-rf",“*”]
java -jar xxxxxxx.jar 8090
docker run指定的命令----》ENTRYPOINT---》CMD
指定新镜像加载到 Docker 时要开启的端口 EXPOSE 8090
设置一个环境变量的值,会被后面的 RUN 使用
linxu PATH=$PATH:/opt
ENV PATH $PATH:/opt
将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL
有如下注意事项:
/home/ky26/zhaichen.txt /home/ky26/
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
A B
/home/ky26 /home/ky26
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。
只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中
在容器中创建一个挂载点
指定运行容器时的用户
为后续的 RUN、CMD、ENTRYPOINT 指定工作目录
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
OBuild rm - rf /*
注:请各位自己在生产中如果有的是别的dockerfile 请自习阅读,否则后果自付
健康检查
在编写 Dockerfile 时,有严格的格式需要遵循:
mkdir /opt/apache
cd /opt/apache
vim Dockerfile
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image
#镜像操作指令安装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