文章目录
- 一、Docker是什么?
-
- Docker本质
- Docker和虚拟机的区别
- [Docker 和 JVM 虚拟化的区别?](#Docker 和 JVM 虚拟化的区别?)
- 二、Docker版本
- 三、Docker官方网站
- 四、Docker架构
- 五、Docker生态
- 六、Docker安装
-
- [Ubuntu安装(以华为云Ubuntu 20.04为例)](#Ubuntu安装(以华为云Ubuntu 20.04为例))
- [CentOS安装(以CentOS 7.9为例)](#CentOS安装(以CentOS 7.9为例))
- [GUI版本安装(以windows 10为例)](#GUI版本安装(以windows 10为例))
一、Docker是什么?
Docker本质
Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术, Docker 只是把这种技术在使用上简易普及了。 Docker 在早期的版本其核心就是 LXC 的二次封装发行版。

Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是 "Build, Ship and Run Any APP, Anywhere",即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到 "一次封装,到处运行"。
早期 Docker 利用 LXC 做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件, image 文件),镜像文件集中放在一个仓库中。当需要创建容器时, Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以, Docker 极大的简化了容器的使用难度。以后我们创建启动容器,只需要一个命令, docker-run,docker-stop 就可以启动停止一个容器了。
Docker 早期是基于 LXC 容器管理引擎实现,当后来成熟之后, Docker 自建了一个容器引擎叫 libcontainer,后来 CNCF 的介入, Docker 又研发了一个工业化标准的容器引擎 runC,目前所使用的新版 Docker,所使用的容器引擎就是 RunC。
一般部署应用程序的过程:

docker部署应用程序的过程:

Docker和虚拟机的区别

docker vs 虚拟机

Docker 为什么比虚拟机资源利用率高,启动快?

-
docker 有比虚拟机更少的抽象层。 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。 docker 利用的是宿主机的内核,而不需要Guest OS,节省了 Guest OS 占用的资源。
-
docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个docker 容器只需要几秒钟。
Docker 和 JVM 虚拟化的区别?

二、Docker版本
Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是 docker-ce
-
lxc: lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。 -
libcontainer: docker 从 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc。在 1.11 版本拆分出 runc 后,libcontainer 也随之成为了 runc 的核心功能模块, runc 后续变成了容器标准。 -
moby: moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby,事实上这个 moby 就是 dockerd 目前使用的开源项目名称, docker 项目中的 engine(dockerd)仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。 moby官网
-
docker-ce: docker 的开源版本, CE 指 Community Edition。docker-ce 中的组件来自于 moby、 containerd 等其他项目。docker-ce官网 -
docker-ee: docker 的收费版本, EE 指 Enterprise Edition。其基础组件来源和docker-ce 是一样的,但附加了一些其他的组件和功能。docker-ee官网
三、Docker官方网站
打开Docker官方网站,我们可以看到官网首页有docker的产品、面向开发者、docker的收费标准和一些相关博客等等,这里我们主要关注一下docker面向开发者的文档。


四、Docker架构
Docker 使用 客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器、Docker 容器通过 Docker 镜像来创建。

Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub 提供了庞大的镜像集合供使用。Docker daemon:Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护进程。Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。Docker 容器(Container):容器是独立运行的一个或一组应用。
五、Docker生态
新时代软件述求
我们来考虑 2 个问题, Docker 为什么要设计镜像,然后又搭建个 Docker Hub,搞个镜像仓库呢?我们来看下现在的时代发生了什么?
数据量疯狂增长
随着物联网、边缘计算等智能终端设备不断普及,受到来自物联网设备信号、元数据、娱乐相关数据、云计算和边缘计算的数据增长的驱动,全球数据量呈现加速增长。根据 IDC 分布的《数据时代 2025》预测,全球数据量将从 2018 年的 33ZB 增至 2025年的 175ZB,增长超过 5 倍;中国平均增速快于全球 3%,预计到 2025 年将增至48.6ZB,占全球数据圈的比例由 23.4%提升至 27.8%。其中,中国企业级数据量将从2015 年占中国数据量的 49%增长到 2025 年的 69%。

处理能力快速增加
腾讯云全球服务器数量 100w+,数据量 EB+; 2020 年阿里云:在全国已建成 5 大超级数据中心,阿里云在全球 22 个地域部署了上百个数据中心,服务器的总规模数已经接近 200 万台。
某省疾控中心疫苗预约系统、全员核酸检测系统、健康码系统共 300 余台服务器,并为核酸检测系统快速扩容计算和存储资源。
软件需求爆发式增长
- 软件发布频繁
- 研发模式从瀑布开发演变为敏捷开发,原来 3 个月上一次新功能,现在两周一次,而开发过程中我们也经常遇到需要修改需求,然后变更再发布的情况。

- 软件上线有问题需要快速回滚,对软件有着极强的版本管理和回滚诉求。

- 研发模式从瀑布开发演变为敏捷开发,原来 3 个月上一次新功能,现在两周一次,而开发过程中我们也经常遇到需要修改需求,然后变更再发布的情况。
- 软件需要共享
软件的研发人员、研发公司在设计、研发好一款软件的时候,如何方便的共享给他人,而又能快速的使用起来。 - 环境搭建复杂,技术种类繁多
每个项目组使用的语言不一样,需要不同的环境,每个都得搞一套。每次都要从 yum开始一个个完成部署安装,每次都有各种奇怪的问题,运维成本很高。

Docker解决方案
云时代需要我们针对这些诉求有一套针对的解决方案。
- 我们要处理海量的数据,如何处理呢?
购买大量的服务器,并研发对应软件 - 开发的需求需要频繁的变更上线,如何才能将修改的代码快速的分发到几百或者几千台服务器呢?如何共享软件呢?
搞一个中心仓库,让各个服务器去下载软件包,安装,所以 CentOS 搞了 yum 仓库,docker 设计了镜像仓库, docker hub 是公共的托管仓库。 - 软件设计好以后,怎么快速安装启动,有问题回滚呢?
将 docker 需要的所有信息设计一套软件格式,把所有的依赖搞进去,并打上版本标签,这样不会换一个服务器各种问题,所以 Docker 设计了镜像。 - 不同的开发环境怎么搭建呢,一会 java,一会 c++?
docker 设计了镜像来应对,镜像里面存放了需要运行的环境,就像我们的 iPhone 内置 ios,我们的华为 mate 50 内置鸿蒙一样,一条命令就可以完成某个环境的搭建。
六、Docker安装
Ubuntu安装(以华为云Ubuntu 20.04为例)
安装依赖
- 操作系统版本Plain Text
Ubuntu Kinetic 22.10
Ubuntu Jammy 22.04 (LTS)
Ubuntu Focal 20.04 (LTS)
Ubuntu Bionic 18.04 (LTS) - CPU 支持
ARM 和 X86_64
如果使用Ubuntu版的Linux,这里建议安装在20.04版本以上的Ubuntu。
安装docker
💕 确定操作系统版本,本次我们使用的是 Ubuntu 20.04
bash
cat /etc/*release*

💕 确定 CPU,可以看到我们的是 X86_64,是支持的,如果是 arm 一般会显示aarch64
bash
uname -a

💕 卸载旧版本,如果是新购买的云服务器是没有的,比如输入 docker 并没有这个命令,就不需要卸载
bash
sudo apt-get remove docker docker-engine docker.io containerd runc

💕 卸载历史版本
bash
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y

这里我们可以看到之前安装docker的数据还没有被删除掉,下面我们需要手动删除一下:
bash
#删除目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#如果我们之前修改过目录,那么需要根据具体情况进行删除。例如: sudo rm -rf /data/var/lib/docker sudo rm -rf /etc/docker/daemon.json

💕 配置docker下载源
bash
#curl 命令安装
apt install curl -y

bash
#创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
#下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

bash
# 查看docker源目录
ll /etc/apt/sources.list.d/
# 配置docker源
echo \
"deb [arch=$(dpkg --print-architecture) signedby=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

💕 安装
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

这里发生了报错,没关系,我们可以使用journalctl命令查看一下报错日志:
bash
journalctl -eu docker

执行如下命令修复:
bash
#配置加载
systemctl daemon-reload
#启动服务
systemctl start docker

💕 自动启动配置
bash
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker
💕 检查安装结果查看版本
bash
#检查安装结果查看版本
docker version
#更详细查看docker信息
docker info


红色圈起来的表示docker数据存放的位置。
💕 执行 hello-world 可以看到 Hello from Docker,表面 docker 服务正常

实战经验
见下面的Centos安装docker的实战经验。
CentOS安装(以CentOS 7.9为例)
安装依赖
- 支持的操作系统
Plain Text
CentOS 7
CentOS 8 (stream)
CentOS 9 (stream) - 支持的CPU
Plain Text
ARM/X86_64
安装Docker
💕 确认操作系统,本次我们使用的是 Centos 7.9
bash
cat /etc/*release*

💕 确定 CPU,可以看到我们的是 X86_64
bash
uname -a

💕 卸载旧版本,如果是新购买的云服务器是没有的,比如输入 docker 并没有这个命令,就不需要卸载
bash
#检查机器上是否安装有docker
docker
docker version
#卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

💕 卸载历史版本
bash
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
#执行卸载--默认安装目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#这个是修改后的目录,根据实际情况设置
sudo rm -rf /data/var/lib/docker
sudo rm -rf /etc/docker/daemon.json

💕 配置仓库
bash
# 查看系统仓库的地址
ll /etc/yum.repos.d/
# 安装yum-utils工具包
yum install -y yum-utils

bash
#配置repo
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#查看repo
cat /etc/yum.repos.d/docker-ce.repo

💕 配置使用国内源
bash
sed -i 's@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

💕 安装最新版本
bash
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

💕 启动docker
bash
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker

💕 检查安装结果查看版本
bash
#查看docker版本
docker version
#更详细查看 docker 信息
docker info


💕 执行 hello-world 可以看到 Hello from Docker,表面 docker 服务正常
bash
docker run hello-world

实战经验
💕 docker镜像源修改
创建docker引擎的配置文件daemon.json
bash
#进入docker的配置目录
cd /etc/docker/
#创建配置文件
vim daemon.json

修改为国内镜像源
cpp
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}

接下来重启配置和docker服务
bash
systemctl daemon-reload
systemctl restart docker
最后输入docker info,看到配置修改成功

💕 Docker目录修改
Docker 默认的安装目录为/var/lib/docker, 这里面会存放很多很多镜像,所以我们在安装的时候需要考虑这个目录的空间,有三种解决方案。
- 将/var/lib/docker 挂载到一个大的磁盘,这种一般我们能控制挂载目录,像腾讯云这种云厂商在安装 K8s 的节点的时候提供了挂载选项,可以直接挂载这个目录过去
- 安装之前挂载一个大的磁盘,然后创建一个软链接到/var/lib/docker,这样就自动安装到我们空间比较大的磁盘了
- 安装了 docker,然后发现忘了配置这个目录,我们需要修改 docker 的配置文件。
这里我们采用第三种解决方案
bash
#假定我们磁盘的大的目录为 /data
mkdir /data -p
mkdir /data/var/lib/docker -p
#进入源目录
cd /etc/docker/
#编辑配置文件
vim daemon.json
#输入下面的json
{
"data-root": "/data/var/lib/docker"
}
#加载配置
sudo systemctl daemon-reload
#重启docker
sudo systemctl restart docker

输入docker info,我们发现docker的根目录发生了改变:

GUI版本安装(以windows 10为例)
安装依赖
- 确认开启虚拟化

- 输入win+i,然后输入启用或关闭 Windows 功能

- 选择Windows子系统和虚拟机平台

- 重启电脑,完成虚拟化设置
安装WSL2
- 以管理员身份运行
PowerShell - 查看版本,如果不是2需要更新到2

- PowerShell 运行命令更新 wsl 到最新版本

bash
# 更新wsl版本
wsl --update
#设置wsl默认版本
wsl --set-default-version 2
- 通过微软商店安装Ubuntu 22.04.3

- 启动安装好的Ubuntu 22.04.3,如图表示启动成功


安装docker
确认我们的Windows下没有安装docker

- 点击链接下载 Docker Desktop for Windows

- 右键以管理员身份运行


- 进入之后需要我们注册登录一下

- 确认 Docker 安装成功, 在 PowerShell 中输入 docker version 命令确认 Client 和 Server 是否启动

