技术文章

Docker容器技术的使用(上)

Docker容器技术的使用,现在它已经不仅仅只是运维人员的专属技能了,对于我们开发人员同样需要具备,在很多中小公司中云环境的项目搭建和项目部署依然还是我们开发人员干的事,所以多学一门技术总是没错的。

 

1. Docker介绍

 

Docker 最初是  PaaS 云服务平台提供商dotCloud 公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟(OCI)。

 

Docker 自开源后受到广泛的关注和讨论,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连Google 的 Compute Engine 也支持 docker 在其之上运行。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。

 

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。

 

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而Docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

 

Docker容器技术的使用

图 1..1 - 传统虚拟化

 

Docker容器技术的使用

图 1.2 - Docker

 

Docker 优点

 

l 环境搭建和部署方便

以前要在Linux上搭建应用所需的一些环境不是一件容易的事,往往一个环境出现一些小问题可能都耗费我们很久的时间,并且搭建了环境应用部署和管理也不是一件容易的事。而有了Docker我们可以很轻松的搞定环境的问题,只需要下载一个镜像或几个镜像然后创建容器运行即可。

 

l 可移植性强

Docker可以让开发者打包他们的应用以及依赖包到一个或多个可移植的容器中,然后发布到任何流行的 Linux 机器上。Docker 可以对其中的镜像环境(比如:tomcat、jdk、redis等)的启动、重启、停止等都可以进行管理。

 

l 隔离性

Docker可以确保你的应用程序与资源是分隔开的。Docker中的每一个容器都拥有自己的资源,并且跟其他容器都是隔离开的。这样我们就可以使用Docker的容器运行多个不同的应用程序,并且我们不需要它的时候删除容器即可,非常的方便并且也不会影响其他的应用。

 

l 快速实现版本回滚

在没有容器之前,我们现在的应用出现问题需要回滚的时候,我们需要借助于git等其他工具把代码回滚到以前状态,然后重新打包部署起来,这个过程肯定不是很快能够完成。而Docker就可以像git一样对器进行版本的提交和回滚,从而可以快速实现应用的回滚。

 

2. Docker架构

 

Docker 使用客户端-服务器 (C/S) 架构模式,主要由两部分组成:

 

l Docker : 开源的容器虚拟化平台

l Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台

 

Docker 客户端会与 Docker daemon 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

 

Docker容器技术的使用

 

3. Docker的组成

 

Docker基本上由三个部件组成:

· Docker 镜像 - Docker images

· Docker 仓库 - Docker registeries

· Docker 容器 - Docker containers

 

Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,使得分发 Docker 镜像变得简单和快速。

 

Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

 

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

 

这三个部件也可以这样来形象的理解:Docker镜像为我们要安装应用的安装包文件,而Docker容器就是安装包安装好可以运行的应用程序只不过一个镜像可以创建很多的容器程序,Docker仓库就是可以下载Docker镜像的一个应用商店。

 

4. Docker的安装、启动和镜像加速配置

 

Docker 划分为 CE 和 EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。官方网站上有各种环境下的 安装指南, Docker CE 在 Linux 、Windows 10 (PC) 和 macOS 上的安装。

 

CE和EE的主要区别:

1. EE兼容更多的操作系统。

2. EE更加的安全。

 

因为服务器系统都是CentOS(Linux操作系统的一种),所有这里只介绍CentOS的安装及使用。

 

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。

 

Docker安装:

在现在版本的Docker引擎安装中,通常主要使用两种方式:设置Docker的存储库并从中进行安装或者使用自动脚本安装(其实还有rpm软件包安装),其实使用脚本安装的方式也是运行了方式一中的yum命令进行安装的。

 

在安装之前,如果系统上存在较旧版本的Docker的话,我们先进行卸载。较旧的Docker版本称为docker或docker-engine。

 

sudo yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

 

(1)使用Docker存储库安装

在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。安装yum-utils软件包(提供yum-config-manager 使用程序)并设置稳定的存储库。

 

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \

    --add-repo \

    https://download.docker.com/linux/centos/docker-ce.repo

 

同样也可以使用阿里云的:

 

$ sudo yum-config-manager \

    --add-repo \

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 

然后安装docker引擎:

 

$ sudo yum install docker-ce docker-ce-cli containerd.io

 

如果需要安装特点版本的docker引擎,可以使用以下命令:

 

$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

 

(2)使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:

 

官方安装脚本:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

 

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

 

启动Docker:

安装好Docker之后,为了方便我们把Docker设置为开机自启:

 

$ sudo systemctl enable docker.service

 

然后启动Docker:

 

$ sudo  systemctl start docker

 

最后测试下我们安装的Docker是否能用:

 

$ sudo docker version

 

镜像加速:

国内从 Docker Hub 拉取镜像的时候太慢,并且有的时候还会拉取失败,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

 

· Docker 官方提供的中国 registry mirror

· 阿里云加速器

· DaoCloud 加速器

 

我们以阿里云加速器为例进行介绍,注册阿里云账号,并在“容器镜像服务”->“镜像库”->“镜像加速”中可以看到自己的镜像加速地址,如图:

 

Docker容器技术的使用

 

镜像加速配置之后,需要重启Docker才能生效:

 

$ systemctl daemon-reload

$ systemctl restart docker