源于生计被迫开源,操作系统级容器技术                                —-Docker

Docker 技术

  我们在将 Docker 之前,首先来简单的聊一聊虚拟化技术,虚拟化技术我们也接触过不少 VMware、KVM 之类的。通过创建虚拟机的方式,我们可以把硬件资源分配到不同的虚拟机,达到资源的最大化利用,相比直接在物理机上部署应用,虚拟机更容易扩展应用。通过虚拟机虚拟出不同的物理资源,可以快速搭建云服务。
  简单来讲虚拟化技术主要用来解决高性能物理硬件产能过剩和老旧的硬件产品产能过低的重组重用,透明化底层物理硬件资源从而最大化的利用物理硬件。但其缺点在于 Guest OS 通常会占用不少硬件资源,例如 Windows 安装 VMware 并开启 Guest OS,不运行任何应用的情况下,就需要占用 2 ~ 3G 内存,20 ~ 30G 的硬盘空间。而且为了应用系统运行的性能,往往还要给每台虚拟机留出更多的内存容量。在这样的资源占用情况下,少量的虚拟机还是可以接受的,如果同时运行十多台或数十台虚拟机,硬件资源的浪费就会成倍递增。
  能不能所有应用使用同一个操作系统减少硬件资源的浪费,但是又能够避免包括运行库在内的软件冲突呢?操作系统底层虚拟化——容器概念的提出就是为了解决这个问题。Docker 就是一个容器的标准实现。
image.png

容器化

  容器化就是应用程序级别的虚拟化技术。容器提供了将应用程序的代码、系统工具、系统库和配置打包到一个实例中的标准方法,容器共享一个内核(操作系统),它安装在应硬件上。简单的来讲其实和 VMware 类似,他们都是一个应用一个软件,只不过 VMware 需要安装虚拟操作系统的方式才能够在里面运行其他应用,而 Docker 不需要安装操作系统直接就可以在里面跑应用程序。
和虚拟机相比,容器有以下优点:

  • 启动迅速:没有虚拟机硬件的初始化,没有Guest OS的启动过程,可以节约很多启动时间“开箱即用”。
  • 占用资源少:没有运行Guest OS所需的内存开销,无需为虚拟机预留运行内存,无需安装、运行App不需要的运行库/操作系统服务,内存占用、存储空间占用都小的多。相同配置的服务器,如果能运行十多台虚拟机的,通常可以运行上百个容器毫无压力——当然前提是单个容器应用本身不会消耗太多资源。

image.png

  • 历史变迁
    • 物理机时代:多个应用程序可能会跑在一台机器上。image.png
    • 虚拟机时代:一台物理机器安装多个虚拟机(VM),一个虚拟机跑多个程序。image.png
    • 容器化时代:一台物理机安装多个容器实例(container),一个容器跑多个程序。image.png

Docker 历史

  2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫 dotCloud 的公司,dotCloud 公司提供平台服务 PaaS。dotCloud 平台利用了 Linux 的 LXC「0.9 版本的 Docker 之前需要依赖 LXC 技术」容器技术。为了方便创建和管理这些容器,dotCloud 基于 google 公司推出 Go 语言开发了一套内部工具,之后被命名为“Docker”。
image.png
  就如同 Docker 的 Logo 一样,Docker 的思想来源于集装箱。集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来,并且各种各样的货物被集装箱标准化,集装箱和集装箱之间互不影响。那么就不需要专门运送水果的船和专门运送化学用品的船了。只要这些货物封装在了不同的集装箱里,就可以用一艘大船把他们都运走。
Docker 技术诞生之后,并没有引起行业的关注。而 dotClould 公司,作为一家小型创业企业,在激烈的竞争之下,也是举步维艰。正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。什么是“开源”?开源,就是开放代码,也就是将原来的内部保密程序源代码开放给所有人,然后大家一起参与进来,贡献代码和意见。
  有的软件一开始就是开源的,也有的软件是混不下去,创造者又不想放弃,而选择开源。自己养不活,就吃“百家饭”。2013 年 3 月,dotCloud 公司的创始人之一,Docker 之父,28 岁的 SoloMon Hykes 正式决定,将 Docker 项目开源。
不开则已,一开惊人。越来越多的 IT 工程师发现了 Docker 的优点,然后蜂拥而至,加入 Docker 开源社区。Docker 的人气也迅速攀升,速度之快令人瞠目结舌。开源当月,Docker 0.1 版本发布。此后的每一个月,Docker 都会发布一个版本。到 2014 年 6 月 9 日,Docker 1.0 版本正式发布。此时的 Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google、微软、Amazon、VMware 这样的巨头们都对它青睐有加,表示将全力支持。Docker 火了之后,dotCloud 公司干脆将名字改成了 Docker Inc。

Docker 版本

  随着 Docker 技术的飞速发展,企业级功能的上线,更好的服务意味着需要支付一定的费用,目前 Docker 被分为两个版本:community-edition 社区版和 enterprise-edition 企业版。

Centos7 上安装 Docker 引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 安装yum-utils
$ sudo yum install -y yum-utils

# 下载docker镜像
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

# 安装docker-ce
$ cd /etc/yum.repos.d/
$ sudo yum install docker-ce docker-ce-cli containerd.io

# 确认给出的指纹是否和官方匹配
从 https://download.docker.com/linux/centos/gpg 检索密钥
导入 GPG key 0x621E9F35:
用户ID : "Docker Release (CE rpm) <docker@docker.com>"
指纹 : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
来自 : https://download.docker.com/linux/centos/gpg
是否继续?[y/N]:y

# 开启docker服务
$ systemctl enable docker
$ systemctl start docker

# docker进程服务校验,从docker的官网上拉取一个hello-world镜像
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
0e03bdcc26d7: Pull complete
Digest: sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

# 查看docker版本
$ docker -v
Docker version 20.10.3, build 48d30b5

docker 镜像加速

  Docker 从 Docker Hub 拉取镜像,因为从国外获取所以下载速度较慢,可以通过配置国内镜像源的方式,从国内获取镜像,提高拉取速度,这里介绍中国科学技术大学的开源镜像https://docker.mirrors.ustc.edu.cn和网易的开源镜像http://hub-mirror.c.163.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 编辑文件daemon.json,该文件默认安装下是不存在的。
$ vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
}

# 重启docker服务
$ systemctl restart docker

# 尝试拉取tomcat镜像
$ docker pull tomcat
latest: Pulling from library/tomcat
b9a857cbf04d: Pull complete
d557ee20540b: Pull complete
3b9ca4f00c2e: Pull complete
667fd949ed93: Pull complete
661d3b55f657: Pull complete
511ef4338a0b: Pull complete
a56db448fefe: Pull complete
00612a99c7dc: Pull complete
326f9601c512: Pull complete
c547db74f1e1: Pull complete
Digest: sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

# 查看docker中的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 040bdb29ab37 3 weeks ago 649MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB