Docker镜像的创建方法
Docker镜像除了是Docker的核心技术之外,也是应用发布的标准格式。 一个完整的Docker镜像可以支撑一个Docker容器的运行,在Doker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。
创建镜像的方法有三种,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。
基于已有镜像创建
基于已有镜像创建主要使用docker commit命令。实质就是把一一个 容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
命令格式: docker commit [选项] 容器ID 名称 仓库名称:[标签]
常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
查看本地镜像,创建容器,将容器提交为新的镜像,需要记住该容器的ID号
docker images //查看所有镜像
docker ps -a //查看所有容器
docker create -it jasonlix/docker-cobbler /bin/bash //创建容器
docker commit -m "new" -a "daoke" a2c2df6c8246 daoke:test //创建一个新的镜像
docker images
基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz //下载debian模板压缩包
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new //将下载的模板导入为本地镜像
docker images | grep new //查看本地镜像
基于Dockerfile创建
Dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。
Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释。
在编写Dockerfile时,有严格的格式需要遵循:第一行必须使用FROM指令指明所基于的镜像名称;之后使用MAINTAINER指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用CMD指令,开指定启动容器时要运行的命令操作。
FROM镜像:指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字:说明新镜像的维护人信息
RUN命令:在所基于的镜像上执行命令,并提交到新的镜像中
CMD["要运行的程序","参数1","参指2"]:指定启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只有最后一条被执行
EXPOSE端口号:指定新镜像加载到Docker时要开启的端口
ENV环境变量变量值:设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录:将源文件复制到目标文件中,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录:将本地主机上的源文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME["目录"]:在容器中创建一个挂载点
USER用户名/UID:指定运行容器时的用户
WORKDIR路径:为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD命令:指定所生成的镜像作为一个基础镜像时所要运行的命令
1、建立工作目录
mkdir /opt/apache
cd /opt/apache
2、创建并编写Dockerfile文件
vim Dockerfile
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER The porject <[email protected]>
#镜像操作指令安装apache软件
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"]
3、编写执行脚本内容
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
4、创建测试页面
echo "web test" > index.html
此时/opt/apache目录下应有三个文件
5、使用Dockerfile生成镜像
命令格式:docker build [选项] 路径
常用选项:
-t:指定镜像的标签信息
docker build -t httpd:centos . //注意别忘了末尾有"."
接上图
可以看到整个创建过程中,每运行一次Dockerfile中的指令,都会给初始镜像加上新的一层。
6、使用新的镜像运行容器
docker run -d -p 1216:80 httpd:centos
-p 选项实现从本地端口1216到容器中80端口的映射
7、测试
http://192.168.1.29:1216/
容器中的Apache服务已经成功运行
原文地址:http://blog.51cto.com/13641879/2159620