CentOS 7.9环境下Docker高效部署与优化指南
为什么选择Docker进行应用容器化
在当今快速迭代的软件开发环境中,开发者和运维团队经常面临"在我本地能运行,但在服务器上就出问题"的经典困境。这种环境差异导致的问题不仅浪费大量调试时间,还可能影响产品交付进度。Docker通过容器化技术完美解决了这一痛点,它将应用程序及其所有依赖项打包到一个标准化的单元中,确保从开发到生产的全流程一致性。
与传统虚拟机相比,Docker容器具有显著优势:
- 资源效率:容器共享主机操作系统内核,无需为每个应用加载完整操作系统,内存占用通常仅为虚拟机的1/10
- 启动速度:容器可以在毫秒级别启动,而虚拟机通常需要数秒到数十秒
- 可移植性:容器镜像可以在任何支持Docker的环境中运行,无论是物理机、云服务器还是开发者的笔记本电脑
- 隔离性:每个容器拥有独立的文件系统、网络和进程空间,确保应用间互不干扰
对于CentOS 7.9用户而言,Docker提供了稳定可靠的企业级容器运行时环境。特别是在国内网络环境下,合理的配置能够显著提升容器镜像的拉取速度和工作效率。
CentOS 7.9系统准备与Docker安装
系统环境检查
在开始安装Docker之前,需要确保系统满足基本要求:
# 检查内核版本(需3.10以上) uname -r # 示例输出:3.10.0-1160.el7.x86_64 # 检查系统版本 cat /etc/redhat-release # 示例输出:CentOS Linux release 7.9.2009 (Core)提示:如果内核版本低于3.10,需要先升级内核。可执行
yum update kernel -y后重启系统。
清理旧版本Docker
为避免冲突,安装前应先移除系统中可能存在的旧版本Docker:
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine配置国内Yum源加速安装
针对国内网络环境,建议使用阿里云镜像源加速Docker安装:
# 安装必要工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云Docker CE镜像源 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新yum缓存 sudo yum makecache fast安装Docker引擎
执行以下命令安装Docker及其相关组件:
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装完成后,启动Docker服务并设置开机自启:
sudo systemctl enable docker --now验证Docker是否正常运行:
sudo docker run hello-world如果看到"Hello from Docker!"的欢迎信息,说明安装成功。
Docker国内镜像加速配置
配置镜像加速器
国内直接访问Docker Hub速度较慢,可通过配置镜像加速器显著提升镜像拉取速度。以下是主流云服务商提供的镜像加速地址:
| 服务商 | 镜像加速地址 |
|---|---|
| 阿里云 | https://<你的ID>.mirror.aliyuncs.com |
| 腾讯云 | https://mirror.ccs.tencentyun.com |
| 网易云 | http://hub-mirror.c.163.com |
| 中科大 | https://docker.mirrors.ustc.edu.cn |
配置方法如下:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ] } EOF应用配置并重启服务
# 重新加载配置 sudo systemctl daemon-reload # 重启Docker服务 sudo systemctl restart docker # 验证配置是否生效 docker info | grep Mirrors -A 5Docker基础操作与实用技巧
镜像管理
搜索和下载镜像:
# 搜索官方镜像 docker search nginx # 下载指定版本镜像(不指定tag默认为latest) docker pull nginx:1.21 # 查看本地镜像列表 docker images镜像导出与导入:
# 将镜像保存为tar文件 docker save -o nginx.tar nginx:1.21 # 从tar文件加载镜像 docker load -i nginx.tar容器生命周期管理
启动容器:
# 启动一个Nginx容器并映射端口 docker run -d --name my-nginx -p 8080:80 nginx:1.21参数说明:
-d:后台运行--name:为容器指定名称-p:端口映射(主机端口:容器端口)
容器状态管理:
# 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 停止容器 docker stop my-nginx # 启动已停止的容器 docker start my-nginx # 删除容器(需先停止) docker rm my-nginx进入容器内部操作
# 以交互模式进入容器 docker exec -it my-nginx /bin/bash # 查看容器日志 docker logs my-nginxDocker存储与数据持久化
数据卷(Volume)管理
数据卷是Docker推荐的持久化数据存储方式:
# 创建数据卷 docker volume create my-data # 查看数据卷列表 docker volume ls # 使用数据卷启动容器 docker run -d --name mysql -v my-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0目录挂载
将主机目录直接挂载到容器中:
# 创建主机目录 mkdir -p ~/web/html # 启动Nginx并挂载目录 docker run -d --name web -v ~/web/html:/usr/share/nginx/html -p 80:80 nginx数据卷与目录挂载对比
| 特性 | 数据卷(Volume) | 目录挂载(Bind Mount) |
|---|---|---|
| 存储位置 | Docker管理区域(/var/lib/docker/volumes/) | 主机任意位置 |
| 权限控制 | Docker自动设置 | 需手动设置 |
| 备份迁移 | Docker命令支持 | 需手动操作 |
| 性能 | 较好 | 取决于主机文件系统 |
| 适用场景 | 数据库数据、应用数据 | 开发环境、配置文件 |
Docker网络配置实践
查看网络信息
# 列出所有网络 docker network ls # 查看网络详情 docker network inspect bridge创建自定义网络
# 创建自定义桥接网络 docker network create my-net # 在自定义网络中启动容器 docker run -d --name web1 --network my-net nginx docker run -d --name web2 --network my-net nginx # 测试容器间通信 docker exec -it web1 ping web2网络模式对比
Docker支持多种网络模式,适用于不同场景:
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单主机容器通信 |
| host | 容器直接使用主机网络 | 高性能需求场景 |
| none | 无网络配置 | 特殊安全需求 |
| overlay | 跨主机容器通信 | Swarm集群环境 |
Docker Compose多容器编排
安装Docker Compose
# 下载最新稳定版 sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 添加执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version编写docker-compose.yml
以下是一个典型的Web应用+MySQL的编排示例:
version: '3.8' services: web: image: nginx:1.21 ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html depends_on: - db networks: - app-net db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: myapp volumes: - mysql-data:/var/lib/mysql networks: - app-net volumes: mysql-data: networks: app-net: driver: bridge常用Compose命令
# 启动服务(后台运行) docker-compose up -d # 查看服务状态 docker-compose ps # 查看服务日志 docker-compose logs -f # 停止并删除服务 docker-compose down # 重建服务 docker-compose up -d --build生产环境优化建议
资源限制
为防止单个容器占用过多资源,应设置合理的资源限制:
# 启动容器时限制CPU和内存 docker run -d --name limited \ --cpus 1.5 \ --memory 512m \ nginx在docker-compose.yml中配置:
services: web: image: nginx deploy: resources: limits: cpus: '0.5' memory: 256M日志管理
默认情况下,Docker容器日志会无限增长,需要配置日志轮转:
# 全局配置(需重启Docker服务) sudo tee /etc/docker/daemon.json <<-'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF安全最佳实践
避免使用root用户运行容器:
docker run -u 1000:1000 nginx只读文件系统:
docker run --read-only nginx限制容器能力:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx定期更新镜像:
docker pull nginx:latest docker-compose pull
常见问题排查
镜像拉取失败
现象:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection
解决方案:
- 检查网络连接
- 确认镜像加速器配置正确
- 尝试更换其他镜像源
端口冲突
现象:Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
解决方案:
- 查找占用端口的进程:
sudo netstat -tulnp | grep :80 - 停止冲突服务或修改容器映射端口
存储空间不足
现象:no space left on device
解决方案:
- 清理无用镜像:
docker system prune -a - 迁移Docker数据目录到更大分区
- 设置存储驱动为overlay2(默认)并配置存储限制
容器启动后立即退出
排查步骤:
- 查看容器日志:
docker logs <容器ID> - 以交互模式运行排查:
docker run -it --entrypoint /bin/sh <镜像> - 检查容器进程:
docker top <容器ID>