1. Docker技术概述与核心价值
在当今云计算和微服务架构盛行的时代,Docker作为轻量级的容器化解决方案,已经成为现代IT基础设施中不可或缺的一部分。与传统的硬件虚拟化技术(如KVM)相比,Docker通过操作系统级别的虚拟化实现了更高的资源利用率和更快的启动速度。
1.1 容器与虚拟机的本质区别
传统虚拟机(如VMware或KVM)需要模拟完整的硬件环境,每个虚拟机都运行着自己的操作系统内核。这种"全虚拟化"方式虽然隔离性好,但也带来了显著的开销:
- 资源占用大:每个VM需要分配固定量的CPU、内存和存储资源
- 启动速度慢:完整的操作系统启动过程通常需要几分钟
- 性能损耗:硬件虚拟化层带来的性能损失通常在15-20%
相比之下,Docker容器共享宿主机的操作系统内核,只是通过Linux内核的命名空间(Namespace)和控制组(Cgroups)技术实现了进程隔离。这种架构带来了几个关键优势:
- 资源利用率高:容器只是被隔离的进程,不需要预留资源
- 启动速度快:容器启动通常在秒级完成
- 性能接近原生:额外性能损耗通常不到5%
实际测试数据:在一台4核8G的服务器上,可以运行约5-8个中等负载的KVM虚拟机,但可以轻松运行50+个Docker容器。
1.2 Docker的三大核心要素
理解Docker的架构,需要掌握其三个核心概念:
镜像(Image):类似于虚拟机中的ISO镜像,但更加轻量化。一个Docker镜像包含了运行应用所需的所有依赖:代码、运行时、系统工具、系统库等。镜像是分层的,这种设计使得镜像可以高效复用和共享。
容器(Container):镜像的运行实例。你可以将其理解为一个轻量级的"虚拟机",但实际上它只是宿主机上的一个隔离进程。每个容器都是相互隔离的,拥有自己的文件系统、网络配置和进程空间。
仓库(Registry):用于存储和分发Docker镜像的服务。最著名的是Docker Hub,但国内用户通常会使用阿里云、华为云等提供的镜像仓库加速服务。
1.3 Docker的架构组成
现代Docker引擎采用模块化设计,主要包含以下组件:
- dockerd:Docker守护进程,负责处理Docker API请求并管理容器生命周期
- containerd:高层运行时,负责镜像管理(下载、解压等)和容器生命周期管理
- runc:低层运行时,实际负责创建和运行容器,实现了OCI(开放容器倡议)标准
这种分层架构使得Docker更加灵活和可扩展,也为Kubernetes等编排系统与Docker的集成提供了可能。
2. Docker安装与配置实战
2.1 系统准备与环境清理
在CentOS 7/RHEL 7或兼容系统(如麒麟、欧拉)上安装Docker前,建议先清理可能存在的旧版本:
bash复制yum remove -y docker* docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate \
docker-selinux docker-engine-selinux docker-engine
这个命令会移除所有与Docker相关的旧包,避免版本冲突。值得注意的是,在企业环境中,特别是从旧版本升级时,这一步尤为重要,因为残留的配置文件可能导致新版本无法正常工作。
2.2 依赖安装与仓库配置
安装必要的依赖包:
bash复制yum install -y yum-utils device-mapper-persistent-data lvm2
这些包提供了:
yum-utils:包含yum-config-manager等实用工具device-mapper-persistent-data和lvm2:Docker存储驱动所需的设备映射工具
添加Docker CE仓库(国内用户建议使用国内镜像源):
bash复制# 阿里云镜像源(如遇403错误可切换至华为云)
wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 华为云镜像源备用方案
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum缓存后,就可以安装Docker了:
bash复制yum makecache fast
yum install -y docker-ce docker-ce-cli
如果需要安装特定版本(生产环境推荐),可以使用:
bash复制yum install -y docker-ce-20.10.23 docker-ce-cli-20.10.23
2.3 服务管理与验证
安装完成后,启动Docker服务并设置开机自启:
bash复制systemctl start docker
systemctl enable docker
验证安装是否成功:
bash复制docker --version
docker info
docker info命令会显示详细的Docker系统信息,包括存储驱动、镜像仓库配置等,这是排查问题的重要工具。
3. Docker配置优化与镜像加速
3.1 国内镜像加速配置
由于Docker Hub位于国外,直接拉取镜像速度很慢。国内各大云服务商提供了镜像加速服务。配置方法如下:
创建或修改/etc/docker/daemon.json文件:
json复制{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.mhtsec.com",
"https://docker-mirror.edu.cn",
"https://registry-accel.cn"
],
"data-root": "/opt/docker",
"dns": ["8.8.8.8", "114.114.114.114"],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5
}
关键配置项说明:
registry-mirrors:镜像加速地址,可以配置多个data-root:Docker数据存储路径,建议放在空间充足的挂载点dns:容器内使用的DNS服务器max-concurrent-downloads/uploads:并发下载/上传数,根据网络带宽调整
应用配置并重启Docker:
bash复制systemctl daemon-reload
systemctl restart docker
3.2 存储路径迁移实践
随着使用时间增长,默认的Docker存储路径(通常是/var/lib/docker)可能会空间不足。迁移到新路径的完整流程:
-
停止Docker服务:
bash复制
systemctl stop docker -
复制现有数据到新位置(假设新路径为
/opt/docker):bash复制
rsync -avz /var/lib/docker/ /opt/docker/ -
修改
daemon.json中的data-root配置 -
重启Docker:
bash复制
systemctl start docker
重要提示:迁移过程中确保有足够的磁盘空间,大型Docker环境可能需要数小时完成迁移。生产环境建议在业务低峰期进行。
4. Docker基本操作与Hello World
4.1 运行第一个容器
验证Docker安装是否成功的最简单方法是运行Hello World容器:
bash复制docker run hello-world
这个命令会执行以下操作:
- 检查本地是否有
hello-world:latest镜像 - 如果没有,从配置的镜像仓库拉取
- 创建并运行容器
- 输出Hello World消息
4.2 容器生命周期管理
Docker提供了一套完整的容器管理命令:
- 运行容器:
docker run [OPTIONS] IMAGE [COMMAND] - 列出运行中的容器:
docker ps - 列出所有容器(包括停止的):
docker ps -a - 停止容器:
docker stop CONTAINER - 启动已停止的容器:
docker start CONTAINER - 删除容器:
docker rm CONTAINER - 查看容器日志:
docker logs CONTAINER
4.3 常见问题排查
问题1:镜像拉取失败,提示"pull access denied"
解决方案:
- 检查镜像名称拼写是否正确
- 如果是私有镜像,需要先执行
docker login - 检查网络连接和镜像加速配置
问题2:容器启动后立即退出
排查步骤:
- 查看容器日志:
docker logs CONTAINER_ID - 检查容器内进程是否持续运行(非后台服务需要添加
-it参数) - 检查资源限制是否过小(内存、CPU)
问题3:端口无法访问
检查要点:
- 容器是否暴露了端口(
docker ps查看PORTS列) - 是否使用了
-p参数映射了主机端口 - 防火墙是否放行了对应端口
5. Docker进阶配置与生产实践
5.1 资源限制与调优
在生产环境中,合理限制容器资源使用至关重要:
内存限制:
bash复制docker run -it --memory=512m --memory-swap=1g ubuntu bash
--memory:设置内存硬限制--memory-swap:设置内存+交换分区总限制
CPU限制:
bash复制docker run -it --cpus=1.5 ubuntu bash
--cpus:限制容器可以使用的CPU核心数(可以是小数)
磁盘IO限制:
bash复制docker run -it --device-read-bps=/dev/sda:1mb ubuntu bash
--device-read-bps/--device-write-bps:限制磁盘读写速率
5.2 网络配置实践
Docker提供了多种网络模式:
- bridge:默认模式,容器通过docker0网桥通信
- host:容器直接使用主机网络
- none:无网络
- 自定义网络:提供更好的容器间通信和DNS解析
创建自定义网络:
bash复制docker network create --driver bridge --subnet 172.28.0.0/16 my-net
使用自定义网络运行容器:
bash复制docker run -it --network=my-net --ip=172.28.5.3 ubuntu bash
5.3 数据持久化方案
容器本身是临时的,持久化数据需要通过卷(Volume)或绑定挂载实现:
匿名卷:
bash复制docker run -v /data mysql
数据存储在/var/lib/docker/volumes/随机ID
命名卷(推荐):
bash复制docker volume create my-vol
docker run -v my-vol:/data mysql
主机目录绑定:
bash复制docker run -v /host/path:/container/path mysql
生产建议:数据库等有状态服务必须使用命名卷或绑定挂载,避免数据丢失。
6. Docker安全最佳实践
6.1 容器安全原则
-
最小权限原则:容器应以非root用户运行
bash复制
docker run -u 1000:1000 ubuntu -
只读文件系统:除非必要,否则挂载文件系统为只读
bash复制
docker run --read-only ubuntu -
资源限制:如前所述,必须设置合理的资源限制
-
定期更新:保持Docker和基础镜像为最新版本
6.2 镜像安全扫描
使用工具扫描镜像中的漏洞:
bash复制docker scan hello-world
对于企业环境,建议搭建私有镜像仓库并集成安全扫描:
- Harbor:企业级镜像仓库,支持漏洞扫描
- Trivy:开源的容器漏洞扫描工具
6.3 生产环境安全配置
在/etc/docker/daemon.json中添加安全相关配置:
json复制{
"userns-remap": "default",
"no-new-privileges": true,
"icc": false,
"live-restore": true
}
userns-remap:启用用户命名空间隔离no-new-privileges:禁止容器进程获取新权限icc:禁用容器间网络通信(需显式链接)live-restore:Docker引擎升级时保持容器运行
7. Docker与Kubernetes的演进关系
7.1 Kubernetes弃用Docker的真相
自Kubernetes 1.20起,官方宣布弃用Docker作为容器运行时。这并不意味着Docker被淘汰,而是Kubernetes转向直接使用containerd(Docker引擎的底层组件)作为运行时接口。
技术背景:
- Docker是一个完整的容器解决方案,包含了许多Kubernetes不需要的功能
- containerd实现了CRI(容器运行时接口)标准,与Kubernetes集成更高效
- 移除Docker shim层可以简化架构,提高稳定性
对用户的影响:
- 现有Docker镜像仍然可以正常使用
- 构建镜像仍然可以使用Docker工具链
- 只是运行时环境从Docker变为containerd
7.2 现代容器技术栈
当前典型的云原生技术栈:
- 开发阶段:使用Docker构建和测试镜像
- 镜像仓库:Harbor/Nexus等私有仓库管理镜像
- 编排调度:Kubernetes通过containerd运行容器
- 服务网格:Istio/Linkerd处理服务间通信
- 监控日志:Prometheus/ELK等方案监控容器状态
Docker在这一生态中仍然扮演着重要的角色,特别是在开发和CI/CD环节。