Docker镜像除了是Docker的核心技术以外,也是应用发布的标准格式。 一个完整的Docker镜像能够支撑一个Docker容器的运行,在Doker的整个使用过程当中,进入一个已经定型的容器以后,就能够在容器中进行操做,最多见的操做就是在容器中安装应用服务,若是要把已经安装的服务进行迁移,就须要把环境以及搭建的服务生成新的镜像。html
建立镜像的方法有三种,分别为基于已有镜像建立、基于本地模板建立以及基于Dockerfile建立。web
基于已有镜像建立主要使用docker commit命令。实质就是把一一个 容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。docker
命令格式: docker commit [选项] 容器ID 名称 仓库名称:[标签]apache
经常使用选项: -m:说明信息 -a:做者信息 -p:生成过程当中中止容器的运行
查看本地镜像,建立容器,将容器提交为新的镜像,须要记住该容器的ID号vim
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开源项目下载centos
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是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。bash
Dockerfile结构大体分为四个部分:基础镜像信息、维护者信息、镜像操做指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释。网络
在编写Dockerfile时,有严格的格式须要遵循:第一行必须使用FROM指令指明所基于的镜像名称;以后使用MAINTAINER指令说明维护该镜像的用户信息;而后是镜像操做相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用CMD指令,开指定启动容器时要运行的命令操做。ide
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命令:指定所生成的镜像做为一个基础镜像时所要运行的命令
mkdir /opt/apache cd /opt/apache
vim Dockerfile #基于的基础镜像 FROM centos #维护镜像的用户信息 MAINTAINER The porject <cloud-ops@centos.org> #镜像操做指令安装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"]
vim run.sh #!/bin/bash rm -rf /run/httpd/* exec /usr/sbin/apachectl -D FOREGROUND
echo "web test" > index.html
此时/opt/apache目录下应有三个文件测试
命令格式:docker build [选项] 路径
经常使用选项: -t:指定镜像的标签信息
docker build -t httpd:centos . //注意别忘了末尾有"."
接上图
能够看到整个建立过程当中,每运行一次Dockerfile中的指令,都会给初始镜像加上新的一层。
docker run -d -p 1216:80 httpd:centos
-p 选项实现从本地端口1216到容器中80端口的映射
http://192.168.1.29:1216/
容器中的Apache服务已经成功运行
ps:建立镜像过程当中遇到以下警告: WARNING: IPv4 forwarding is disabled. Networking will not work. 一条命令解决问题:sysctl -w net.ipv4.ip_forward=1