本节书摘来自异步社区《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》一书中的第2章,第2.1节,作者: 【美】Christopher Negus(克里斯托弗•尼格斯)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第2章 搭建容器运行时环境
自构建之初,Docker就运行在Linux之上。但与虚拟机不同,虚拟机包含了整个操作系统,而容器本身只是依靠单独的操作系统为其提供运行环境。这就是说,我们有诸多可选的方式来创建Docker的工作环境。具体方式包括以下这些。
标准Linux:多个主要的Linux发行版已将Docker打包在其中。如需最新的Docker特性,只要安装相应Linux发行版的最新版本即可。切记,Docker与操作系统有着密切的联系,因此,Linux的早期版本可能并不包含Docker运行所需的全部特性。本书将介绍在流行的Linux发行版(如Ubuntu、Fedora和Red Hat企业版)上搭建Docker的方法。至于其他Linux系统上的Docker安装,本书会提供相关说明的链接。
Microsoft Windows、Mac OS X或其他通过虚拟机运行的方式:Docker不能直接在Windows或Mac系统上运行。但是,如果Windows或Mac系统的版本能够运行虚拟机,并且硬件也足以支撑虚拟机的运行,就能够安装Linux虚拟机并通过它来运行Docker。但要注意,如果计算机的处理能力和RAM不够强劲,那么这种运行Docker的方式体验并不是最好的。但是,如果你拥有最新的Windows或Mac系统并且硬件够用,Docker应该可以很好地运行。
容器专用Linux:运行容器并不需要完整的桌面或服务器Linux系统。实际上,容器原本就是为了容纳与其一同运行所需的软件,因此底层的Linux系统可以非常轻量级。像Project Atomic和CoreOS这样的Linux发行版尤其适合为容器提供运行时环境。你可能想在容器开发阶段使用标准Linux,这样可以非常容易获取所需的开发工具。之后使用Project Atomic或CoreOS来部署这些容器——要么直接部署在硬件上,要么部署在亚马逊的EC2或谷歌云平台(Google Cloud Platform)这样的云环境中。
本章将介绍如何按刚刚描述的那样准备计算机系统以运行Docker容器。一旦系统准备就绪,就可以跟随本书之后的示例进行容器的运行、管理、部署和编排。
2.1 标准Linux系统的Docker配置
如果刚刚开始接触Linux,建议安装一个带桌面的标准Linux发行版(带桌面的服务器、桌面系统或者是工作站)。如此,在创建和运行容器的过程中,就有一整套开发、调试和监控的工具。当准备长久运行容器时,可以考虑使用Project Atomic或CoreOS来部署容器。
在Linux中使用Docker,首要的是包含了docker命令的软件包。在Ubuntu中,包含docker命令的软件包叫docker.io。在Fedora中,这个软件包之前叫docker-io,这是为了避免与另一个称为docker的软件包冲突——那个软件包提供了应用程序在桌面停驻的特性。目前,最新的Fedora已将包含docker命令的软件包命名为docker。在Red Hat企业版中,Docker容器的软件包就直接称为docker。
2.1.1 Ubuntu的Docker配置
在Linux爱好者中,Ubuntu是一款流行的Linux发行版。除提供标准桌面系统外,Ubuntu也有轻量级桌面系统(如Xubuntu和Lubuntu)以及专门用于教育和多媒体的系统。虽然Ubuntu大约每6个月就会发布新版本,其中多数只会得到9个月的支持,但有些发布是长期支持(Long Term Support,LTS)版本,它们将得到5年的支持。
为了在Ubuntu中使用Docker,要从Ubuntu最新的LTS版本着手。我使用的是Ubuntu 14.04桌面版(最新的LTS版本)。请访问如下链接,获取Ubuntu14.04桌面系统的live版或安装媒介以及相关说明。
下载Ubuntu。访问www.ubuntu.com/download/destop,下载与你的计算机匹配的ISO映像文件。对于多数新计算机,应该使用64位PC版,而对于比较老的计算机或者配置低的计算机,请下载32位的ISO映像文件。
安装Ubuntu。参考“安装Ubuntu 14.04 LTS”(www.ubuntu.com/download/desktop/ install-ubuntu-desktop)中的说明来安装该版本的Ubuntu。
1.在Ubuntu中安装Docker(docker.io软件包)
一旦安装好Ubuntu并准备继续,请以系统所有者的身份登录系统,并通过以下步骤让docker.io服务运行起来。
(1)更新软件包列表。在开始安装Docker前,需要先更新Ubuntu的软件包列表。
$ sudo apt-get update
...
Reading package lists... Done
(2)安装docker.io软件包。在Ubuntu中,Docker是由docker.io软件包提供。安装该软件包时,其依赖的软件包也会同时安装:
$ sudo apt-get install docker.io
(3)启动docker.io服务。Docker服务应该是自动启动的。为了确认其已启动,键入下面的命令:
$ sudo service docker.io status
docker.io start/running, process 1236
输出显示docker.io服务已经运行。接下来要做的是研究一下docker.io软件包的内容。
2.探查Ubuntu的docker.io软件包
为了对构成Docker的组件有切身的体会,我们先看看docker.io软件包的内容。使用下面的命令列出docker.io软件包的内容:
$ sudo dpkg-query -L docker.io | less
/usr
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/docker.io.1.gz
/usr/share/docker.io
/usr/share/docker.io/contrib
/usr/share/docker.io/contrib/mkimage-alpine.sh
...
/usr/share/doc
/usr/share/doc/docker.io
/usr/share/doc/docker.io/README.Debian
/usr/share/zsh
/usr/share/zsh/vendor-completions
/usr/share/zsh/vendor-completions/_docker.io
/usr/bin
/usr/bin/docker
/usr/lib
/usr/lib/docker.io
/usr/lib/docker.io/dockerinit
/etc
/etc/bash_completion.d
/etc/bash_completion.d/docker.io
/etc/init
/etc/init/docker.io.conf
/etc/init.d
/etc/init.d/docker.io
/etc/default
/etc/default/docker.io
/lib
/lib/udev
/lib/udev/rules.d
/lib/udev/rules.d/80-docker.io.rules docker-io
/lib/systemd
/lib/systemd/system
/lib/systemd/system/docker.io.service
/usr/bin/docker.io
docker.io软件包自带的文档中包含了一个描述docker命令的联机帮助页(键入man docker来查看它)以及README文件,这些文件位于/usr/share/doc/docker.io目录中。到读者阅读本书时,docker.io软件包应该会包含更多的联机帮助页。
/usr/share/docker.io/contrib目录下存放了各种脚本,有些可以用来创建最小的文件系统,而另一些则可以完成其他任务,如创建基础Docker映像文件。这个目录下的各个子目录中存放了用于构建、导入和运行Docker映像的Dockerfile文件。
docker命令提供了Tab命令补全。用于bash的Tab命令补全文件(/etc/bash_completion.d/ docker)和zsh的Tab命令补全文件(/usr/share/zsh/vendor-completions/_docker.io)也来自docker.io软件包。
docker.io软件包提供的主要命令就是docker(/usr/bin/docker)。docker命令用来创建、操作和维护Docker映像文件和容器。这个docker命令还作为守护进程运行,来提供Docker服务。
对于Docker服务,docker.io软件包中剩余的多数文件与Docker服务的启动方式相关。无论你的系统是使用Upstart(init)还是systemd来初始化操作系统,对应的Docker服务启动文件都已包含在docker.io软件包中。
目录/var/lib/docker并不是docker.io软件包的一部分,但在安装Docker时会创建该目录。请密切关注该目录。当创建docker映像文件和容器时,它们会被保存在该目录结构中,因此,要确保不要耗尽其所在的磁盘空间。
此时,Ubuntu已经为使用Docker做好了准备。如果想开始使用Docker,可以直接跳到第3章。
2.1.2 Fedora的Docker配置
Fedora是Red Hat公司赞助的免费、前沿的Linux发行版。Fedora大约每6个月发布一次新版本,其被当作新软件的实验场。
许多人在工作中使用Red Hat企业版Linux,他们会在自己的笔记本或家里的台式机上安装Fedora。这是因为Fedora不仅提供了软件开发工具,以及一系列服务器和系统管理软件,还提供了大量桌面工具和有趣的东西(如游戏)——那些你会为自己的个人计算机安装的软件。
如果打算在Fedora上使用Docker,建议安装最新的Fedora。我就下载并安装了Fedora workstation live ISO。Docker并不需要桌面系统,因此可以只安装一个基本系统,然后完全使用命令行来工作。
要在Fedora中使用Docker,需要先安装Fedora和docker软件包。安装完成后,就能够启动Docker服务,并开始获取Docker映像文件,构建自己的映像文件,以及管理由这些映像文件生成的容器。
要获取最新的Fedora Workstation live版或安装媒介,以及相关说明,访问如下链接。
下载Fedora。访问https://getfedora.org/
,选择Workstation。点击“马上下载”(Download Now)按钮,之后选择64位Fedora Workstation安装介质并点击“下载”(Download)按钮开始下载。(如果你的计算机是32位的,或者你需要不同类型的安装,如服务器或云,请选择其他映像文件。)
安装Fedora。参考安装指南来帮助安装Fedora(如果有最新的Fedora可用,请使用相应的安装指南):http://docs.fedoraproject.org/en-US/Fedora/22/html/Installation_Guide/
。
1.在Fedora中安装Docker(docker软件包)
Fedora安装好后,登录系统。使用root用户或sudo来运行下面的命令。在安装Docker前,首先作为root用户更新Fedora软件(yum update),然后使用yum install来安装docker软件包(在早前的Fedora中,是docker.io软件包),并按如下方法启动Docker服务(另一个选择是,在最新的Fedora发行版中,可以使用dnf命令代替yum来安装软件)。
(1)更新软件包。运行下面的命令来安装最新的Fedora软件:
# yum update
(2)安装docker软件包。早期版本的Fedora中,Docker是由docker.io软件包提供的。现在,这个软件包可能已经叫docker了。按下面的方法安装该软件包,其依赖的软件包也会一并安装:
# yum install docker
(3)启动Docker服务。Fedora并不会自动启动Docker服务。输入下面的命令,启用Docker服务并立即启动它:
# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ docker.
service to /usr/lib/systemd/system/docker.service.
# systemctl start docker.service
(4)检查Docker服务的状态。输入如下命令,确保Docker服务已运行:
# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Active: active (running) since Sun 2015-05-17 10:05:32 EDT; 2min ago
Docs: http://docs.docker.com
Main PID: 3405 (docker)
CGroup: /system.slice/docker.service
└─3405 /usr/bin/docker -d --selinux-enabled
输出显示docker.service已经启用并处于活动状态。实际的服务由docker命令组成(/usr/bin/docker),以守护进程的方式运行(-d),并且启用了SELinux(--selinux-enabled)。接下来,看一看docker软件包的内容。
2.探查Fedora的docker软件包
安装docker后,在docker软件包(或docker.io软件包)上执行rpm -ql命令来查看该软件包的内容。这能让你初步了解如何使用Docker:
# rpm -ql docker | less
/etc/docker
/etc/sysconfig/docker
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/udev/rules.d/80-docker.rules
/usr/bin/docker
/usr/bin/docker-storage-setup
/usr/lib/systemd/system/docker.service
/usr/libexec/docker
/usr/libexec/docker/dockerinit
/usr/share/bash-completion/completions/docker
...
/usr/share/doc/docker/README.md
/usr/share/man/man1/docker-attach.1.gz
/usr/share/man/man1/docker-build.1.gz
/usr/share/man/man1/docker-commit.1.gz
...
多数文件与Ubuntu的docker.io软件包中的文件相同。有些文件用来启动Docker服务(最新的Fedora发行版仅使用systemd),也有docker命令自身的文件(/usr/bin/docker)。
同样,docker软件包提供了一个用于Tab命令补全的文件,当在bash shell中使用docker命令时,它可以自动补全所输入的命令。能够补全的内容包括docker的子命令和选项、容器和镜像的名字及ID,以及镜像库的名字和标签。
下面介绍docker软件包中一些特定于Fedora系统的文件。
/etc/sysconfig/docker:当docker命令作为服务的守护进程来运行时,这个文件用来收集提供给docker命令的选项。默认情况下,仅增加--selinux-enabled选项来启用针对Docker的SELinux支持。该文件中的一项配置(DOCKERCERT PATH)将启动Docker服务所需的密钥文件存放目录指定到/etc/docker。
/etc/sysconfi/docker-network:该文件用来收集传给Docker服务的网络选项。
/etc/sysconfig/docker-storage:该文件用来改变Docker服务存储数据的方式。默认会使用挂载到/var/lib/docker目录的一个稀疏的回送(loopback)文件。可以选择使用原始存储设备来保存元数据和数据。请阅读该文件来了解如何进行设置。按这种方式使用原始存储设备不但能够提高性能,而且可以摆脱回送文件100 GB的最大存储限制。
/etc/udev/rules.d/80-docker.rules:该文件用来告知udev服务配置Docker服务所使用的设备映射文件,Docker服务使用该设备映射文件来访问容器所需的宿主机特性。(Ubuntu的Docker软件包含有类似的udev文件。)
/usr/share/doc:在/usr/share/doc/docker目录中存放有来自Docker项目的文档。这既有软件变更和软件许可方面的信息,也有关于项目自身的README文件。
/usr/share/man文档:docker命令的联机帮助文档分散在多个docker页中,这些联机帮助文档按子命令组织,存储在第1部分(man1)。例如,要查看docker命令的build选项(docker build),只要输入man docker-build命令即可。第5部分只有一个联机帮助页,它描述了用来构建Docker镜像的Dockerfile的结构。(输入man Dockerfile来查看该文件。)
docker软件包已安装就位,可以直接跳到第3章开始使用docker命令。
2.1.3 Red Hat Enterprise Linux的Docker配置
Red Hat Enterprise Linux(RHEL)是由Red Hat制作的基于订阅的Linux发行版,其旨在提供一个经过测试的、稳定的Linux发行版,并结合了来自Red Hat的不同级别的客户支持。在安全性和稳定性至关重要的情况下,整个应用程序开发生命周期中的系统通常都会使用Red Hat Enterprise Linux,这也包括生产环境的部署。
与Fedora类似,Red Hat Enterprise Linux是基于RPM的,但安装Red Hat Enterprise Linux和Docker时有些步骤与Fedora不同。
在下载和安装Red Hat Enterprise Linux之前,要确保你拥有有效的订阅或已报名获取了用于评估的订阅。访问下面的链接来了解如何下载和安装RHEL。
下载RHEL。访问https://access.redhat.com/downloads/
,点击Red Hat Enterprise Linux最右侧的按钮,并在弹出的菜单中选择Download Latest(Server),或者点击Red Hat Enterprise Linux链接并选择适合你的安装介质。如果网站提示你登录,而你尚未获得Red Hat的订阅,请点击Evaluation(评估)按钮来报名获取评估订阅。要注意的是,你需要软件的RHEL服务器版,因为其他版本RHEL不包含Docker。
安装RHEL。访问Red Hat Enterprise Linux文档页面(https://access.redhat.com/ documentation/en/red-hat-enterprise-linux/
),选择Installation Guide(安装指南)。安装指南介绍了如何启动刚下载的安装媒介,以及各种不同的软件安装方法。
一旦安装好RHEL,需要注册系统、安装docker,并启动Docker服务,具体描述如下。
1.在Red Hat Enterprise Linux中安装Docker(docker软件包)
假设你已有Red Had Enterprise Linux的订阅,并有Red Hat客户门户(customer portal)的账号,按照下列步骤就能订阅系统并为其添加docker。
(1)注册和订阅RHEL。使用订阅管理器(subscription manager)来启用Red Hat订阅和获取docker软件包所要用的软件库,以及之后要用到的其他相关软件包。执行下列命令,注意替换为你的Red Hat用户名,并(在提示时)输入密码:
# subscription-manager register --username=rhnuser --auto-attach
Password:
# subscription-manager repos --enable=rhel-7-server-extras-rpms
# subscription-manager repos --enable=rhel-7-server-optional-rpms
(2)更新软件包。RHEL 7系统取得适当的资格后,运行如下命令来将所有已安装的软件包更新到最新版,并重启系统:
# yum update
# reboot
(3)安装docker。系统重启后,键入下面的命令来安装docker软件包:
# yum install docker
(4)启动并启用Docker服务。Docker安装后,只要启动并启用Docker服务就可以开始使用Docker了。在RHEL 7中,输入下面的命令来启动和启用Docker服务:
# systemctl start docker.service
# systemctl enable docker.service
# systemctl status docker.service
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Active: active (running) since Sun 2015-05-17 16:52:33 EDT; 8s ago
Docs: http://docs.docker.com
Main PID: 32147 (docker)
CGroup: /system.slice/docker.service
└─32147 /usr/bin/docker -d --selinux-enabled \
--add-registry registry.access.redhat.com
通过这个输出,可以看到Docker服务已启用并处于活动状态。提供服务的docker命令(/usr/bin/docker)启动时接收了这些参数,作为守护进程启动执行(-d),启用SELinux,并添加了docker用来搜索的容器registry(这里是registry.access.redhat.com)。
现在,docker软件包已经安装好,Docker服务也已经运行,接下来熟悉一下RHEL的docker软件包的内容。
2.探查RHEL的docker软件包
运行下面的命令查看docker软件包的内容:
# rpm -ql docker
/etc/docker
/etc/docker/certs.d
/etc/docker/certs.d/redhat.com
/etc/docker/certs.d/redhat.com/redhat-ca.crt
/etc/docker/certs.d/redhat.io
/etc/docker/certs.d/redhat.io/redhat-ca.crt
...
/usr/share/man/man1/docker-attach.1.gz
/usr/share/man/man1/docker-build.1.gz
/usr/share/man/man1/docker-commit.1.gz
...
/usr/share/man/man5/Dockerfile.5.gz
/usr/share/rhel
/usr/share/rhel/secrets
/usr/share/rhel/secrets/etc-pki-entitlement
/usr/share/rhel/secrets/rhel7.repo
/usr/share/rhel/secrets/rhsm
...
/usr/share/vim/vimfiles/doc
/usr/share/vim/vimfiles/doc/dockerfile.txt
/usr/share/vim/vimfiles/ftdetect
/usr/share/vim/vimfiles/ftdetect/dockerfile.vim
RHEL的docker软件包与Fedora的docker软件包几乎完全相同,因此,可以参考之前在Fedora中安装docker软件包的内容,来了解这些组件的描述。这里只描述了特定于RHEL的docker软件包组件。
Certificates:RHEL的docker软件包已做过一些配置,它并未使用Docker Hub作为其registry。实际上,对于官方的RHEL容器镜像,Red Hat使用了自己的registry。目录/etc/docker/certs.d中保存了Docker服务使用的证书,Docker服务使用这些证书来确保其在与Red Hat的registry进行通信。
Secrets:目录/usr/share/rhel/secrets中存放的文件将会复制到系统运行的容器中。特别是,RHEL的docker软件包会将容器使用Red Hat的订阅管理所需要的文件放在secrets目录下。这些与订阅管理相关的文件使容器可以使用宿主机的订阅权限来安装和管理容器自己的RPM包,而无需消耗额外的订阅。
vimfiles:当使用vim命令来编辑Dockerfile时,目录/usr/share/vim/vimfiles/中的文件提供了语法高亮。这有助于Dockerfile文件的创建和编辑。
2.1.4 其他操作系统的Docker配置
之前提到过,Docker不仅仅可以用于上面介绍的这些操作系统。如需在其他操作系统或云环境中安装Docker,参考下面的Docker安装过程说明。
在Mac OS X上安装Docker。请使用Mac OS X 10.6或更新的版本,如下安装过程使用了包含Boot2Docker工具(https://github.com/boot2docker/boot2docker/releases
)的ISO镜像,通过该工具,其在Mac上创建了一个运行在VirtualBox中的轻量级Linux虚拟机:https://docs.docker.com/installation/mac/
在Microsoft Windows上安装Docker。对于使用Windows 7.1或8(以及其他版本)的系统,如果你的计算机支持硬件虚拟化,可以使用下面链接给出的安装过程。重申一下,Docker只能在Linux中运行,因此这个安装过程要使用Boot2Docker工具创建一个Linux虚拟机,而你可以用这个虚拟机来尝试Docker:https://docs.docker.com/installation/windows/
在CentOS上安装Docker。CentOS上运行Docker与Red Hat Enterprise Linux差不多,但无需支付订阅费用。需要注意的是,CentOS并未提供任何保障,而且会在特性和安全补丁方面落后于RHEL。参考下面的链接在CentOS上安装Docker:https://docs.docker.com/installation/centos/
在Debian上安装Docker。参考下面的说明在Debian GNU/Linux系统上安装Docker:https://docs.docker.com/installation/debian/
在SUSE上安装Docker。下面的说明描述了在SUSE上安装Docker的过程,既包括openSUSE,也包括SUSE Linux Enterprise:https://docs.docker.com/installation/SUSE/
如果这里没有涉及你使用的操作系统,请访问Docker的安装页面(https://docs.docker. com/installation/
),了解在其他操作系统上安装Docker的相关说明。如果你打算亲自动手为自己的操作系统组装Docker,请参考Docker的二进制文档页面(https://docs.docker.com/ installation/binaries/
)。
还有一类Linux系统的Docker使用尚未涉及,这就是专为运行容器而设计的Linux系统。接下来将介绍如何搭建Project Atomic和CoreOS操作系统,使其提供一个容器专用的运行时环境。