CentOS 7.9 是企业级常用系统,Docker 在其上运行稳定且轻量(无需图形化界面,直接基于内核运行)。以下是 完整实操流程,包括安装、配置优化、核心命令使用、实战案例(如运行 Nginx、MySQL)及常见问题排查,全程贴合生产环境需求。
一、前置检查(必做)
1. 确认系统版本
先确保系统是 CentOS 7.9,避免版本不兼容:
bash
运行
cat /etc/centos-release # 输出 CentOS Linux release 7.9.2009 (Core) 则符合
uname -r # 内核版本需 ≥ 3.10(CentOS 7.9 默认满足)
2. 关闭防火墙(可选,测试环境推荐)
Docker 网络与防火墙可能冲突,测试环境可直接关闭(生产环境需配置防火墙规则,下文有说明):
bash
运行
# 临时关闭防火墙
sudo systemctl stop firewalld
# 禁止防火墙开机自启
sudo systemctl disable firewalld
# 验证:输出 inactive 则成功
sudo systemctl status firewalld
3. 关闭 SELinux(必做,避免权限拦截)
SELinux 会限制 Docker 容器的资源访问,需永久关闭:
bash
运行
# 编辑 SELinux 配置文件
sudo vim /etc/selinux/config
将 SELINUX=enforcing 改为 SELINUX=disabled,保存退出后 重启系统 生效:
bash
运行
sudo reboot
重启后验证:
bash
运行
getenforce # 输出 Disabled 则成功
二、Docker 安装步骤(精准版)
1. 卸载旧版本(若有)
CentOS 7 可能预装旧版 Docker(如 docker 或 docker-engine),先卸载避免冲突:
bash
运行
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2. 安装依赖工具
Docker 安装需依赖 yum-utils(用于管理软件源)等工具:
bash
运行
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 配置 Docker 官方软件源(稳定版)
使用 Docker 官方源(避免第三方源的兼容性问题):
bash
运行
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 安装 Docker Engine(指定稳定版本,推荐 24.0.x)
不指定版本可能安装最新版,生产环境建议指定稳定版(如 docker-ce-24.0.9):
bash
运行
# 查看可用的 Docker 版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本(以 24.0.9 为例,可替换为上述列表中的版本)
sudo yum install -y docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io docker-buildx-plugin docker-compose-plugin
5. 启动 Docker 并设置开机自启
bash
运行
# 启动 Docker 服务
sudo systemctl start docker
# 设置开机自启(关键,避免服务器重启后 Docker 失效)
sudo systemctl enable docker
# 验证 Docker 状态(输出 active (running) 则正常)
sudo systemctl status docker
6. 验证安装成功
运行官方测试镜像 hello-world,若能输出欢迎信息,则安装成功:
bash
运行
sudo docker run hello-world
成功输出示例:
plaintext
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
三、核心配置(生产环境必备)
1. 配置普通用户权限(免 sudo 操作 Docker)
默认需用 sudo 执行 Docker 命令,配置后普通用户可直接操作:
bash
运行
# 创建 docker 用户组(若已存在则忽略)
sudo groupadd docker
# 将当前用户加入 docker 组(替换为你的用户名,如 root 无需操作)
sudo usermod -aG docker $USER
# 刷新用户组(无需重启,立即生效)
newgrp docker
# 验证:无需 sudo 运行 docker 命令
docker run hello-world # 无报错则成功
2. 配置镜像加速器(解决拉取镜像慢 / 超时)
Docker Hub 国内访问慢,配置国内加速器(以阿里云、网易云为例,免费可用):
bash
运行
# 创建 Docker 配置目录(若不存在)
sudo mkdir -p /etc/docker
# 编辑配置文件 daemon.json
sudo vim /etc/docker/daemon.json
写入以下内容(直接复制粘贴):
json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com", // 网易云加速器(免费)
"https://mirror.baidubce.com", // 百度云加速器(免费)
"https://xxxxxx.mirror.aliyuncs.com" // 阿里云加速器(需注册获取专属地址)
]
}
- 阿里云加速器获取:注册阿里云账号 → 进入 容器镜像服务 → 左侧「镜像工具 → 镜像加速器」→ 复制专属地址。
配置后重启 Docker 生效:
bash
运行
# 重新加载配置
sudo systemctl daemon-reload
# 重启 Docker 服务
sudo systemctl restart docker
# 验证加速器是否生效(输出配置的加速器地址则成功)
docker info | grep "Registry Mirrors"
3. 生产环境防火墙配置(若未关闭防火墙)
若需开启防火墙,需放行 Docker 相关端口(以常用端口为例):
bash
运行
# 放行 Docker 默认桥接网络端口
sudo firewall-cmd --permanent --add-port=2375/tcp # Docker 客户端通信(非加密,测试用)
sudo firewall-cmd --permanent --add-port=2376/tcp # Docker 客户端通信(加密,生产用)
# 放行容器映射的常用端口(如 Nginx 80、MySQL 3306,根据实际需求添加)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=3306/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
# 验证已放行端口
sudo firewall-cmd --list-ports
四、Docker 核心命令实战(CentOS 7.9 常用)
以下命令覆盖「镜像管理、容器管理、网络 / 数据卷」核心场景,结合实例说明:
1. 镜像管理(拉取、查看、删除)
| 命令 | 作用 | 实战示例 |
|---|---|---|
docker pull 镜像名:版本 |
拉取镜像(版本可选,默认 latest) | docker pull nginx:1.24(拉取 Nginx 1.24 稳定版) |
docker images |
查看本地所有镜像 | docker images(输出镜像名、版本、ID 等) |
docker rmi 镜像ID/镜像名 |
删除镜像(需先删除依赖该镜像的容器) | docker rmi nginx:1.24 或 docker rmi 5a3221f0137b(镜像 ID 前几位即可) |
docker search 镜像名 |
搜索 Docker Hub 镜像 | docker search mysql(搜索 MySQL 相关镜像) |
示例:拉取 MySQL 8.0 镜像
bash
运行
docker pull mysql:8.0
2. 容器管理(创建、启动、停止、删除)
核心命令:docker run(创建并启动容器),参数说明:
-d:后台运行容器(守护态);-p 宿主机端口:容器端口:端口映射(外部访问宿主机端口 → 容器端口);--name 容器名:指定容器名称(唯一);-e 环境变量:设置容器环境变量(如 MySQL 密码);-v 宿主机目录:容器目录:数据卷挂载(持久化容器数据);--restart=always:容器随 Docker 服务自动启动(生产必备)。
实战 1:运行 Nginx 容器(Web 服务)
bash
运行
# 创建并启动 Nginx 容器,映射宿主机 80 端口到容器 80 端口
docker run -d -p 80:80 --name my-nginx --restart=always nginx:1.24
验证:访问宿主机 IP(如 http://192.168.1.100),能看到 Nginx 默认页面则成功。
实战 2:运行 MySQL 容器(数据库服务,持久化数据)
bash
运行
# 1. 创建宿主机目录(用于持久化 MySQL 数据和配置)
mkdir -p /data/mysql/data /data/mysql/conf
# 2. 启动 MySQL 容器,设置密码、挂载数据卷
docker run -d -p 3306:3306 --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置 root 密码为 123456
-v /data/mysql/data:/var/lib/mysql \ # 挂载数据目录(持久化数据)
-v /data/mysql/conf:/etc/mysql/conf.d \ # 挂载配置目录
--restart=always \
mysql:8.0
验证:用 MySQL 客户端连接宿主机 IP:3306,用户名 root,密码 123456,能连接则成功。
其他常用容器命令:
bash
运行
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 查看容器日志(实时输出,-f 实时跟踪)
docker logs -f my-nginx
# 进入容器内部(交互模式,如进入 Nginx 容器)
docker exec -it my-nginx /bin/bash
# 删除容器(需先停止,-f 强制删除运行中的容器)
docker stop my-nginx && docker rm my-nginx
# 批量删除所有停止的容器
docker rm $(docker ps -a -q)
3. 数据卷管理(持久化数据)
容器默认数据存储在内部,删除容器后数据丢失,需通过 -v 挂载宿主机目录或 Docker 数据卷:
bash
运行
# 查看 Docker 数据卷(自动创建的挂载目录)
docker volume ls
# 查看数据卷详情(如挂载路径)
docker volume inspect 数据卷名
# 删除未使用的数据卷
docker volume prune
示例:修改 Nginx 首页(通过挂载目录)
bash
运行
# 1. 复制容器内 Nginx 首页文件到宿主机挂载目录
docker cp my-nginx:/usr/share/nginx/html/index.html /data/nginx/html/
# 2. 重新启动 Nginx 容器,挂载宿主机目录
docker stop my-nginx && docker rm my-nginx
docker run -d -p 80:80 --name my-nginx \
-v /data/nginx/html:/usr/share/nginx/html \
--restart=always nginx:1.24
# 3. 修改宿主机的 index.html,容器内会实时同步
vim /data/nginx/html/index.html
4. 自定义镜像(通过 Dockerfile 打包应用)
以打包一个简单的 Python 脚本为例:
步骤 1:创建应用目录和文件
bash
运行
mkdir -p /data/python-app && cd /data/python-app
# 创建 Python 脚本 app.py
echo 'print("Hello Docker on CentOS 7.9!")' > app.py
# 创建 Dockerfile
vim Dockerfile
步骤 2:编写 Dockerfile
dockerfile
# 基础镜像(Python 3.11 官方镜像)
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 复制应用代码到容器
COPY app.py /app
# 容器启动时执行的命令
CMD ["python", "app.py"]
步骤 3:构建镜像并运行
bash
运行
# 构建镜像(-t 打标签:镜像名:版本)
docker build -t my-python-app:1.0 .
# 运行自定义镜像
docker run my-python-app:1.0 # 输出 Hello Docker on CentOS 7.9! 则成功
五、Docker 服务管理(CentOS 7.9 特有)
1. 启动 / 停止 / 重启 Docker 服务
bash
运行
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl restart docker
2. 查看 Docker 服务日志(排查启动故障)
bash
运行
sudo journalctl -u docker -f # -f 实时跟踪日志
3. 禁止 Docker 开机自启
bash
运行
sudo systemctl disable docker
六、常见问题排查(CentOS 7.9 高频问题)
1. 安装时提示 "没有可用软件包 docker-ce"
- 原因:未正确配置 Docker 官方源,或系统内核版本过低;
- 解决:
- 重新执行
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo; - 清理 yum 缓存:
sudo yum clean all && sudo yum makecache fast; - 再次安装指定版本的 docker-ce。
- 重新执行
2. 运行容器报错 "permission denied"
- 原因:普通用户未加入 docker 组,或 SELinux 未关闭;
- 解决:
- 重新执行「配置普通用户权限」步骤;
- 确认 SELinux 已关闭:
getenforce输出 Disabled(未关闭则重启系统)。
3. 拉取镜像超时(Timeout)
- 原因:未配置镜像加速器,或网络不通;
- 解决:
- 检查
daemon.json中的加速器配置,重启 Docker; - 测试网络:
ping hub-mirror.c.163.com,能通则正常。
- 检查
4. 容器启动后外部无法访问(如 Nginx 80 端口)
- 原因:防火墙未放行端口,或端口映射错误;
- 解决:
- 关闭防火墙(测试环境):
sudo systemctl stop firewalld; - 生产环境放行端口:
sudo firewall-cmd --permanent --add-port=80/tcp && sudo firewall-cmd --reload; - 检查端口映射:
docker ps确认「PORTS」列显示0.0.0.0:80->80/tcp。
- 关闭防火墙(测试环境):
5. Docker 启动失败(提示 "containerd not running")
-
原因:containerd 服务未启动(Docker 依赖 containerd);
-
解决: bash
运行
sudo systemctl start containerd sudo systemctl enable containerd sudo systemctl restart docker
七、总结
CentOS 7.9 上 Docker 的核心流程:
- 前置准备:关闭 SELinux、配置防火墙(或关闭);
- 安装:通过官方源安装指定稳定版本的 Docker Engine;
- 配置:普通用户权限、镜像加速器(生产必备);
- 使用:重点掌握
docker run命令(端口映射、数据挂载、环境变量),结合 Nginx/MySQL 实战案例理解容器运行逻辑。
通过以上步骤,即可在 CentOS 7.9 上搭建稳定的 Docker 环境,满足开发、测试或生产环境的容器化需求。后续可结合 docker-compose 编排多容器应用(如前端 + 后端 + 数据库),进一步提升部署效率。