|
通过上一篇【Docker篇一】了解到Docker的三大核心概念:镜像、容器、仓库,以及镜像下载上传导入和导出操作,容器的创建以及启动,导入和导出。
本篇将从如下三个方面详解如何灵活的构建自己的容器,实现这些容器中数据的迁移,以及怎么样实现从网络中访问容器中的数据。
- 1)Docker镜像创建方法。
- 2)Docker数据管理。
- 3)Docker网络通信。
一、Docker镜像的创建方法
1、基于已有镜像创建
- 基于已有镜像创建主要适用的是docker commit命令。实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
命令格式:docker commit [选项] 容器ID/名称 仓库名称[标签]
常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
- 例:下面利用一个正在运行的docker容器,在该容器里修改完毕后打包成自己的镜像。
docker images
docker create -it 11426a19f1a2 /bin/bash
docker ps -a
docker start 4212c3d37718
docker commit -m "new" -a "test" 4212c3d37718 httpd:test
2、基于本地模板创建
- 通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为wget http://download.openvz.org/template/precreated
- 下面是使用docker导入命令将下载debian模板压缩包导入本地镜像的例子。
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - zhangsan:new
3、基于Dockerfile创建(推荐)
- 除了手动生成镜像之外,还可以使用Dockerfile自动生成镜像。
- Dockerfile结构大致分为四个部分
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
- 如上图所示,编写Dockerfile时,有严格的格式需要遵循,第一行必须是FROM指令说明所基于的镜像名称,之后使用MAINTAINER指令说明维护该镜像的用户信息,然后是镜像操作相关指令,如RUN,每运行一条指令,都会给基础镜像添加新的一层,最后使用CMD指令,来指定启动容器时要运行的命令操作。
- 例:利用Dockerfile创建httpd容器镜像,并且运行。
mkdir apache
cd apach
vim Dockerfile //注意名称必须是Dockerfile
#基于的基础镜像,若本地没有就会自动下载
FROM centos
#维护镜像的用户信息
MAINTAINER The porject
#镜像操作指令安装apache软件
RUN yum -y update //初始化yum仓库
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件,将本地与Dockerfile同级目录下的index.html文件放入容器对应路径下,需手动创建
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中,此脚本为启动服务脚本,不存在,需要自己创建
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
echo "NEVER SAY NEVER !" > index.html
vim run.sh
#!/bin/bash
rm -rf /run/httpd/* //初始化容器httpd服务,清楚缓存
exec /usr/sbin/apachectl -D FOREGROUND //启动容器中httpd服务
- 所有文件创建完毕后,在当前目录下执行命令,生成镜像。
docker build -t httpd:centos . //注意末尾有"."
- 新镜像容器运行,将宿主机的端口映射到容器中80端口,-p为指定端口号,-P为随机映射,第一次开启端口为32768
docker run -d -p 1216:80 httpd:centos //镜像名称与标签同在生成镜像时设定
WARNING:IPv4 forwarding is disabled.Networking will not work.
sysctl -w net.ipv4.ip_forward=1
二、私有仓库的建立
- 当使用docker push命令上传时,默认上传到官方公共仓库,对于一些公共仓库里面的镜像无法了解详细情况下,我们们需要建立私有仓库,方便我们选择更加合适自己的容器镜像。
- 首先需要在构建私有仓库的服务器上下载registry镜像。
docker pull registry
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete
c12c92d1c5a2: Pull complete
4fbc9b6835cc: Pull complete
765973b0f65f: Pull complete
3968771a7c3a: Pull complete
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest
- 之后需要在/etc/docker/目录下创建一个json文件,否则往往在自定义的私有仓库中上传镜像时,就会报错。
vim /etc/docker/deamon.json
{ "insecure-registries":["192.168.144.111:5000"]} //指定私有仓库地址和端口号
systemctl status docker.service
- 然后使用下载好的registry镜像启动一个容器,默认情况下仓库存放于容器内的/tmp/registry目录下,使用-v选项可以将本地目录挂载到容器内的/tmp/registry下使用,这样就不怕容器被删除后镜像也会随着消失。
docker create -it registry /bin/bash //为registry镜像创建容器
docker ps -a
docker start a1a68e5b9b6f //启动registry镜像容器
- 宿主机的/data/registry自动创建挂载容器中的/tmp/registry,当利用docker run命令时,宿主机中本不存在这个目录,也会自动创建。
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
- 将需要上传的镜像更改TAG,注意此处新镜像名称前必须加上私有仓库的地址与端口号
docker tag zhangsan:new 192.168.144.111:5000/zhangsan
docker push 192.168.144.111:5000/zhangsan
curl -XGET http://192.168.144.111:5000/v2/_catalog
三、Docker数据管理
为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操作,管理Docker容器中数据主要有两种方式,数据卷和数据卷容器。
3.1、数据卷
- 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移,数据卷的使用类似于在Linux下对目录进行的mount操作。
3.1.1、创建数据卷
在docker run 命令中使用-v选项可以在容器内创建数据,多次使用,可创建多个数据卷,使用--name选项可以给容器创建一个友好的自定义名称。
- 宿主机目录/var/www挂载到容器中的/data1
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
[root@202dd484fd62 /]# cd /data1/
[root@202dd484fd62 data1]# touch test123
[root@localhost ~]# ls /var/www/
3.2、数据卷容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器,数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用,使用方法如下:
首先需要创建一个容器作为数据卷容器,之后在其他容器创建使用时用--volumes-from挂载数据卷容器中的数据卷使用。
docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
docker run -it --volumes-from web100 --name db1 centos /bin/bash
四、Docker网络通信
4.1、端口映射
docker run -d -P httpd:centos
docker run -d -p 49280:80 httpd:centos
docker ps -a
6d461287c25d httpd:centos "/run.sh" 7 seconds ago Up 7 seconds 0.0.0.0:49280->80/tcp zen_swanson
4.2、容器互联
docker run -P --name web1 -it httpd:centos /bin/bash
docker run -P --name web2 --link web1:web1 -it httpd:centos /bin/bash
|
|
|
|
|
|
|