Docker入门文档
Docker 入门文档
基于 CentOS 7 环境,2026-06-13 整理自实际安装部署过程的踩坑总结
目录
1. Docker 是什么?
Docker 是一种容器化技术,可以把应用及其依赖打包在一个"容器"里运行。
和虚拟机的区别
| 特性 | 虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 资源占用 | 每个 VM 独占一个完整 OS | 共享宿主机内核 |
| 体积 | GB 级别 | MB 级别 |
| 隔离级别 | 完全隔离 | 进程级隔离 |
一句话理解
Docker ≈ 轻量级的、可移植的应用运行环境打包工具
把你的应用 + 它需要的所有环境(数据库、依赖库、配置文件)打包成一个"镜像",放到任何有 Docker 的机器上都能直接跑,再也不用担心"我电脑上能跑啊"的问题。
2. 安装 Docker(CentOS 7)
前置条件
- CentOS 7(内核 3.10+)
- root 权限
安装步骤
2.1 解决 CentOS 7 源问题
CentOS 7 已于 2024 年 6 月停止维护,官方源已不可用,需切换到阿里云镜像:
# 备份旧源
mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null
# 下载阿里云 CentOS 7 源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理并重建缓存
yum clean all yum makecache
2.2 安装 Docker
# 安装 yum-utils(提供 yum-config-manager)
yum install -y yum-utils
# 添加 Docker 仓库(使用阿里云镜像,国内下载快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker systemctl start docker systemctl enable docker
# 验证
docker --version
2.3 验证安装
# 查看版本信息
docker --version
# 查看 Docker 服务状态
docker status
3. Docker 核心概念
镜像(Image)
- 一个只读的模板,包含运行应用所需的全部文件
- 类比:类(Class)—— 是定义,不是实例
- 常用命令:
docker images、docker pull、docker rmi
容器(Container)
- 镜像运行的实例,可读可写,可以启动、停止、删除
- 类比:对象(Object)—— 类的具体实例
- 常用命令:
docker ps、docker run、docker stop、docker rm
仓库(Registry)
- 存放镜像的地方,类似 GitHub 但存的是 Docker 镜像
- 官方公共仓库:Docker Hub(hub.docker.com)
- 国内加速:阿里云镜像仓库、中科大镜像仓库
4. 常用命令速查
镜像管理
| 命令 | 说明 |
|---|---|
docker images |
列出本地所有镜像 |
docker pull <镜像名> |
从仓库拉取镜像 |
docker rmi <镜像名> |
删除本地镜像 |
docker search <关键词> |
搜索 Hub 上的镜像 |
docker build -t <标签> . |
构建镜像(通过 Dockerfile) |
容器管理
| 命令 | 说明 |
|---|---|
docker ps |
列出正在运行的容器 |
docker ps -a |
列出所有容器(含已停止的) |
docker run <镜像> |
创建并启动容器 |
docker start <容器ID> |
启动已存在的容器 |
docker stop <容器ID> |
停止容器 |
docker restart <容器ID> |
重启容器 |
docker rm <容器ID> |
删除容器 |
docker logs <容器ID> |
查看容器日志 |
docker run 常用参数
# 最常用 docker run -d \ # 后台运行(detach) --name my-nginx \ # 指定容器名称 -p 8080:80 \ # 端口映射:宿主机:容器 -v /host/path:/container/path \ # 挂载卷 nginx:latest # 镜像:标签 # 示例:运行 Nginx docker run -d --name my-nginx -p 80:80 nginx:latest
其他实用命令
docker exec -it <容器ID> bash # 进入容器内部(交互式)
docker cp <容器ID>:/path ./ # 从容器拷贝文件到宿主机
docker inspect <容器ID> # 查看容器详细信息
docker stats # 查看容器资源占用
docker system prune # 清理未使用的容器/镜像/网络(慎用)
5. 必知必会:解决国内网络问题
国内访问 Docker Hub 经常超时失败,这是最常见的问题。
5.1 配置镜像加速器
创建或编辑 /etc/docker/daemon.json:
mkdir -p /etc/docker vim /etc/docker/daemon.json
写入以下内容:
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启 Docker:
systemctl daemon-reload
systemctl restart docker
验证是否生效:
docker info | grep -A 10 "Registry Mirrors"
5.2 常用国内镜像
| 镜像源 | 地址 |
|---|---|
| 阿里云 | https://registry.cn-hangzhou.aliyuncs.com |
| 中科大 | https://docker.mirrors.ustc.edu.cn |
| 网易 | http://hub-mirror.c.163.com |
| 腾讯云 | https://mirror.ccs.tencentyun.com |
如果某个源不可用,换一个即可。建议配置多个,用数组形式。
6. 常见问题与坑
6.1 ⭐ sudo: dnf:找不到命令
原因:CentOS 7 默认包管理器是 yum,不是 dnf(Fedora/RHEL 8+ 才用 dnf)。 解决:所有 dnf 命令换成 yum。
6.2 ⭐ Could not resolve host: mirrorlist.centos.org
Could not resolve host: mirrorlist.centos.org; 未知的错误
原因:
- CentOS 7 已停止维护,官方源已下线
- 虚拟机 DNS 解析失败
解决:切换到阿里云归档源(见上文第 2.1 节)
6.3 ⭐ Another app is currently holding the yum lock
/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行。 另一个应用程序是:PackageKit
原因:PackageKit(系统后台包管理服务)占着 yum 的锁。
解决:
# 立刻解决
systemctl stop packagekit
systemctl disable packagekit
rm -f /var/run/yum.pid
# 查看 PackageKit 是否被禁止
systemctl status packagekit
PackageKit 是 Linux 桌面环境的软件包后台服务,服务器上用不到,直接禁掉不影响任何功能。
6.4 ⭐ TCP connection reset by peer 或 context deadline exceeded
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded
原因:国内网络连 Docker Hub 不稳定或被墙。 解决:配置镜像加速器(见第 5 节)。
6.5 permission denied / 普通用户不能用 Docker
docker: Got permission denied while trying to connect to the Docker daemon socket
原因:普通用户不在 docker 用户组中。
解决(在 root 下执行):
usermod -aG docker <你的用户名>
然后退出当前会话重新登录,组权限才会生效。
6.6 端口被占用
docker: Error response from daemon: driver failed programming external connectivity ... Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)
原因:宿主机上的端口(如 80)已被其他程序占用。
解决:
# 方法1 :查看谁占用了端口
netstat -tlnp | grep 80
# 方法2 :换一个端口映射
docker run -p 8080:80 nginx # 把宿主机的 8080 映射到容器的 80
# 方法3: 停掉占用端口的程序
systemctl stop nginx
6.7 容器退出后还在占用空间
容器即使停止了,它的文件系统、日志仍然占用磁盘空间。长时间不清理可能撑爆磁盘。
# 查看磁盘占用
docker system df
# 清理所有已经停止的容器、未使用的网络、dangling 镜像、构建缓存
docker system prune -a -f
# 更安全的:之清理停止的容器
docker container prune
⚠️
docker system prune -a会删除所有未被使用的镜像,谨慎使用。
6.8 Docker 占满磁盘
Docker 默认数据存储在 /var/lib/docker,日志和镜像会越积越多。
查看 Docker 占用:
du -sh /var/lib/docker
限制容器日志大小(推荐配置,写在 /etc/docker/daemon.json 中):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
然后重启 Docker。
6.9 容器启动后马上退出
docker ps -a # 发现容器状态是 Exited (0) 或 Exited (1)
原因:
- 容器内的主进程运行完了就退出(比如
hello-world就是设计成打印一行然后退出) - 应用启动失败(报错、端口冲突、配置文件错误)
调试方法:
# 查看日志
docker logs <容器ID>
# 进入容器检查
docker run -it <镜像名> bash # 交互式进入,不退出
6.10 Docker 服务起不来
systemctl start docker
# 没报错,但 docker ps 连不上
# 查看 Docker 服务详细日志
journalctl -u docker -n 50
# 或者
dockerd
常见原因:daemon.json 配置错误(JSON 格式不对)、SELinux 拦截、内核版本太低。
7. 推荐学习路径
第 1 天:基础入门
- 理解镜像和容器的概念
- 学会
docker pull、docker run、docker ps、docker stop、docker rm - 跑一个 Nginx 容器,在浏览器里访问到
第 2-3 天:深入学习
- 学会
docker exec -it进入容器 - 理解端口映射
-p - 理解数据卷
-v/--mount - 理解环境变量
-e - 用
docker build和 Dockerfile 构建自己的镜像
第 4-5 天:多容器编排
- 学习 Docker Compose(用 YAML 文件定义多个容器)
- 搭建一个 Web 应用 + MySQL 的组合
第 6 天及以后
- 学习 Docker 网络(bridge、host、overlay)
- 学习 Docker 仓库(搭建私有仓库或使用阿里云镜像仓库)
- 了解 Docker Swarm 或 Kubernetes(容器编排进阶)
典型实践:用 Docker 跑一个 Web 应用
- 数据库容器(MySQL/PostgreSQL)
- 应用容器(Python/Node.js/Java 应用)
- 反向代理容器(Nginx)
- 用 Docker Compose 把它们串起来
附录:Docker 常用命令速查图
┌─────────────────────────────────────────────────┐
│ 镜像操作 │
├─────────────────────────────────────────────────┤
│ docker pull ← 拉取镜像 ← Registry │
│ docker images ← 查看本地镜像 │
│ docker rmi → 删除镜像 │
│ docker build ← 从 Dockerfile 构建 │
│ docker tag ← 给镜像打标签 │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ 容器操作 │
├─────────────────────────────────────────────────┤
│ docker run → 创建 + 启动容器 │
│ docker start → 启动已有容器 │
│ docker stop → 停止容器 │
│ docker restart → 重启容器 │
│ docker ps → 查看运行中的容器 │
│ docker exec → 进入容器内部 │
│ docker logs → 查看容器日志 │
│ docker rm → 删除容器 │
│ docker cp → 容器 ↔ 宿主机 互拷文件 │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ 系统管理 │
├─────────────────────────────────────────────────┤
│ systemctl start docker 启动 Docker 服务 │
│ systemctl stop docker 停止 Docker 服务 │
│ systemctl restart docker 重启 Docker 服务 │
│ systemctl enable docker 设置开机自启 │
│ docker system df 查看 Docker 磁盘占用 │
│ docker system prune 清理无用资源 │
│ docker info 查看 Docker 系统信息 │
└─────────────────────────────────────────────────┘
8. 附录:安装过程踩坑深度分析
以下内容是实际安装 Docker 过程中遇到的问题及背后的根本原因分析,理解这些能帮你以后更快定位问题。
8.1 三大根本原因总览
你遇到的问题
│
├─ CentOS 7 已停服 → yum 源连不上 → 换阿里云源 ✅
│
├─ PackageKit 抢锁 → yum 卡住 → 禁掉它 ✅
│
└─ Docker Hub 被墙 → 拉不了镜像 → 找国内镜像代理 ✅
8.2 原因一:CentOS 7 已停服(EOL)
问题现象:
Could not resolve host: mirrorlist.centos.org Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
根本原因: CentOS 7 于 2024 年 6 月 30 日 正式停止支持(End of Life,简称 EOL)。官方不再维护,所有的 yum 源服务器已下线。CentOS 7 已经是"死掉"的系统了。
影响: 只要装新软件,第一件事就是换源。不换源,yum 什么都装不了。
解决:
- 切换到阿里云镜像:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo- 或者使用 vault 归档源
启示: 遇到旧系统先看版本(cat /etc/redhat-release),停服的系统要第一时间换源。
8.3 原因二:PackageKit 抢锁
问题现象:
/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行。 另一个应用程序是:PackageKit
根本原因: Linux 上有两套包管理工具同时存在: | 工具 | 角色 | 使用场景 | |------|------|----------| | yum | 命令行包管理器 | 你手动敲命令时用 | | PackageKit | 后台守护进程 | GNOME 软件中心等图形界面用 |
两者操作的是同一套底层数据库(RPM),为了数据安全,一次只能有一个进程操作,谁先拿到锁另一个就得等。
PackageKit 是设计给桌面用户用的(在图形界面点几下就能装软件),但对服务器而言完全多余。它习惯性处于"睡眠状态",不干活也不释放锁,导致 yum 卡死。
解决:
systemctl stop packagekit # 立即停止
systemctl disable packagekit # 禁止开机自启(一劳永逸)
rm -f /var/run/yum.pid # 删掉残留锁文件
启示: 服务器上不需要任何图形后台服务。类似的还有 firewalld、NetworkManager(如果你习惯用 iptables 和配置文件的话),都可以按需禁用。
8.4 原因三:Docker Hub 在国内被屏蔽(最致命)
问题现象:
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
排查过程(实际验证结果):
nslookup registry-1.docker.io → ✅ DNS 能解析到 IP(128.242.240.221)
ping registry-1.docker.io → ❌ 100% 丢包,一个包都没回来
curl baidu.com → ✅ 百度正常访问
这说明:域名能解析,但到 Docker Hub 的网络连接被定向拦截了。
根本原因——Docker Hub 在国内网络环境下受到多重限制: | 限制层 | 说明 | |--------|------| | DNS 污染 | Docker Hub 域名被解析到错误的或不可达的 IP | | 防火墙屏蔽 | 运营商/公司/学校网络直接封锁 Docker Hub 的 IP 段 | | CDN 节点屏蔽 | Docker Hub 使用 Akamai CDN,部分国内节点不可用 | | 镜像站停服 | 阿里云、中科大等镜像站陆续停止 Docker Hub 代理服务 |
这解释了为什么:
- 阿里云 Docker 镜像加速器配了但没用(阿里云停止了对 Docker Hub 的代理)
- 中科大镜像连不上(
Connection refused) - 最终
docker.1ms.run这个第三方的代理镜像站才能用
解决:
# 找到当前可用的镜像代理(下面的可能随时变化)
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors":["https://docker.1ms.run"]}
EOF
systemctl daemon-reload && systemctl restart docker
验证镜像源是否生效:
docker info | grep -A 5 "Registry Mirrors"
国内代理镜像站的可用性随时可能变化,如果某个失效了,网上搜"docker 镜像加速器"找最新的。
启示: 在国内做开发,遇到外网下载问题(Docker、npm、pip、go module、GitHub 等),第一反应就是找国内镜像源。这是一辈子的习惯。
8.5 排查方法论总结
遇到问题按以下顺序排查,少走弯路:
1. 先看环境
└─ cat /etc/os-release → 系统版本?是不是停服的老系统?
2. 再看网络
├─ curl -I https://baidu.com → 虚拟机到底有没有外网?
├─ ping -c 3 registry-1.docker.io → 目标服务器通不通?
└─ nslookup registry-1.docker.io → DNS 解析正不正常?
3. 再看服务状态
├─ systemctl status docker → Docker 运行没?
└─ systemctl status packagekit → 有没有抢锁的进程?
4. 再看配置
├─ docker info | grep -A 5 "Registry Mirrors" → 镜像源配没配?
└─ cat /etc/docker/daemon.json → 配置文件内容对不对?
5. 最后看日志
├─ docker logs <容器ID> → 单个容器的问题
└─ journalctl -u docker -n 50 → Docker 服务本身的问题
最后建议:遇到问题先查日志 ——
docker logs和journalctl -u docker能解决 80% 的问题。Docker 官方文档(英文):Docker Docs
Docker 从入门到实践(中文):Docker 从入门到实践
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)