初识Docker
字数: 0 字 时长: 0 分钟
1.什么是Docker
官话版
微服务架构虽然提升了系统的可维护性、可扩展性和服务独立性,但同时也增加了应用部署和环境管理的复杂度。
分布式系统通常依赖数据库、缓存、消息队列、注册中心等多个基础组件,不同组件之间可能存在版本、依赖及配置方面的兼容性问题。
当服务需要部署到大量服务器时,人工维护运行环境难以保证一致性,容易产生环境差异,从而增加部署、运维和问题排查的成本。
人话版
微服务虽然把系统拆得更灵活了,但部署也会变得更麻烦。
一个微服务项目通常会依赖 MySQL、Redis、MQ、注册中心等很多组件,组件一多,版本和配置就容易互相冲突。
服务数量多以后,还要部署到不同服务器上。如果每台机器的环境不一致,就很容易出现“开发环境能跑,换台机器就出问题”的情况。
1.1 应用部署的环境问题
大型项目通常包含较多的服务和基础组件,运行环境也更加复杂,因此在部署过程中容易遇到以下问题:
组件和依赖较多,不同版本之间可能存在兼容性问题
开发、测试、生产环境存在差异,容易导致部署结果不一致

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
1.2.Docker解决依赖兼容问题
Docker 主要通过“打包”和“隔离”来解决应用部署中的依赖与环境问题:
将应用程序、依赖、运行环境和配置统一打包,形成可移植的镜像
将应用运行在相互隔离的容器中,减少不同应用之间的环境和依赖冲突

打包后的镜像不仅包含应用程序本身,还包含运行所需的依赖、函数库和相关配置,因此部署到其他环境时,不需要再单独安装和配置这些依赖,可以减少因环境差异带来的兼容性问题。
不过,仅仅解决应用依赖问题还不够。开发、测试和生产环境之间仍然可能存在操作系统、系统库或版本差异,那么 Docker 又是如何保证运行环境尽可能一致的呢?
1.3.Docker解决操作系统环境差异
要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构如下:

结构包括:
计算机硬件:例如CPU、内存、磁盘等
系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便。
应用于计算机交互的流程如下:
1)应用调用操作系统应用(函数库),实现各种功能
2)系统函数库是对内核指令集的封装,会调用内核指令
3)内核指令操作计算机硬件
Ubuntu和CentOS都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:

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

Docker如何解决不同系统环境的问题?
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
如图:

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 的思路更轻一些:
不再额外启动一整套操作系统,而是把程序、依赖和运行环境一起打包,然后放进一个隔离的容器里运行。
如图:

对比来看:

小结:
Docker和虚拟机的差异:
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
3.Docker架构
3.1 镜像和容器
Docker 中最核心的两个概念是 镜像(Image) 和 容器(Container)。
镜像(Image):将应用程序以及运行所需的依赖、函数库、配置等内容打包形成的文件集合。镜像本身由一系列只读层组成,可以理解为应用运行环境的“模板”。
容器(Container):镜像运行后产生的实例。Docker 会对容器中的进程、文件系统、网络等资源进行隔离,使不同容器之间能够相对独立地运行。
简单来说,可以把镜像理解成“程序文件 + 运行环境模板”,而容器就是这个模板真正运行起来后的实例。
一个镜像可以创建并运行多个容器。例如,同一个 MySQL 镜像可以启动多个 MySQL 容器,每个容器都是一个独立运行的实例。
mysql:8.0 镜像
│
├── MySQL 容器 A
├── MySQL 容器 B
└── MySQL 容器 C如图:

例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多人同时聊天。
3.2.DockerHub
开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。
DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

3.3.Docker架构
我们要使用Docker来操作镜像、容器,就必须要安装Docker。
Docker是一个CS架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

4.CentOS安装Docker
企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker。
企业环境中的 Docker 通常部署在 Linux 服务器上。不同 Linux 发行版的安装方式略有差异,下面以使用 yum 包管理器的 CentOS 环境为例进行说明。
4.1. 卸载旧版本
如果系统中已经安装过旧版本 Docker,可以先卸载相关软件包,避免版本或依赖冲突:
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 之前,先安装后续配置软件仓库所需的工具以及相关依赖:
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 官方安装文档为准。
安装如图:

更新本地镜像源:
Docker CE 需要通过对应的软件仓库进行安装。为了提高国内环境下的软件包下载速度,可以配置阿里云提供的 Docker CE 镜像源。 首先添加 Docker CE 软件仓库:
yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo然后将仓库中的官方 Docker 下载地址替换为阿里云镜像地址:
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' \ /etc/yum.repos.d/docker-ce.repo更新本地软件包缓存:
yum makecache fast安装 Docker CE
配置完成后,通过 yum 安装 Docker CE:
yum install -y docker-ce其中,docker-ce 表示 Docker Community Edition(Docker 社区版)。
安装完成后,可以通过下面的命令检查 Docker 是否已经正确安装:
docker --version这里配置的是 Docker 安装软件包的镜像源,与后面 daemon.json 中配置的 Docker 镜像加速地址不是一回事。
5.启动docker
5.1 启动步骤
Docker 容器通常会通过端口映射对外提供服务,例如将容器中的 80、3306、6379 等端口映射到宿主机。 在学习或测试环境中,如果防火墙规则配置不正确,可能会导致容器端口无法从外部访问。为了简化实验环境,可以临时关闭防火墙:
# 停止 firewalld
systemctl stop firewalld
# 禁止 firewalld 开机自启
systemctl disable firewalld注意:关闭防火墙只适合学习或临时测试环境。生产环境中不建议直接关闭防火墙,应根据实际需要开放对应端口,并配置合理的安全策略。
启动与管理 Docker 服务
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务5.2 配置镜像加速
在中国大陆网络环境下,Docker Hub 官方镜像仓库可能受到网络访问限制,直接执行 docker pull 时容易出现连接超时、下载速度慢甚至无法拉取镜像的情况。 因此,通常需要配置国内可访问的镜像服务或使用国内容器镜像仓库,以提高镜像拉取的稳定性和速度。
参考阿里云容器镜像服务文档: 阿里云 Docker 镜像加速

获取到加速器地址.接下来创建文件夹.
#创建文件夹
sudo mkdir -p /etc/docker把内容写入到daemon.json
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ggpvdivf.mirror.aliyuncs.com"]
}
EOFsudo systemctl daemon-reload
sudo systemctl restart docker#查看
cat /etc/docker/daemon.json