【Docker篇之二】数据管理与网络通讯

经过上一篇【Docker篇一】了解到Docker的三大核心概念:镜像、容器、仓库,以及镜像下载上传导入和导出操做,容器的建立以及启动,导入和导出。
本篇将从以下三个方面详解如何灵活的构建本身的容器,实现这些容器中数据的迁移,以及怎么样实现从网络中访问容器中的数据。html

  • 1)Docker镜像建立方法。
  • 2)Docker数据管理。
  • 3)Docker网络通讯。

1、Docker镜像的建立方法

一、基于已有镜像建立

  • 基于已有镜像建立主要适用的是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:testweb

【Docker篇之二】数据管理与网络通讯

二、基于本地模板建立

  • 经过导入操做系统模板文件能够生成镜像,模板能够从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:newdocker

【Docker篇之二】数据管理与网络通讯

三、基于Dockerfile建立(推荐)

  • 除了手动生成镜像以外,还可使用Dockerfile自动生成镜像。
  • Dockerfile结构大体分为四个部分

基础镜像信息
维护者信息
镜像操做指令
容器启动时执行指令apache

  • Dockerfile操做指令以下图:

【Docker篇之二】数据管理与网络通讯

  • 如上图所示,编写Dockerfile时,有严格的格式须要遵循,第一行必须是FROM指令说明所基于的镜像名称,以后使用MAINTAINER指令说明维护该镜像的用户信息,而后是镜像操做相关指令,如RUN,每运行一条指令,都会给基础镜像添加新的一层,最后使用CMD指令,来指定启动容器时要运行的命令操做。json

  • 例:利用Dockerfile建立httpd容器镜像,而且运行。

mkdir apache
cd apach
vim Dockerfile //注意名称必须是Dockerfilevim

#基于的基础镜像,若本地没有就会自动下载
FROM centos

#维护镜像的用户信息
MAINTAINER The porject <cloud-ops@centos.org>

#镜像操做指令安装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.htmlcentos

  • 建立服务启动脚本

vim run.sh缓存

#!/bin/bash
rm -rf /run/httpd/*     //初始化容器httpd服务,清楚缓存
exec /usr/sbin/apachectl -D FOREGROUND   //启动容器中httpd服务
  • 全部文件建立完毕后,在当前目录下执行命令,生成镜像。

docker build -t httpd:centos . //注意末尾有"."bash

  • 新镜像容器运行,将宿主机的端口映射到容器中80端口,-p为指定端口号,-P为随机映射,第一次开启端口为32768

docker run -d -p 1216:80 httpd:centos //镜像名称与标签同在生成镜像时设定服务器

【Docker篇之二】数据管理与网络通讯

  • 注:若是运行容器时,提示:

WARNING:IPv4 forwarding is disabled.Networking will not work.

  • 须要打开路由转发功能,而后运行容器便可。

sysctl -w net.ipv4.ip_forward=1

2、私有仓库的创建

  • 当使用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"]}    //指定私有仓库地址和端口号
  • 重启docker服务

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

【Docker篇之二】数据管理与网络通讯

  • 获取私有仓库列表

curl -XGET http://192.168.144.111:5000/v2/_catalog

【Docker篇之二】数据管理与网络通讯

3、Docker数据管理

为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操做,管理Docker容器中数据主要有两种方式,数据卷和数据卷容器。

3.一、数据卷

  • 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操做马上可见,而且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移,数据卷的使用相似于在Linux下对目录进行的mount操做。

3.1.一、建立数据卷

在docker run 命令中使用-v选项能够在容器内建立数据,屡次使用,可建立多个数据卷,使用--name选项能够给容器建立一个友好的自定义名称。

  • 宿主机目录/var/www挂载到容器中的/data1

docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

【Docker篇之二】数据管理与网络通讯

[root@202dd484fd62 /]# cd /data1/

[root@202dd484fd62 data1]# touch test123

  • 返回宿主机进行查看

[root@localhost ~]# ls /var/www/

【Docker篇之二】数据管理与网络通讯

3.二、数据卷容器

若是须要在容器之间共享一些数据,最简单的方法就是使用数据卷容器,数据卷容器就是一个普通的容器,专门提供数据卷给其余容器挂载使用,使用方法以下:
首先须要建立一个容器做为数据卷容器,以后在其余容器建立使用时用--volumes-from挂载数据卷容器中的数据卷使用。

  • 建立数据卷容器

docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash

【Docker篇之二】数据管理与网络通讯

  • 新容器挂载数据卷容器

docker run -it --volumes-from web100 --name db1 centos /bin/bash

【Docker篇之二】数据管理与网络通讯
【Docker篇之二】数据管理与网络通讯
【Docker篇之二】数据管理与网络通讯

4、Docker网络通讯

4.一、端口映射

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.二、容器互联

docker run -P --name web1 -it httpd:centos /bin/bash

docker run -P --name web2 --link web1:web1 -it httpd:centos /bin/bash

【Docker篇之二】数据管理与网络通讯

相关文章
相关标签/搜索