Docker镜像除了是Docker的核心技术以外也是应用发布的标准格式。一个完整的Docker镜像能够支撑一个Docker容器的运行,在Docker的整个使用过程当中,进入一个已经定型的容器以后,就能够在容器中进行操做,最多见的操做就是在容器中安装应用程序,若是要把已经安装的服务进行迁移,就须要把环境以及搭建的服务生成新的镜像。
镜像的生方式分为三种,分别为基于已有镜像建立、基于本地模板建立以及基于dockerfile建立。html
基于已有镜像建立主要使用docker commit 命令。实质上是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
在建立新的镜像时,首先第一步是启动镜像,在容器中作修改,最后将修完以后的容器提交为新的镜像,这里我是实验演示,因此就没有进去容器进行修改。nginx
docker commit -m "new" -a "nginx1" ac3b61096300 nginx1:test
经常使用选项介绍:web
经过导入操做系统模板文件能够生成镜像,模板可从OPENVZ开源项目下载
示例:
使用docker命令将下载的debian模板压缩包导入为本地镜像docker
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:latest
Dockerfile是由一组指令组成的文件,其中每条指令对应的Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。Dockerfile结构大体分为四部分:基础镜像信息、维护者信息、镜像操做指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用"#"号开头的注释。
在编写Dockerfile时,有严格的格式须要遵循:apache
Dockerfile建立操做指令及含义json
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所所基于的镜像,第一条指令必须为FROM指令,每建立一个镜像就须要一条FROM指令 |
MAINTAINER | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD命令 | 指定启动容器时要于运行的命令或者脚本,Dockerfile只能有一条CMD命令,若是指定多条,则只有最后一条被执行 |
EXPOSE端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY源文件/目标 目标文件/目录 | 将本地主机上的源文件/目录复制到目标地点,源文件目录要与Dockerfile在相同的目录中 |
VOLUME["目录"] | 在容器中建立一个挂载点 |
USER用户名/UID | 指定运行容器时的用户 |
WORKDIR路径 | 为后续的RUN、CMD、ENTRYPOINT指定工做目录 |
ONBUILD命令 | 指定所生成的镜像做为一个基础镜像时所要运行的命令 |
示例:
建立一个web网站(httpd)镜像,以centos做为基础镜像vim
mkdir apache cd apache
vim Dockerfile #基于的基础镜像 FROM centos #维护镜像的用户信息 MAINTAINER The porject <cloud-ops@centos.org> #镜像操做指令安装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"]
vim run.sh #!/bin/bash //声明 rm -rf /run/httpd/* //清理httpd缓存 exec /usr/sbin/apachectl -D FOREGROUND //启动httpd服务
echo "this is apache test web" > index.html
docker build -t httpd:centos . //最后又一个空格和“.”不要遗忘,选项-t指定镜像的标签信息
docker run -d -p 1234:80 httpd:centos //-p选项实现从本地1234端口到容器中80端口的映射
docker服务启动时定义的自定义链DOCKER因为某种缘由被清掉重启docker服务便可从新生成自定义链DOCKERcentos
systemctl restart docker.service
docker pull registry
vim /etc/docker/daemon.json { "insecure-registries":["172.16.10.22:5000"]}
systemctl restart docker.service
docker create -it registry /bin/bash
docker start 5f817c015faa
将本地目录挂载到容器仓库的默认存储地址中,这样即便容器被删除,镜像仍是会有保存。浏览器
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry //宿主机的/data/registry挂载容器中的/tmp/registry 宿主机中的目录会自动建立
docker tag nginx 172.16.10.22:5000/nginx
docker push 172.16.10.22:5000/nginx
curl http://172.16.10.22:5000/v2/_catalog
管理Docker容器中数据主要有两种方式:数据卷和数据卷容器缓存
数据卷是一个共容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操做马上可见,而且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
在docker run命令中使用-v 选项能够在容器中建立数据卷。屡次使用-v能够建立多个数据卷。使用--name选项能够为容器建立一个简单的自定义名称
docker run -d -v /data1 -v /data2 --name web nginx:latest
在容器数据卷中建立文件,在本地文件夹中可见,一样的在本地文件夹中建立文件,容器中仍可见,实现了从宿主机到容器,容器到宿主机的数据迁移。
docker run -v /var/www:/data --name web1 -it nginx /bin/bash //主机目录不存在时会自动建立
若是须要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提够数据卷给其余容器使用。首先需建立一个容器做为数据卷容器,以后再建立时使用--volumes-from挂载数据卷容器中的数据卷使用。
以前建立好的数据卷容器web,其中所建立的数据卷分贝挂载在了/data1和/data2目录上,建立新容器来挂载数据卷容器中的数据卷。
docker run -it --volumes-from web --name db1 nginx /bin/bash
在启动容器的时候,若是不指定对应的端口,在容器外将没法经过网络来访问容器内的服务。Docker提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口即可访问容器内的服务。在使用docker run命令是接选项设置端口映射,P系统分配端口映射,p自定义指定端口映射。
docker run -d -P httpd:latest
docker run -d -p 12345:80 --name web httpd:latest
容器互联时经过容器的名称在容器间创建一条专门的网络通讯隧道从而实现容器的互联。简而言之,就是在源容器和接受容器之间创建一条隧道,接收容器能够看到源容器指定的信息。
docker run -d -P --name web1 httpd:latest
docker run -d -P --name web2 --link web1:web httpd:latest //--link web1:web web1是要源容器的名称:web是这个链接的名称
ping //测试连通性