网站公告

本次更新:没啥更新的

“钱塘江上潮信起,今日方知我是我”

Skip to content

初识Docker ​

字数: 0 字 时长: 0 分钟

1.什么是Docker ​

官话版 ​

微服务架构虽然提升了系统的可维护性、可扩展性和服务独立性,但同时也增加了应用部署和环境管理的复杂度。

  • 分布式系统通常依赖数据库、缓存、消息队列、注册中心等多个基础组件,不同组件之间可能存在版本、依赖及配置方面的兼容性问题。

  • 当服务需要部署到大量服务器时,人工维护运行环境难以保证一致性,容易产生环境差异,从而增加部署、运维和问题排查的成本。

人话版 ​

微服务虽然把系统拆得更灵活了,但部署也会变得更麻烦。

  • 一个微服务项目通常会依赖 MySQL、Redis、MQ、注册中心等很多组件,组件一多,版本和配置就容易互相冲突。

  • 服务数量多以后,还要部署到不同服务器上。如果每台机器的环境不一致,就很容易出现“开发环境能跑,换台机器就出问题”的情况。

1.1 应用部署的环境问题 ​

大型项目通常包含较多的服务和基础组件,运行环境也更加复杂,因此在部署过程中容易遇到以下问题:

  • 组件和依赖较多,不同版本之间可能存在兼容性问题

  • 开发、测试、生产环境存在差异,容易导致部署结果不一致

image-20250324204235656

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。

1.2.Docker解决依赖兼容问题 ​

Docker 主要通过“打包”和“隔离”来解决应用部署中的依赖与环境问题:

  • 将应用程序、依赖、运行环境和配置统一打包,形成可移植的镜像

  • 将应用运行在相互隔离的容器中,减少不同应用之间的环境和依赖冲突

image-20240502005232746

打包后的镜像不仅包含应用程序本身,还包含运行所需的依赖、函数库和相关配置,因此部署到其他环境时,不需要再单独安装和配置这些依赖,可以减少因环境差异带来的兼容性问题。

不过,仅仅解决应用依赖问题还不够。开发、测试和生产环境之间仍然可能存在操作系统、系统库或版本差异,那么 Docker 又是如何保证运行环境尽可能一致的呢?

1.3.Docker解决操作系统环境差异 ​

要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构如下:

image-20240502005316713

结构包括:

  • 计算机硬件:例如CPU、内存、磁盘等

  • 系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。

  • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便。

应用于计算机交互的流程如下:

1)应用调用操作系统应用(函数库),实现各种功能

2)系统函数库是对内核指令集的封装,会调用内核指令

3)内核指令操作计算机硬件

Ubuntu和CentOS都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:

image-20240502005426970

此时,如果将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,就会报错了:

image-20240502005444744

Docker如何解决不同系统环境的问题?

  • Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包

  • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

如图:

image-20240502005526631

1.4. 小结 ​

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像

  • Docker应用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统

  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰

  • 启动、移除都可以通过一行命令完成,方便快捷

2.Docker和虚拟机的区别 ​

官话版 ​

Docker 和虚拟机都可以在一定程度上解决应用运行环境不一致的问题,但两者的实现方式并不相同。

虚拟机(Virtual Machine) 通过虚拟化技术模拟出完整的硬件环境,并在其上运行一套独立的操作系统。例如,可以在 Windows 主机中创建一台 Ubuntu 虚拟机,再在 Ubuntu 中运行对应的应用程序。

Docker 则不需要为每个应用运行一套完整的操作系统,而是将应用程序及其运行所需的依赖、系统库和配置打包到镜像中,并通过容器隔离机制运行。多个容器通常共享宿主机内核,因此整体更加轻量。

两者的核心区别可以简单理解为:

虚拟机虚拟的是一整台计算机,而 Docker 容器主要隔离的是应用及其运行环境。

人话版 ​

虚拟机和 Docker 都是在解决一个问题:

“这个程序换台机器之后还能不能正常跑?”

虚拟机的做法比较直接:

在你的电脑里,再“装一台电脑”。

比如你的电脑是 Windows,可以先创建一台 Ubuntu 虚拟机,然后把程序放到这台虚拟的 Ubuntu 里运行。

Docker 的思路更轻一些:

不再额外启动一整套操作系统,而是把程序、依赖和运行环境一起打包,然后放进一个隔离的容器里运行。

如图:

image-20240505224752315

对比来看:

image-20240505224820825

小结:

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统

  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

3.Docker架构 ​

3.1 镜像和容器 ​

Docker 中最核心的两个概念是 镜像(Image) 和 容器(Container)。

镜像(Image):将应用程序以及运行所需的依赖、函数库、配置等内容打包形成的文件集合。镜像本身由一系列只读层组成,可以理解为应用运行环境的“模板”。

容器(Container):镜像运行后产生的实例。Docker 会对容器中的进程、文件系统、网络等资源进行隔离,使不同容器之间能够相对独立地运行。

简单来说,可以把镜像理解成“程序文件 + 运行环境模板”,而容器就是这个模板真正运行起来后的实例。

一个镜像可以创建并运行多个容器。例如,同一个 MySQL 镜像可以启动多个 MySQL 容器,每个容器都是一个独立运行的实例。

bash
mysql:8.0 镜像
    │
    ├── MySQL 容器 A
    ├── MySQL 容器 B
    └── MySQL 容器 C

如图:

image-20240505225650617

例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多人同时聊天。

3.2.DockerHub ​

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。

  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

image-20240505230246747

3.3.Docker架构 ​

我们要使用Docker来操作镜像、容器,就必须要安装Docker。

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等

  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

image-20240505230444390

4.CentOS安装Docker ​

企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker。

企业环境中的 Docker 通常部署在 Linux 服务器上。不同 Linux 发行版的安装方式略有差异,下面以使用 yum 包管理器的 CentOS 环境为例进行说明。

4.1. 卸载旧版本 ​

如果系统中已经安装过旧版本 Docker,可以先卸载相关软件包,避免版本或依赖冲突:

shell
yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine \
    docker-ce

如果系统中没有安装过 Docker,这一步可以跳过。

4.2. 安装必要工具 ​

在安装 Docker 之前,先安装后续配置软件仓库所需的工具以及相关依赖:

bash
yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2 --skip-broken

其中:

  • yum-utils:提供 yum-config-manager 等扩展工具,后续用于添加 Docker 软件仓库
  • device-mapper-persistent-data:提供 Device Mapper 相关的持久化数据支持
  • lvm2:Linux 逻辑卷管理工具,也是早期 Docker 存储驱动相关环境中常见的依赖
  • --skip-broken:遇到无法解决的依赖问题时跳过相关软件包,避免整个安装过程直接失败

需要注意:这套安装方式主要针对较早期的 CentOS / yum 环境。不同 Linux 发行版以及较新的系统版本,Docker 官方推荐的安装命令可能有所不同,实际部署时应以当前系统版本对应的 Docker 官方安装文档为准。

安装如图:

image-20240505231657272

更新本地镜像源:

Docker CE 需要通过对应的软件仓库进行安装。为了提高国内环境下的软件包下载速度,可以配置阿里云提供的 Docker CE 镜像源。 首先添加 Docker CE 软件仓库:

bash
yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

然后将仓库中的官方 Docker 下载地址替换为阿里云镜像地址:

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

更新本地软件包缓存:

bash
yum makecache fast

安装 Docker CE

配置完成后,通过 yum 安装 Docker CE:

bash
yum install -y docker-ce

其中,docker-ce 表示 Docker Community Edition(Docker 社区版)。

安装完成后,可以通过下面的命令检查 Docker 是否已经正确安装:

bash
docker --version

这里配置的是 Docker 安装软件包的镜像源,与后面 daemon.json 中配置的 Docker 镜像加速地址不是一回事。

5.启动docker ​

5.1 启动步骤 ​

Docker 容器通常会通过端口映射对外提供服务,例如将容器中的 80、3306、6379 等端口映射到宿主机。 在学习或测试环境中,如果防火墙规则配置不正确,可能会导致容器端口无法从外部访问。为了简化实验环境,可以临时关闭防火墙:

bash
# 停止 firewalld 
systemctl stop firewalld 
# 禁止 firewalld 开机自启 
systemctl disable firewalld

注意:关闭防火墙只适合学习或临时测试环境。生产环境中不建议直接关闭防火墙,应根据实际需要开放对应端口,并配置合理的安全策略。

启动与管理 Docker 服务

bash
systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

5.2 配置镜像加速 ​

在中国大陆网络环境下,Docker Hub 官方镜像仓库可能受到网络访问限制,直接执行 docker pull 时容易出现连接超时、下载速度慢甚至无法拉取镜像的情况。 因此,通常需要配置国内可访问的镜像服务或使用国内容器镜像仓库,以提高镜像拉取的稳定性和速度。

参考阿里云容器镜像服务文档: 阿里云 Docker 镜像加速

image-20240505233212058

获取到加速器地址.接下来创建文件夹.

bash
#创建文件夹
sudo mkdir -p /etc/docker

把内容写入到daemon.json

bash
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ggpvdivf.mirror.aliyuncs.com"]
}
EOF
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
bash
#查看
cat /etc/docker/daemon.json

image-20240505233535516

Noctiflorous Garden · MIT License