Docker 入门文档

基于 CentOS 7 环境,2026-06-13 整理自实际安装部署过程的踩坑总结


目录

  1. Docker 是什么?
  2. 安装 Docker(CentOS 7)
  3. Docker 核心概念
  4. 常用命令速查
  5. 必知必会:解决国内网络问题
  6. 常见问题与坑
  7. 推荐学习路径

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 imagesdocker pulldocker rmi
容器(Container)
  • 镜像运行的实例,可读可写,可以启动、停止、删除
  • 类比:对象(Object)—— 类的具体实例
  • 常用命令:docker psdocker rundocker stopdocker 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; 未知的错误

原因

  1. CentOS 7 已停止维护,官方源已下线
  2. 虚拟机 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 pulldocker rundocker psdocker stopdocker 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 应用

  1. 数据库容器(MySQL/PostgreSQL)
  2. 应用容器(Python/Node.js/Java 应用)
  3. 反向代理容器(Nginx)
  4. 用 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         # 删掉残留锁文件

启示: 服务器上不需要任何图形后台服务。类似的还有 firewalldNetworkManager(如果你习惯用 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 代理服务 |

这解释了为什么:

  1. 阿里云 Docker 镜像加速器配了但没用(阿里云停止了对 Docker Hub 的代理)
  2. 中科大镜像连不上(Connection refused
  3. 最终 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 从入门到实践

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐