Docker容器之基本介绍
[TOC]
1. 容器的概念
Google是这样定义容器
容器是一种基础工具;泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品;物体可以被放置在容器中,而容器则可以保护内容物;人类使用容器的历史至少有十万年,甚至可能有数百万年的历史。
在IT领域中的容器被这样定义
容器的英文的单词是container,也叫集装箱。容器的概念在IT领域很早就已经出现了,而且实现容器技术较早的工具,比如有LXC(LinuX Container)。它是一种内核虚拟化技术,可以提供轻量级的虚拟化,以达到隔离用户空间、进程和资源的目的。
容器在宿主机(HOST)中实际上就是一个进程,通过namespace和CGroups,容器与宿主机系统中的其他一系列进程隔离,并通过Template,从镜像仓库下载所需的镜像至本地,在此镜像启动容器。该镜像中提供了支持运行在容器中的进程的所需的全部文件,包含了应用的依赖项,因而从开发到测试,到生产的整个过程中,它都具有可移植性和一致性。
Linux Container是最早一批将完整的容器技术用一组工具来极大的简化用户使用的容器技术。
容器技术的发展
2000年,计算机中的容器概念出现,当时称为FreeBSD jail
2001年,LXC(Linux Container)诞生,容器技术通过VServer项目,进入到了Linux领域,这项工作的目的是“在高度独立且安全的单一环境中运行多个通用 Linux 服务器”。
2008年,Docker容器技术通过 dotCloud 登上了舞台。Docker 技术将 LXC 工作与经过改进的开发工具结合在一起,从而提高了容器的用户友好度。Docker 是一种开源技术,也是当前最广为人知的、用于部署和管理 Linux 容器的项目和方法。
容器和虚拟化的区别
我们知道,传统虚拟化技术实际上是宿主机操作系统通过hypervisor虚拟出多个完整虚拟机,每个虚拟机都有完整、独立内核的操作系统和硬件资源。而容器则是通过共享宿主机的内核,将应用程序通过namespace与系统其它资源隔离开来。宿主机可同时创建多个容器,且每个容器之间都是相互隔离。
图 1-1事实上,传统虚拟化技术并不能实现轻量级效果,比如,我们需要配置WEB服务器,首先就需要安装Guest OS,然后再安装、配置Nginx或http并启动,这中间需要一定的过程。而容器技术则不同,我们只需要从镜像仓库中下载特定Nginx和http镜像至本地并启动该容器即可,因此,应用程序和服务能够保持轻量级运行,并且多容器并行快速运行。
两者区别总结如下:
1)虚拟机有完整、独立内核的操作系统和硬件资源,而容器共享宿主机的内核。
2)传统虚拟化技术能够做到完全隔离,而容器只能通过在宿主机内核中通过Namespaces或CGroups实现强隔离,容器的隔离不够彻底,安全性会打折扣,这也时容器现在丞待解决的问题。
3)虚拟机需要安装操作系统才能运行应用程序,而容器不需要,镜像一次封装,到处运行。
4)容器能够实现轻量级虚拟化、快速部署、快速启动运行(秒级),而虚拟机则是分钟级。
5)容器的性能几乎和物理系统一致,但是虚拟机会占用一些额外的系统开销。
6)容器更易于部署。
下表中,从某些类别对比了docker与openstack:
类别 | Docker | Openstack |
---|---|---|
部署难度 | 非常简单 | 组件繁多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
性能 | 和物理机系统几乎一致 | VM会占用额外的资源 |
镜像体积 | 容器镜像MB级别 | 虚拟机镜像GB级别 |
管理效率 | 管理简单 | 组件互相依赖,管理复杂 |
隔离性 | 隔离性高 | 彻底隔离 |
可管理性 | 单进程,不建议启动ssh | 完整的系统管理 |
网络 | 比较弱 | 借助Neturon可以灵活组建各类网络架构 |
2. LXC技术详解
LXC是什么?
在讨论docker之前,我们有必要先详细了解下LXC,理解了LXC的工作原理,更有助于我们更好的学习好docker。
LXC,即为Linux Container的简称,是一种基于container的操作系统级的虚拟化技术。LXC是最早一批真正将容器技术用一组简易template实现的解决方案。它借助于内核所提供命名空间(Namespaces)的隔离机制和CGgroups(Control Groups)的资源控制功能,并提供统一API和管理工具来建立和管理container。
LXC主要用到Namespaces和CGroups的技术。其中Namespaces负责隔离一个独立的容器所必须具备的资源,CGroups实现对系统资源的分配和度量。
Linux Container的架构如下所示:
图 2-1要了解容器的概念,我们必须先讨论下Namespaces和CGroups。
What is Namespaces?
NameSpaces(命名空间)是linux为我们提供用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。
从linux内核的更新迭代,Linux所支持Namespace类别如下表所示:
Namespace | 系统调用参数 | 隔离内容 | 内核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
一个完整的Linux Container必须具备以下资源:
-
UTS:独立的主机名和域名;
-
IPC:进程间通信和共享内存;
-
PID:独立init进程,即pid编号为1的进程;
-
Network:独立网卡,TCP/IP协议栈;
-
Mount:独立的根,文件系统;
-
User:独立的特权用户root;
说白了,要想实现容器技术,就必须使用Namespaces的资源隔离技术,通过系统调用构建一个相对隔离的shell环境,即我们所讨论的“容器”。那么,Namespaces提供了资源隔离技术,这些资源又由谁来控制了?这就是我们下面需要讨论的CGroups了。
What is CGroups?
CGroups的英文全称为Control Grous,中译为控制组。最初是叫Process Container,有Google工程师(Paul Menage 和 Rohit Seth)于2006年提出,后来因为 Container 有多重含义容易引起误解,就在 2007 年更名为 Control Groups,并被整合进 Linux 内核。cgroups 是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
通俗的来说,cgroups 可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,是构建 Docker 等一系列虚拟化管理工具的基石。
CGroups的主要目的是不同层面的资源管理,它提供了以下4大功能:
- 资源限制(Resource Limitation):对进程组使用的资源总额进行限制。如设定应用的运行时使用内存的上限,一旦超过上限配额就发出OOM(Out Of Memory)。
- 优先级分配(Prioritization):通过分配的CPU时间片数量和IO带宽大小,控制进程运行的优先级。
- 资源统计(Accounting):统计系统的资源使用量,如CPU使用时长,内存用量,带宽流量等,适用于计费。
- 进程控制(Control):对进程组进行挂起、恢复等操作。
CGroups的几个基本概念:
- 任务(Tasks):就是系统的一个进程。
- 控制组(Control Group):一组按照某种标准划分的进程,比如官方文档中的Professor和Student,或是WWW和System之类的,其表示了某进程组。Cgroups中的资源控制都是以控制组为单位实现。一个进程可以加入到某个控制组。简单点说,cgroup的呈现就是一个目录带一系列的可配置文件。
- 层级(Hierarchy):控制组可以组织成hierarchical的形式,既一颗控制组的树(目录结构)。控制组树上的子节点继承父结点的属性。简单点说,hierarchy就是在一个或多个子系统上的cgroups目录树。
- 子系统(Subsystem):一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。Cgroup的子系统可以有很多,也在不断增加中。
CGroups非常重要的概念:Subsystem(子系统),也就是资源控制器。在linux系统,/sys/fs/cgroup 目录中有若干个子目录,我们可以认为这些都是受 cgroups 控制的资源以及这些资源的信息。
[root@localhost ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 2 root root 0 Feb 14 2019 blkio
lrwxrwxrwx 1 root root 11 Feb 14 2019 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Feb 14 2019 cpuacct -> cpu,cpuacct
drwxr-xr-x 2 root root 0 Feb 14 2019 cpu,cpuacct
drwxr-xr-x 2 root root 0 Feb 14 2019 cpuset
drwxr-xr-x 2 root root 0 Feb 14 2019 devices
drwxr-xr-x 2 root root 0 Feb 14 2019 freezer
drwxr-xr-x 2 root root 0 Feb 14 2019 hugetlb
drwxr-xr-x 2 root root 0 Feb 14 2019 memory
lrwxrwxrwx 1 root root 16 Feb 14 2019 net_cls -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Feb 14 2019 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Feb 14 2019 net_prio -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Feb 14 2019 perf_event
drwxr-xr-x 2 root root 0 Feb 14 2019 pids
drwxr-xr-x 4 root root 0 Feb 14 2019 systemd
blkio: 这个 subsystem 可以为块设备设定输入 / 输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB 等)。
cpu: 这个 subsystem 使用调度程序控制 task 对 CPU 的使用。
cpuacct: 这个 subsystem 自动生成 cgroup 中 task 对 CPU 资源使用情况的报告。
cpuset: 这个 subsystem 可以为 cgroup 中的 task 分配独立的 CPU(此处针对多处理器系统)和内存。
devices: 这个 subsystem 可以开启或关闭 cgroup 中 task 对设备的访问。
freezer: 这个 subsystem 可以挂起或恢复 cgroup 中的 task。
memory: 这个 subsystem 可以设定 cgroup 中 task 对内存使用量的限定,并且自动生成这些 task 对内存资源使用情况的报告。
perf_event: 这个 subsystem 使用后使得 cgroup 中的 task 可以进行统一的性能测试。
net_cls: 这个 subsystem Docker 没有直接使用,它通过使用等级识别符 (classid) 标记网络数据包,从而允许 Linux: 流量控制程序(TC:Traffic Controller)识别从具体 cgroup 中生成的数据包。
3. Docker技术详解
Docker是什么?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化,容器完全是使用沙箱机制,相互之间不会有任何接口。
Docker是由Paas提供商dotCloud公司(13年更改为Docker Inc)开源的一个基于LXC的高级容器引擎。源代码托管在GitHub上,基于go语言并遵从Apache2.0协议开源。
Docker是一个程序运行、测试、交付的开放平台,Docker被设计为能够使你快速地交付应用。在Docker中,你可以将你的程序分为不同的基础部分,对于每一个基础部分都可以当做一个应用程序来管理。Docker能够帮助你快速地测试、快速地编码、快速地交付,并且缩短你从编码到运行应用的周期。
Docker使用轻量级的容器虚拟化平台,并且结合工作流和工具,来帮助你管理、部署你的应用程序。在其核心,Docker实现了让几乎任何程序都可以在一个安全、隔离的容器中运行。安全和隔离可以使你可以同时在机器上运行多个容器。
Docker容器轻量级的特性,意味着你可以得到更多的硬件性能。
围绕着容器的虚拟化工具和平台,可以在以下几个方面为你提供帮助:
- 帮助你把应用程序(包括其余的支持组件)放入到Docker容器中。
- 分发和转移你的容器至你的团队其它成员来进行进一步的开发和测试。
- 部署这些应用程序至你的生产环境,不论是本地的数据中心还是云平台。
Docker的官方站点:https://www.docker.com/
3.1 Docker的版本介绍
Docker从1.13.x版本开始,分为企业版 Docker-EE和社区办Docker-CE(1.13前为Docker Engine),版本号也修改为按照时间号来发布,比如,17.03版本就是2017年03月,类似于ubuntu的版本发布方式。这些修改并不影响Docker Compose以及Docker Machine。
Docker-EE是需要订阅收费的,请参考:https://blog.docker.com/2017/03/docker-enterprise-edition/
下图中对比了EE和CE版本的服务。
图 3-1Docker-CE分为“Edge”和“Stable”两个版本,Docker公司在同时维护这两个版本,而Stable为稳定版。目前,Docker-CE的最新Stable版本为v18.09。
-
stable版本是季度发布方式,比如17.03, 17.06, 17.09
-
edge版本是月份发布方式, 比如17.03, 17.04......
如下图所示:
图 3-2Docker的linux发行版的软件仓库从以前的https://apt.dockerproject.org和https://yum.dockerproject.org变更为目前的https://download.docker.com, 软件包名字改为docker-ce和docker-ee
3.2 Docker的应用场景
快速交付你的应用程序
Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应用程序和服务的容器进行开发,之后可以集成到连续的一体化和部署工作流中。
举个例子,开发者们在本地编写代码并且使用Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进行一切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进行部署。
开发和拓展更加简单
Docker的以容器为基础的平台允许高度可移植的工作。Docker容器可以在开发者机器上运行,也可以在实体或者虚拟机上运行,也可以在云平台上运行。
Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以用Docker快速地增加应用规模或者关闭应用程序和服务。Docker的快速意味着变动几乎是实时的。
达到高密度和更多负载
Docker轻巧快速,它提供了一个可行的、 符合成本效益的替代基于虚拟机管理程序的虚拟机。这在高密度的环境下尤其有用。例如,构建你自己的云平台或者PaaS,在中小的部署环境下同样可以获取到更多的资源性能。
3.3 Docker的核心概念
Docker大部分的操作都是围绕着它的三大核心概念:镜像(Image)、容器(Container)和仓库(Registry)。
1)镜像(Image)
Docker镜像是一个只读的模板。举个例子,一个镜像可以包含一个运行在Apache上的Web应用和其使用的Ubuntu操作系统。
镜像是用来创建容器的。Docker提供了简单的放来来建立新的镜像或者升级现有的镜像,你也可以下载别人已经创建好的镜像。Docker镜像是Docker的 构造 部分。
图 3-32) 容器(Container)
Docker容器和文件夹很类似。一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker容器都是从Docker镜像创建的。Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台。Docker容器是Docker的 运行 部分。
3)仓库(Registry)
Docker仓库用来保存镜像。可以理解为代码控制中的代码仓库。同样的,Docker仓库也有公有和私有的概念。公有的Docker仓库名字是Docker Hub。Docker Hub提供了庞大的镜像集合供使用。这些镜像可以是你自己创建的,或者你也可以在别人的镜像基础上创建。Docker仓库是Docker的 分发 部分。
3.4 Docker的基本架构
Docker使用C/S(client-server)架构模式。Docker客户端会与Docker守护进程进行通信。Docker守护进程会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。Docker客户端和守护进程可以运行在同一个系统上,当然你也可以使用Docker客户端去连接一个远程的Docker守护进程。Docker客户端和守护进程之间通过socket或者RESTful API进行通信。
图 3-4Docker daemon守护进程
Docker Client 客户端
Docker内部
要理解 Docker 内部构建,需要理解以下三种:
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
参照3.3
Docker引擎
Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:
图 3-5命名空间(Namespaces)
1)pid namespace
不同用户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同 PID。
具有以下特征:
每个namespace中的pid是有自己的pid=1的进程(类似 /sbin/init 进程)
每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程
因为 /proc包含正在运行的进程,因此在 container 中的 pseudo-filesystem 的 /proc 目录只能看到自己namespace 中的进程
因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父namespace中看到,但是具有不同的 pid
2)mnt namespace
类似 chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同namespace的进程看到的文件结构不同,这样每个namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在namespace的 mount point。
3)net namespace
网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge 连接在一起。
4)uts namespace
UTS ( "UNIX Time-sharing System" ) namespace 允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。
5)ipc namespace
container 中进程交互还是采用 Linux 常见的进程间交互方法 (interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32bit ID。
6)user namespace
每个 container 可以有不同的 user 和 group id , 也就是说可以以 container 内部的用户在 container 内部执行程序而非 Host 上的用户。
有了以上6种namespace从进程、网络、IPC、文件系统、UTS 和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同container从OS层面实现了隔离。然而不同 namespace 之间资源还是相互竞争的,仍然需要类似 ulimit 来管理每个container所能使用的资源。
资源配额(CGroups)
1)cgroups
实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup 目录下新建一个文件夹即可新建一个 group,在此文件夹中新建 task 文件,并将 pid 写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法, 如 memory.usageinbytes 就定义了该 group 在 subsystem memory 中的一个内存限制选项。
另外,cgroups 中的 subsystem 可以随意组合,一个 subsystem 可以在不同的 group 中,也可以一个 group 包含多个 subsystem - 也就是说一个 subsystem。
2)memory
内存相关的限制
3)cpu
在 cgroup 中,并不能像硬件虚拟化方案一样能够定义 CPU 能力,但是能够定义 CPU 轮转的优先级,因此具有较高 CPU 优先级的进程会更可能得到 CPU 运算。 通过将参数写入 cpu.shares ,即可定义改 cgroup 的 CPU 优先级 - 这里是一个相对权重,而非绝对值
4)blkio
block IO 相关的统计和限制,byte``/operation统计和限制 (IOPS 等),读写速度限制等,但是这里主要统计的都是同步 IO
5)devices
设备权限限制
3.5 Docker的事件状态
图 3-63.6 Docker的对象类型
image:镜像
containers:容器
networks:网络
volumes:卷组
plugins:插件
图 3-73.7 Docker的底层技术
Docker使用Go语言编写,并且使用了一系列Linux内核提供的性能来实现我们已经看到的这些功能。
命名空间(Namespaces)
Docker充分利用了一项称为namespaces
的技术来提供隔离的工作空间,我们称之为 container(容器)。当你运行一个容器的时候,Docker为该容器创建了一个命名空间集合。
这样提供了一个隔离层,每一个应用在它们自己的命名空间中运行而且不会访问到命名空间之外。
一些Docker使用到的命名空间有:
- pid命名空间: 使用在进程隔离(PID: Process ID)。
- net命名空间: 使用在管理网络接口(NET: Networking)。
- ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)。
- mnt命名空间: 使用在管理挂载点 (MNT: Mount)。
- uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)。
群组控制
Docker还使用到了cgroups
技术来管理群组。使应用隔离运行的关键是让它们只使用你想要的资源。这样可以确保在机器上运行的容器都是良民(good multi-tenant citizens)。群组控制允许Docker分享或者限制容器使用硬件资源。例如,限制指定的容器的内容使用。
联合文件系统
联合文件系统(UnionFS)是用来操作创建层的,使它们轻巧快速。Docker使用UnionFS提供容器的构造块。Docker可以使用很多种类的UnionFS包括AUFS, btrfs, vfs, and DeviceMapper。
容器格式
Docker连接这些组建到一个包装中,称为一个 container format(容器格式)。默认的容器格式是libcontainer
。Docker同样支持传统的Linux容器使用LXC。在未来,Docker也许会支持其它的容器格式,例如与BSD Jails 或 Solaris Zone集成。
4. Docker安装配置与基本命令使用
目前Docker版本分为Docker-EE和Docker-CE,Docker-EE相对于Docker-CE增加了额外的支付产品和支持,安全性更好。笔者的实验环境是基于以下几点来进行的:
-
OS:RHEL7.5
-
Docker版本:Docker-CE-18.09
-
直接yum方式安装(推荐)
4.1 如何获取Docker
在安装之前,我们要先获取Docker的安装包。获取Docker安装包的方式有以下几种
1)可以从Docker官方提供的源中获取:https://download.docker.com/,但是国外的站点速度都很慢,不推荐
2)可以从国内的镜像站点中获取:
阿里云:https://mirrors.aliyun.com/docker-ce/linux/centos/
清华大学:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/
笔者使用清华大学的镜像站点,操作方式如下:
# 下载repo
[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 默认情况下,docker-ce.repo内的站点是https://download.docker.com
# 需要手动修改为清华大学的镜像站点
[root@localhost yum.repos.d]# sed -i s@download.docker.com/linux/centos@mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos@g docker-ce.repo
# 查看yum源,repo name字段是否含有Docker CE Stable
[root@localhost yum.repos.d]# yum repolist
# 或者搜素docker-ce,发现最新版的为18.09.2
[root@localhost yum.repos.d]# yum search all docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
==================================================================================== Matched: docker-ce ====================================================================================
docker-ce.x86_64 : The open-source application container engine
docker-ce-cli.x86_64 : The open-source application container engine
docker-ce-selinux.noarch : SELinux Policies for the open-source application container engine
[root@localhost yum.repos.d]# yum info docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Available Packages
Name : docker-ce
Arch : x86_64
Epoch : 3
Version : 18.09.2
Release : 3.el7
Size : 19 M
Repo : docker-ce-stable/x86_64
Summary : The open-source application container engine
URL : https://www.docker.com
License : ASL 2.0
Description : Docker is is a product for you to build, ship and run any application as a
: lightweight container.
:
: Docker containers are both hardware-agnostic and platform-agnostic. This means
: they can run anywhere, from your laptop to the largest cloud compute instance and
: everything in between - and they don't require you to use a particular
: language, framework or packaging system. That makes them great building blocks
: for deploying and scaling web apps, databases, and backend services without
: depending on a particular stack or provider.
4.2 安装Docker
安装Docker前,需要确认你的基础条件是否满足以下几点:
-
64位CPU
-
Linux Kernel 3.10+
-
Linux kernel已启用CGroups和Namespaces
-
Docker是否运行在RHEL7或CentOS7上,千万不要运行在RHEL6或CentOS6上,不稳定。
-
Docker 运行在 CentOS-6.5/RHEL6.5 或更高的版本,要求系统为64位、系统内核版
本为 2.6.32-431 或者更高版本。(不推荐)
yum安装docker-ce
在4.1环节,笔者已经配置好了docker源,直接安装即可
# 安装docker-ce
[root@localhost ~]# yum install docker-ce -y
# 安装完成后加入开机启动并手动启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2019-02-15 11:25:48 CST; 4s ago
Docs: https://docs.docker.com
Main PID: 28589 (dockerd)
Tasks: 9
Memory: 28.3M
CGroup: /system.slice/docker.service
└─28589 /usr/bin/dockerd -H fd://
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.647911341+08:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420625f60, CO...module=grpc
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.648019107+08:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420625f60, RE...module=grpc
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.674837205+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.675705346+08:00" level=info msg="Loading containers: start."
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.880150897+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.1...IP address"
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.944350611+08:00" level=info msg="Loading containers: done."
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.971580124+08:00" level=info msg="Docker daemon" commit=6247962 graphdriver(s)=overlay2 version=18.09.2
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.971698483+08:00" level=info msg="Daemon has completed initialization"
Feb 15 11:25:48 localhost.localdomain dockerd[28589]: time="2019-02-15T11:25:48.982190873+08:00" level=info msg="API listen on /var/run/docker.sock"
Feb 15 11:25:48 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
# 启动docker后,网卡会多出一个docker0的虚拟桥接网卡,用于跟容器间的通信。
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:30:37:56:09 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.3 配置镜像加速
1)配置阿里云镜像加速器
阿里云容器hub: https://dev.aliyun.com/search.html
需要注册并登录阿里云,在个人管理中心 => 容器镜像服务 => 镜像加速器
每个用户的加速器地址是不一样的,笔者这里的加速器地址:https://vq9stveu.mirror.aliyuncs.com
推荐安装1.10.0以上版本的Docker客户端
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。
# 默认情况下,/etc/docker目录是没有的,需要自行创建
[root@localhost ~]# mkdir /etc/docker
# 配置加速器
[root@localhost ~]# tee /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://vq9stveu.mirror.aliyuncs.com"]
}
EOF
# 重启docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
# 查看加速器
[root@localhost ~]# docker info
...
Registry Mirrors:
https://vq9stveu.mirror.aliyuncs.com/
Live Restore Enabled: false
Product License: Community Engine
2)其他加速器
docker cn国内加速器:https://registry.docker-cn.com
中国科技大学加速器:https://docker.mirrors.ustc.edu.cn/
3)配置多个加速器
配置多个加速器,只需在/etc/docker/daemon.json文件中用逗号隔开。
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://vq9stveu.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}
[root@localhost ~]# docker info
...
Registry Mirrors:
https://vq9stveu.mirror.aliyuncs.com/
https://registry.docker-cn.com/
Live Restore Enabled: false
Product License: Community Engine
国内的加速器建议使用阿里云的,速度最快;docker cn加速器下载速度有时候会比较慢。
网友评论