Docker的公共仓库提供了大量的容器模板,但是实际生产环境,需要根据需要定制各种安装容器模板,并且结合私有Docker Registry大规模按需部署OS环境。

Docker的模板镜像可以从公共仓库下载最基本的OS容器模板,按需安装软件,然后以类似git这样的命令提交到Docker Regsitry中,提供后续部署。

下载初始docker镜像

Docker Index 获取CentOS镜像 - 这些Docker镜像是公共的基础镜像,只包含最基本的操作系统,启动后需要 docker环境CentOS镜像定制才能适合实际使用

docker pull centos

可以看到本地存放了以下镜像

docker images centos

输出显示如下

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos7             70214e5d0a90        3 days ago          224 MB
centos              latest              70214e5d0a90        3 days ago          224 MB
centos              centos5             d22d3225b491        3 days ago          467 MB
centos              centos6             68eb857ffb51        3 days ago          212.7 MB

使用centos镜像

可以使用简单的启动命令启动centos容器 - 默认是启动centos7:

docker run -i -t centos /bin/bash

启动后的centos 7的容器只是一个基本的系统,需要 docker环境CentOS镜像定制 后,安装合适的软件包之后,才用于实际生产环境。

定制的虚拟容器需要上传到部署的私有Docker Registry上,这样后续部署的Docker虚拟容器就可以直接使用定制的容器,不需要重复安装软件包。

如果要启动CentOS 6则使用如下命令:

docker run -t -i centos:centos6 /bin/bash

参数说明:

-i, --interactive=false    Keep stdin open even if not attached
-t, --tty=false            Allocate a pseudo-tty

要在启动后能够访问控制终端,必须使用 -t 参数

启动时候要指定虚拟容器的名字,则添加 -h 参数:

docker run -h web-1 -t -i centos:centos6 /bin/bash

默认Docker网络

上述 docker run -i -t centos /bin/bash 命令启动的容器将使用DHCP获取到IP地址,终端登录虚拟容器后可以使用 ip 命令获取主机IP信息 - 对于生产网络的静态IP地址分配,可以使用 通过脚本设置Docker容器网络

ip addr list

由于目前我们是定制自己的镜像,所以暂时不需要关注网络配置。

配置DNS解析

在完成了 docker环境CentOS镜像定制 后,提交镜像模板到私有Docker Registry前,我还部署dnsmasq提供本地网络主机解析,以便能够解析 docker-repo.huatai.me 域名

提交容器模板

在前述运行了docker容器并完成基础软件定制之后,我们需要将这个容器提交到docker registry中作为模板。

首先检查运行的容器的ID

docker ps

输出显示出当前运行的容器的ID,映像以及名字(如果没有在创建容器的时候指定名字,则为随机创建名字)

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0e505e3392bb        centos:centos7      "/bin/bash"         7 hours ago         Up 7 hours                              distracted_pasteur

在前述运行了docker容器并完成基础软件定制之后,我们需要将这个容器提交到docker registry中作为模板。

首先检查运行的容器的ID

docker ps

输出显示出当前运行的容器的ID,映像以及名字(如果没有在创建容器的时候指定名字,则为随机创建名字)

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0e505e3392bb        centos:centos7      "/bin/bash"         7 hours ago         Up 7 hours                              distracted_pasteur

以上可以看到运行容器ID是 0e505e3392bb 这个就是我们要提交成映像的容器(已经定制了基础软件包)

使用 docker commit 命令将容器副本提交为一个映像

docker commit -m="Installed base apps" -a="huatai" 0e505e3392bb docker-repo.huatai.me/centos:centos7_base_apps

-m 参数表示提交说明,类似git的commit
-a 表示更新的提交人

提示信息显示

ffdb861bfdc774a8e7dd902987d8f69b76c7c6fb76e01e5ff94ec253fcef6cc3

检查映像,可以看到新增加了一个映像 docker-repo.huatai.me/centos:centos7_base_apps

docker images

输出显示

REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker-repo.huatai.me/centos   centos7_base_apps   ffdb861bfdc7        About an hour ago   451.3 MB
centos                         latest              70214e5d0a90        4 weeks ago         224 MB
centos                         centos7             70214e5d0a90        4 weeks ago         224 MB
centos                         centos5             d22d3225b491        4 weeks ago         467 MB
centos                         centos6             68eb857ffb51        4 weeks ago         212.7 MB

完成映像制作之后,就可以提交到前述 部署的私有Docker Registry

docker push docker-repo.huatai.me/centos:centos7_base_apps

启动模板vm

使用已经推送到私有仓库的模板 docker-repo.huatai.me/centos:centos7_base_apps 可以快速创建可运行的虚拟机

启动名为 centos7-test 的模板虚拟机:

docker run -h centos7-test --name="centos7-test" -t -i docker-repo.huatai.me/centos:centos7_base_apps /bin/bash

容器启动是直接 attach 到容器终端的,相当于直接访问了控制台。

虚拟容器的网络默认是NAT模式,从动态DHCP获取IP地址。不过,实际使用环境,为了方便使用固定IP地址,采用的是配置docker容器静态IP地址