Docker技术入门与实战(第2版)
上QQ阅读APP看书,第一时间看更新

第2章 核心概念与安装配置

本章首先介绍Docker的三大核心概念。

❑镜像(Image)

❑容器(Container)

❑仓库(Repository)

只有理解了这三个核心概念,才能顺利地理解Docker容器的整个生命周期。

随后,笔者将介绍如何在常见的操作系统平台上安装Docker,包括Ubuntu、CentOS、MacOS和Windows等主流操作系统平台。

2.1 核心概念

Docker的大部分操作都围绕着它的三大核心概念——镜像、容器和仓库而展开。因此,准确把握这三大核心概念对于掌握Docker技术尤为重要。

1.Docker镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。

镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

2.Docker容器

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。

可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

注意

镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

3.Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。

有时候会看到有资料将Docker仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。仓库注册服务器的示例如图2-1所示。

图2-1 注册服务器与仓库

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。

当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

提示

可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。

2.2 安装Docker

Docker在主流的操作系统和云平台上都可以使用,包括Linux操作系统(如Ubuntu、Debian、CentOS、Redhat等)、MacOS操作系统和Windows操作系统,以及AWS等云平台。

用户可以访问Docker官网的Get Docker(https://www.docker.com/products/overview)页面,查看获取Docker的方式,以及Docker支持的平台类型,如图2-2所示。

图2-2 获取Docker

在Get Docker页面,我们可以看到目前Docker支持Docker Platform、Docker Hub、Docker Cloud和Docker DataCenter。

❑ Docker Platform:支持在桌面系统或云平台安装Docker;

❑ DockerHub:官方提供的云托管服务,可以提供公有或私有的镜像仓库;

❑ DockerCloud:官方提供的容器云服务,可以完成容器的部署与管理,可以完整地支持容器化项目,还有CI、CD功能;

❑ Docker DataCenter:提供企业级的简单安全弹性的容器集群编排和管理。

笔者推荐尽量使用Linux操作系统来运行Docker,因为目前Linux操作系统对Docker的支持是原生的,使用体验最好。

2.2.1 Ubuntu环境下安装Docker

1.系统要求

Docker目前只能运行在64位平台上,并且要求内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能不稳定。

用户可以通过如下命令检查自己的内核版本详细信息:

        $ uname -a
        Linux Host 3.16.0-43-generic #58~14.04.1-Ubuntu SMP Mon Jun 22 10:21:20 UTC
            2015 x86_64 x86_64 x86_64 GNU/Linux

或者:

        $ cat /proc/version
        Linux version 3.16.0-43-generic (buildd@brownie) (gcc version 4.8.2 (Ubuntu
            4.8.2-19ubuntu1) ) #58~14.04.1-Ubuntu SMP Mon Jun 22 10:21:20 UTC 2015

Docker目前支持的最低Ubuntu版本为12.04 LTS,但实际上从稳定性上考虑,推荐至少使用14.04 LTS版本。

如果使用12.04 LTS版本,首先要更新系统内核和安装可能需要的软件包,包括:

❑ linux-image-generic-lts-trusty(必备)

❑ linux-headers-generic-lts-trusty(必备)

❑ xserver-xorg-lts-trusty(带图形界面时必备)

❑ libgl1-mesa-glx-lts-trusty(带图形界面时必备)

另外,为了让Docker使用aufs存储,推荐安装linux-image-extra软件包。

        $ sudo apt-get install -y linux-image-extra-$(uname -r)

注意

Ubuntu发行版中,LTS(Long-Term-Support)意味着更稳定的功能和更长期(目前为5年)的升级支持,生产环境中尽量使用LTS版本。

2.添加镜像源

首先需要安装apt-transport-https包支持HTTPS协议的源:

        $ sudo apt-get install -y apt-transport-https

添加源的gpg密钥:

        $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80--recv-keys
            58118E89F3A912897C070ADBF76221572C52609D

获取当前操作系统的代号:

        $ lsb_release -c
        Codename:         trusty

一般情况下,12.04(LTS)代号为precise,14.04(LTS)代号为trusty,15.04代号为vivid,15.10代号为wily。这里获取的代号为trusty。

接下来就可以添加Docker的官方apt软件源了。通过下面的命令创建/etc/apt/sources.list.d/docker.list文件,并写入源的地址内容。非trusty版本的系统注意修改为自己对应的代号:

        $ sudo cat <<EOF > /etc/apt/sources.list.d/docker.list
        deb https://apt.dockerproject.org/repo ubuntu-trusty main
        EOF

添加成功后,更新apt软件包缓存:

        $ sudo apt-get update

3.开始安装Docker

在成功添加源之后,就可以安装最新版本的Docker了,软件包名称为docker-engine:

        $ sudo apt-get install -y docker-engine

如果系统中存在较旧版本的Docker(lxc-docker),会提示是否先删除,选择“是”即可。

除了基于手动添加软件源的方式,也可以使用官方提供的脚本来自动化安装Docker:

        $ sudo curl -sSL https://get.docker.com/ | sh

安装成功后,启动docker服务:

        $ sudo service docker start

2.2.2 CentOS环境下安装Docker

系统的要求与Ubuntu情况下类似:64位操作系统,内核版本至少为3.10。

Docker目前支持CentOS 6.5及以后的版本,推荐使用CentOS 7系统。

首先,也是要添加yum软件源:

        $ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
        [dockerrepo]
        name=Docker Repository
        baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
        enabled=1
        gpgcheck=1
        gpgkey=https://yum.dockerproject.org/gpg
        EOF

之后更新yum软件源缓存,并安装docker-engine:

        $ sudo yum update
        $ sudo yum install -y docker-engine

对于CentOS 7系统,CentOS-Extras源中已内置Docker,如果已经配置了CentOS-Extras源,可以直接通过上面的yum命令进行安装。

2.2.3 通过脚本安装

用户还可以使用官方提供的shell脚本来在Linux系统(目前支持Ubuntu、Debian、Oracleserver、Fedora、Centos、OpenSuse、Gentoo等常见发行版)上安装Docker的最新正式版本,该脚本会自动检测系统信息并进行相应配置:

        $ curl -fsSL https://get.docker.com/ | sh

或者:

        $ wget -qO- https://get.docker.com/ | sh

如果想尝鲜使用最新功能,可以使用下面的脚本来安装预发布版本。但要注意,预发布版本往往意味着功能还不够稳定,不要在生产环境中使用:

        $ curl -fsSL https://test.docker.com/ | sh

另外,也可以从github.com/docker/docker/releases找到所有的发行版本信息和二进制包,自行下载使用。

2.2.4 Mac OS环境下安装Docker

Docker官方非常重视Docker在Mac环境下的易用性。目前Docker支持原生Mac客户端,内置图形界面,支持自动升级。此客户端与Mac OS X的原生虚拟化深度结合,摒弃了之前安装VirtualBox(即Docker Toolbox)的简单粗暴的做法。我们先从官方默认的Docker for Mac开始。

1.Docker for Mac

第一步,下载安装包。访问https://docs.docker.com/docker-for-mac/下载页面。目前Docker for Mac分为稳定版和Beta版两种更新通道,我们可以按需选择。下载完成后,双击安装包,如图2-3所示。

图2-3 下载后打开安装包

第二步,开始安装。将Docker.app拖曳至Applications文件夹,即可完成安装,如图2-4所示。

图2-4 安装Docker到Applications文件夹

第三步,运行Docker for Mac。在欢迎窗口点击“Next”,如图2-5所示。

图2-5 欢迎窗口

允许Docker获得系统权限,它需要将Mac网卡链接至Docker app。点击“OK”后输入系统管理员密码,如图2-6所示。

图2-6 运行Docker for Mac

此时系统状态栏会出现Docker的Icon图标,点击后如果出现“Docker is running! ”,则说明安装成功。

第四步,验证Docker安装。打开终端控制器或其他系统命令行,执行docker version命令。

        $ docker version
        Client:
            Version:        1.12.0
            API version:    1.24
            Go version:     go1.6.3
            Git commit:     8eab29e
            Built:          Thu Jul 28 21:15:282016
            OS/Arch:        darwin/amd64
        Server:
            Version:        1.12.0
            API version:    1.24
            Go version:     go1.6.3
            Git commit:     8eab29e
            Built:          Thu Jul 28 21:15:282016
            OS/Arch:        linux/amd64

如果我们看到Client和Server均有输出,则说明Docker for Mac已经正常启动。如果我们看到报错:“Cannot connect to the Docker daemon.Is the docker daemon running on this host? ”,则说明Docker for Mac没有启动或启动失败。

下面启动一个Nginx容器,检查能正确获取镜像并运行:

        $ docker run -d -p 80:80--name webserver nginx
        Unable to find image 'nginx:latest' locally
        latest: Pulling from library/nginx
        51f5c6a04d83: Pull complete
        a3ed95caeb02: Pull complete
        51d229e136d0: Pull complete
        bcd41daec8cc: Pull complete
        Digest:
        sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
        Status: Downloaded newer image for nginx:latest
        34bcd01998a76f67b1b9e6abe5b7db5e685af325d6fafb1acd0ce84e81e71e5d

然后使用docker ps指令查看当前运行的容器:

        $ docker ps
        CONTAINER ID          IMAGE                   COMMAND                       CREATED
        STATUS                PORTS                                NAMES
        34bcd01998a7          nginx                   "nginx -g 'daemon off"    2 minutes ago
        Up 2 minutes          0.0.0.0:80->80/tcp, 443/tcp    webserver

可见Nginx容器已经在0.0.0.0:80启动,并映射了80端口,下面我们打开浏览器访问此地址,如图2-7所示。

图2-7 允许访问系统权限

第五步,常用配置设定。首先,点击系统状态栏的Docker图标,会出现操作菜单,如图2-8所示。

图2-8 Docker菜单

然后,点击Preferences,进入标准配置页面,我们可以设置是否自动启动与更新,设置备份工具Time Machine是否备份VM,还可以配置Docker使用的CPU数、内存容量,如图2-9所示。

图2-9 标准配置页面

点击进入Advanced进阶配置。为了更好地使用Docker Hub,我们可以使用Registry镜像站点进行加速。点击+后,加入镜像站点配置。这里还可以配置HTTP代理服务器,如图2-10所示。

图2-10 高级配置页面

点击进入File Sharing标签页,此处可以配置挂载至容器中的本地目录。点击+后可以继续添加本地目录,如图2-11所示。

图2-11 文件分享配置页面

点击进入Privacy标签页,此处可以配置隐私选项,如是否发送使用信息,以及是否发送程序崩溃报告,如图2-12所示。

图2-12 隐私配置页面

2.Docker Toolbox

在Mac OS X操作系统上安装Docker,除了Docker for Mac的原生方式之外,还可以使用官方提供的Docker ToolBox工具。

首先前往https://www.docker.com/products/docker-toolbox下载对应版本的ToolBox。目前Docker支持的Mac OS X版本为10.6+。如图2-13所示。

图2-13 ToolBox安装页面

双击运行安装包。这个过程将安装一个VirtualBox虚拟机,内置了Docker Engine、Compose、Machine、Kitematic等管理工具。安装成功后,找到Boot2Docker并运行它。如图2-14所示。

图2-14 Boot2Docker页面

现在进行Boot2Docker的初始化:

        $ boot2docker init
        $ boot2docker start
        $ $(boot2docker shellinit)

将看到虚拟机在命令行窗口中启动运行。当虚拟机初始化完毕后,可以使用boot2docker stop和boot2docker start来控制它。

注意,如果在命令行中看到如下提示信息:

        To connect the Docker client to the Docker daemon, please set: export DOCKER_
            HOST=tcp://192.168.59.103:2375

可以执行提示信息中的语句:export DOCKER_HOST=tcp://192.168.59.103:2375。此语句的作用是在系统环境变量中设置Docker的主机地址。

2.2.5 Windows环境下安装Docker

目前Docker可以通过虚拟机方式来支持Windows 7.1和8,只要平台CPU支持硬件虚拟化特性即可。如果无法确定自己计算机的CPU是否支持该特性也无需担心,实际上,目前市面上主流的CPU都早已支持了硬件虚拟化特性。

对于Windows 10用户,Docker官方提供了原生虚拟化应用Docker for Windows。详情见:https://docs.docker.com/windows/step_one/。目前国内Windows 7还是主导地位的版本,所以下面主要讲解如何在Windows 7环境下安装Docker环境。

由于Docker引擎使用了Linux内核特性,所以如果要在Windows 10之外的Windows上运行,需要额外使用一个虚拟机来提供Linux支持。这里推荐使用Boot2Docker工具,它会首先安装一个经过加工与配置的轻量级虚拟机,然后在其中运行Docker。主要步骤如下:

首先,从https://docs.docker.com/installation/windows/下载最新官方Docker for Windows Installer。双击打开Installer。这个过程将安装VirtualBox、MSYS-git、boot2docker Linux ISO镜像,以及Boot2Docker管理工具。如图2-15所示。

图2-15 Docker for Windows Installer

最后,打开桌面的Boot2Docker Start程序,或者Program Files\Boot2Docker for Windows。此初始化脚本在第一次运行时需要输入一个SSH Key Passphrase(用于SSH密钥生成的口令)。读者可以自行设定,也可以直接按回车键跳过此设定。如图2-16所示。

图2-16 Boot2Docker安装器

此时Boot2Docker Start程序将连接至虚拟机中的Shell会话,Docker已经运行起来了!

2.3 配置Docker服务

为了避免每次使用docker命令都要用特权身份,可以将当前用户加入安装中自动创建的docker用户组:

        $ sudo usermod -aG docker USER_NAME

用户更新组信息后,退出并重新登录后即可生效。

另外,Docker服务支持多种启动参数。以Ubuntu 14.04系统为例,Docker服务的默认配置文件为/etc/default/docker,可以通过修改其中的DOCKER_OPTS来修改服务启动的参数,例如,下一行代码让Docker服务可以通过本地2375端口接收来自外部的请求:

        DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375-H unix:///var/run/docker.sock"

修改之后,通过service命令来重启Docker服务:

        $ sudo service docker restart

一般情况下,Docker服务的管理脚本为/etc/init.d/docker,通过查看其中的内容,发现主要是将Docker进程的id写入/var/run/docker.pid文件,以及通过ulimit调整系统的资源限制。

如果是通过较新的upstart工具来管理服务,则管理服务配置文件在/etc/init/docker.conf。

另外,对于CentOS、Redhat等系统,服务可能是通过systemd来管理,与此略有不同,可以查阅systemd相关手册。

例如,需要通过systemctl命令来管理Docker服务:

        $ sudo systemctl start docker.service

此外,如果服务工作不正常,可以通过查看Docker服务的日志信息来确定问题,例如在Ubuntu系统上日志文件可能为/var/log/upstart/docker.log:

        $ sudo tail /var/log/upstart/docker.log

每次重启Docker服务后,可以通过查看Docker版本信息,确保服务已经正常运行:

        $ docker version
        Client:
            Version:        1.12.0
            API version:    1.24
            Go version:     go1.6.3
            Git commit:     8eab29e
            Built:          Thu Jul 28 21:15:282016
            OS/Arch:        darwin/amd64
        Server:
            Version:        1.12.0
            API version:    1.24
            Go version:     go1.6.3
            Git commit:     8eab29e
            Built:          Thu Jul 28 21:15:282016
            OS/Arch:        linux/amd64

2.4 推荐实践环境

从稳定性上考虑,本书推荐的实践环境的操作系统是Ubuntu 14.04.3 LTS系统,带有linux-image-3.16.0-71-generic内核。Docker版本为最新的1.12稳定版本。不同版本的API会略有差异,推荐根据需求选择较新的稳定版本。另外,如无特殊说明,默认数据网段地址范围为10.0.0.0/24,管理网段地址范围为192.168.0.0/24。

执行命令代码中以$开头的,表示为普通用户;以#开头的,表示为特权用户(root)。如果用户已经添加到了docker用户组(参考上一小节),大部分时候都无需管理员权限,否则需要在命令前使用sudo来临时提升权限。

部分命令执行结果输出内容较长的,只给出了输出的关键部分。读者可根据自己的实际情况,搭建类似的环境。

2.5 本章小结

本章介绍了Docker的三大核心概念:镜像、容器和仓库。在后面的实践中,读者会感受到,基于三大核心概念所构建的高效工作流程,正是Docker从众多容器虚拟化方案中脱颖而出的重要原因。实际上,Docker的工作流也并非凭空创造的,很大程度上参考了Git和Github的设计理念,从而为应用分发和团队合作都带来了众多优势。

在后续章节,笔者将具体讲解围绕这三大核心概念的Docker操作命令。