一:Docker 诞生的故事

75 阅读10分钟

Docker 诞生的故事

700e954d2dbc2b9906dc0f652c3b6091_daf454b4b0e95e39f0de65ebfc944c74b6a5b4fa5621add7ea1552eeab68b908.png

新技术常有,而颠覆性的新技术则很罕见,Docker 容器技术必将是这个时代最具颠覆性的弄潮儿,因为它改变了整个软件产业!

Solomon Hykes 出生于1984年,在他还很小的时候,他的父母移民到了法国,他在还是青涩少年时就开始了自己的编程生涯,高中生活他的大多数时间都泡在网吧写程序,明白自己兴趣所在后,他没有进入大学,而是选择直接进入编程行业,接受系统的软件培训。

2008年 Hykes 与朋友在法国共同创办了 DotCloud PaaS 公司,一家云计算相关方向的创业公司。

2013年,Hykes 推出了这款名为 Docker 的工具,并将其作为开源产品来发布。实际上 DotCloud 公司开源了很多工具,Docker 只是其中最受欢迎的一个。

同年,DotCloud 聘请 Ben Golub 担任 CEO,Hykes 转任首席技术官。Golub 的首要举措之一是宣布 DotCloud 更名为 Docker Inc。

看到 Docker 的成功后,2014年谷歌开源了基于内部 Borg 系统经验的名为 kubernetes 的容器编排项目,并积极推动成立了云原生基金会 CNCF ,以遏制 Docker 公司在此领域的影响力,由此拉开了云原生时代的序幕。

2022年3月28日,Docker 公司的创始人兼 CTO Solomon Hykes 在 Docker blog 上发文宣布自己从 Docker 离职,将创建 DevOps 平台 Dagger.io

实际上 Docker 并不是最早的容器化技术,但它是众多产品中最具创新的一个,最早出现并流行开来的 容器 PaaS 平台是由 Vmware 创立的 CloudFoundry ,使用它开发者可仅通过一条简单的命令,就可以将整个项目打包上传到 Cloud Foundry,然后自动解压运行,并快速对外提供服务,而其底层的环境和资源隔离就是由容器技术提供的。

CloudFoundry 当时说 "Docker 不值得关注,和我们一样,无非是用到了 Namespace 和 Cgroups 技术的沙箱"。可是仅仅只过了一个月,Docker 镜像功能便推出,”一次构建,随处运行“,全世界的开发者都沸腾了,可怜的 CloudFoundry 还没来得及成为 Docker 的对手就直接被淘汰出局了,至此 Docker 已成为容器的代名词和事实上的标准。

现在来看 Docker 的成功看似偶然,但其实是必然,就算没有 Docker 也会有另一个同样流行的容器工具出现,只是时间早晚而已。

因为2013年前后,移动互联网爆发,云计算成本居高不下,于是降低运营成本和提高资源利用效率成为互联网企业的追求。而 Cgroups 、UFS 等基础技术早已准备好,可谓是天时地利人和,所以 Docker 的成功是有时代机遇的。不过也必须承认的是,Docker 的成功主要依靠的是自身创新和易用性,如果没有镜像的支持,容器化技术能否会流行开来也尤未可知。

还好,一切都刚刚好。这是最好的时代,也是最坏的时代,我庆幸自己生在这个时代。

感谢 Solomon Hykes 给世界带来 Docker。


Docker 是什么?

docker 是容器化工具,是通往云原生时代的船票。

docker 以简练易用的使用范式,极大地降低了容器技术的使用慢门槛,由此带来了云原生技术革命,这个时代还有比它更酷的东西吗?

信息技术革命:Unix -> Linux -> TCP/IP -> Web -> Docker


Docker 不是什么?

  1. docker 不是虚拟机,不提供 宿主机虚拟化功能
  2. docker 不是操作系统,它不包含操作系统内核,只包含 root 文件系统

如果一定要和虚拟机作类比,那么 docker 是半虚拟化方案(或称为轻量级虚拟化) ,而 Oracle VM VirtualBox 等产品则是全虚拟化方案。


为什么是 Docker?

人们总想要更多(虚拟化、隔离),但又不想付出太多(虚拟机成本),而 Docker 刚好迎合了 “多·快·好·省” 的需求点。


不用 Docker 的三大理由

  1. 我喜欢配一整天的环境啥事也不干,并且非常享受配环境的这个过程。
  2. 我追求真实,不在乎成本,都是直接买服务器,不用虚拟的容器。
  3. 云原生、DevOps 这些东西对我来说就是炒作和噱头。
  4. 相较于 “一次构建、随处运行” ,我更喜欢折腾和风浪。

最简单的,Docker 可以帮我做什么?

”说了这么多,我还是不知道它是什么,最直接的你直接告诉我它能做什么?“

我们知道安装环境很麻烦,如原生安装 php 环境,当你好不容易安装并配置好了 php 和所需扩展,下次换一台机器还要再重来一次,就算你用脚本将安装过程自动化了,但也不敢保证下次百分百成功并和之前的一模一样,这简直是噩梦!

如果有一种方式只用成功安装配置一次,后面在其他机器上安装时能够直接复制之前的成功成果就好了,这样无论安装过程多么复杂都没有关系,因为只要我们成功一次就够了!就像系统快照一样可以随时恢复到之前某个快照。

我们将第一次成功配置好的环境和应用代码一起打包成一个镜像,后面的千万次部署只用重复运行这个镜像就行了,运行镜像就像启动一个进程那么简单快速,没有任何性能损耗,没有安装和构建过程,没有等待,真正的一键部署,开箱即用,这就是 docker 带给我们的魔法。

你可能会说这不就是虚拟机吗?

但是,你见过几兆大小的虚拟机吗?你见过毫秒启动的虚拟机吗?

有了如此高效的“虚拟机”,你就可以在一台机器上同时 运行 php 7.4 和 php 8.1 的项目了,并且互不干扰,甚至还可以对其进行资源限制,“一次构建、到处运行”,这就是 Docker 让无数开发者趋之若鹜的魅力所在。

任何人告诉你它是什么都不如你通过实践自己理解它是什么来得有价值,相信很快你就能够得出自己的结论了。


安装 Docker

# 安装依赖包
$ sudo yum install -y yum-utils

# 添加国内 yum 软件源
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

# 安装 docker
$ sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 作为服务启动
$ sudo systemctl enable docker
$ sudo systemctl start docker

镜像加速

$ vi /etc/docker/daemon.json

写入如下内容:

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com",
    "https://reg-mirror.qiniu.com",
    "https://mirror.baidubce.com",
    "https://h5m24cso.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "http://cjie.eu.org",
    "https://docker.1ms.run"
  ]
}

重启后镜像加速生效

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

还可以直接使用镜像源地址拉取镜像:

$ docker pull m.daocloud.io/xiaobu191/php-7.4.33-cli

测试是否安装成功:

$ docker info

Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 24.0.7
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc version: v1.1.9-0-gccaecfc
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1160.102.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.7GiB
 Name: localhost.localdomain
 ID: 3abc4da1-7d52-48a2-b660-0e612263f071
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://h5m24cso.mirror.aliyuncs.com/
  https://hub-mirror.c.163.com/
  https://mirror.baidubce.com/
  https://docker.mirrors.ustc.edu.cn/
 Live Restore Enabled: false
$ docker run --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
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.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

能正常输出以上信息,说明安装成功。


一窥真容

# 一行命令启动一个 nginx 服务
$ docker run --name my-nginx -d -p 8080:80 nginx

访问 http://192.168.31.160:8080/ 就可以看到 Nginx 欢迎页面了:

image.png

相信你已经领略到了 Docker 的神奇魔力,你可能会有很多的疑惑,别着急,现在你只需要对它有一个大概的认识就行了,先培养起兴趣对后面的学习之路会很有帮助,在接下来的章节中我们会逐步揭开这些疑惑。


Docker 与 云原生

image.png

2000年互联网泡沫破灭,金融危机席卷全球,企业纷纷节流,一时间曾广受欢迎的 Sun 服务器开始在 ebay 上低价甩卖。由于经济低迷,亚马逊公司经营的网络在线商店出现了大量闲置的服务器资源,一些工程师开始思考如何让这些闲置资源继续产生价值。为何不把闲置的计算资源像商品一样出售给有需要的人呢?

早在2004年,谷歌就开始使用容器技术大规模的部署应用节点。到了2006年,谷歌发布了 Cgroups ,最初叫 Process Container(进程容器),发布后第二年就进入了 Linux 内核主干,为避免混乱,更名为 Control Groups,也就是 Cgroups。

2006年 AWS EC2 (Elastic Compute Cloud) 诞生,“云计算”一词也首次被正式提出。

2011年网景公司的创始人马克·安德森说:“软件正在吞噬世界”。

2013年 Docker 诞生,在其推动下,容器化技术浪潮席卷全球。

同年 Pivotal 公司的 Matt Stine 首次提出云原生(CloudNative)的概念。2017年最新版的云原生概念被概括为4个要点:DevOps + 持续交付 + 微服务 + 容器。

2014年谷歌基于内部的 Borg 容器调度技术 开源了 kubernetes,并积极推动成立了云原生基金会 CNCF ,以遏制 Docker 公司在此领域的影响力,由此拉开了云原生时代的序幕。

2015年7月云原生计算基金会(CNCF)成立,隶属于 Linux 基金会,致力于培育和维护一个厂商中立的开源生态系统,大力推广云原生技术。

这是云原生全景图 landscape.cncf.io/,目前共有 1,261 个项目,并且还在持续增加中。

每个时代都有其特定的风口,而现在业内普遍认同云原生就是风口。

草蛇灰线,历史总是如此相似,趋势无人能左右,作为个体我们只能选择加入,只有这样才不负这个时代。

让我们了解云原生,拥抱云原生。


课后习题

1. Docker 是哪一年发布的?

A. 2000年
B. 2006年
C. 2013年
D. 2014年

2. 下面关于 Docker 的哪一种说法是错误的?

A. Docker 不是虚拟机,不提供系统内核。
B. Docker 几乎没有的性能损耗,几乎所有应用程序都可以进行容器化。
C. Docker 不支持 32 位操作系统。
D. Docker 容器中不能再运行一个 Docker


Docker Desktop 的使用

zhuanlan.zhihu.com/p/632511027

安装后 Docker Desktop 就可以在 Windows PowerShell 中使用 docker 命令了,与 linux 中使用 docker 命令一样。Docker Desktop 中运行容器无法指定运行参数,如 -it , 导致 很多容器无法正常运行,此时可以借助命令行执行命令。

Docker Desktop 无法正常启动时,以管理员身份运行 Windows PowerShell

 wsl --update
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data