本文参考 Docker 官方文档(docs.docker.com)整理,涵盖 Docker 核心概念、Ubuntu/CentOS 安装步骤、镜像与容器操作、Dockerfile 构建、数据卷、网络、Docker Compose 等内容,适合从零开始系统学习 Docker。
📌 前言
Docker 是目前应用最广泛的容器化技术,能够将应用及其依赖打包成一个轻量、可移植的"容器",实现"一次构建,到处运行"。本文按照 概念 → 安装 → 基础命令 → 进阶用法 的顺序讲解,所有安装步骤均以 Docker 官方文档为准,确保命令可以直接复制执行。
目录导航:
- Docker 核心概念
- 卸载旧版本(避免冲突)
- Ubuntu 安装 Docker Engine(官方仓库方式)
- CentOS 安装 Docker Engine
- 便捷脚本安装方式
- 安装后配置(免 sudo、开机自启)
- 验证安装与常用管理命令
- 镜像(Image)操作详解
- 容器(Container)操作详解
- 数据卷与数据持久化
- 网络管理
- Dockerfile 自定义镜像
- Docker Compose 多容器编排
- 常用运维与排查命令
- 总结速查表
一、Docker 核心概念
在动手安装之前,先明确几个核心概念,方便理解后续命令:
| 概念 | 说明 |
|---|---|
| 镜像(Image) | 只读的模板,包含运行应用所需的代码、依赖、环境变量、配置文件等,类似"安装包" |
| 容器(Container) | 镜像的运行实例,可以启动、停止、删除,多个容器可以基于同一镜像创建 |
| 仓库(Repository) | 存放镜像的地方,如 Docker Hub(官方公共仓库)、私有仓库 |
| Dockerfile | 用于自定义构建镜像的文本文件,包含一系列构建指令 |
| 数据卷(Volume) | 用于持久化容器数据的机制,容器删除后数据卷中的数据依然保留 |
| Docker Compose | 用于定义和管理多容器应用的工具,通过一个 YAML 文件即可编排多个服务 |
💡 Docker 采用 Client-Server 架构 :
docker命令行工具是客户端,真正干活的是后台的dockerd(Docker daemon),二者通过 Unix Socket 或 TCP 通信。
二、卸载旧版本(避免冲突)
根据 Docker 官方文档,安装前需要先卸载可能存在冲突的旧版本或非官方软件包,包括:docker.io、docker-compose、docker-compose-v2、docker-doc、docker-buildx、podman-docker,以及旧版的 containerd、runc。
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
💡 如果系统提示这些包都没有安装,直接忽略即可,不影响后续安装。
三、Ubuntu 安装 Docker Engine(官方仓库方式,推荐)
Docker 官方文档推荐通过 apt 仓库 安装,这样后续可以直接通过 apt update 获取安全更新,是生产环境的标准做法。目前官方支持的 Ubuntu 版本包括 22.04(Jammy) 、24.04(Noble) 、26.04(Resolute) 等 LTS 版本,仅支持 64 位系统。
3.1 设置 Docker 的 apt 仓库
# 1. 安装依赖并添加 Docker 官方 GPG 密钥
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 2. 将 Docker 仓库添加到 apt 源列表
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# 3. 更新软件包索引
sudo apt update
3.2 安装 Docker 引擎
安装最新版本:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装指定版本(如需与生产环境版本对齐):
# 先列出仓库中所有可用版本
apt list --all-versions docker-ce
# 选定版本号后安装
VERSION_STRING=5:29.7.2-1~ubuntu.24.04~noble
sudo apt install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
📦 上述命令会同时安装 5 个组件:Docker Engine 本体 (docker-ce)、命令行客户端 (docker-ce-cli)、容器运行时 (containerd.io)、镜像构建增强工具 (docker-buildx-plugin)以及 Compose 插件(docker-compose-plugin)。
3.3 验证安装
sudo systemctl status docker # 确认 docker 服务已在运行
sudo docker run hello-world # 拉取并运行测试镜像
如果一切正常,终端会打印一段确认信息,说明 Docker Engine 已经安装成功并可以正常拉取镜像、创建容器。
3.4 升级 Docker Engine
升级只需重复第 3.2 步的安装命令,选择新的版本号即可,apt 会自动完成升级。
四、CentOS 安装 Docker Engine
CentOS / RHEL 系发行版使用 yum(或 dnf)管理软件包,步骤如下:
# 1. 卸载旧版本(如果存在)
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2. 安装 yum-utils 并配置 Docker 官方仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 3. 安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 4. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 5. 验证安装
sudo docker run hello-world
五、便捷脚本安装方式(仅推荐测试/开发环境)
Docker 官方还提供了一个便捷安装脚本,可以在大多数 Linux 发行版上自动识别系统并完成安装,但官方明确不推荐用于生产环境:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
⚠️ 该脚本会自动安装最新稳定版,可能带来非预期的大版本升级;且不会对已有安装进行妥善升级,仅适合快速搭建测试环境。可以先加
--dry-run参数预览脚本将执行的步骤:
sudo sh ./get-docker.sh --dry-run
六、安装后配置
6.1 免 sudo 运行 docker 命令
Docker 安装完成后,docker 用户组会被自动创建,但默认没有添加任何用户,因此必须使用 sudo 才能执行 docker 命令。若想直接以当前用户身份运行:
sudo groupadd docker # 创建 docker 组(如果尚不存在)
sudo usermod -aG docker $USER # 将当前用户加入 docker 组
newgrp docker # 立即刷新组权限(或重新登录 / 重启生效)
docker run hello-world # 验证是否可以免 sudo 运行
⚠️ 安全提示:docker 组内的用户等价于拥有 root 级别权限(可以挂载宿主机任意目录),生产环境中请谨慎将用户加入该组。
6.2 设置开机自启
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
6.3 卸载 Docker Engine
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc
💡 卸载 Docker 并不会自动删除镜像、容器、数据卷等数据,若需要彻底清理,需手动执行上述
rm -rf命令。
七、验证安装与常用管理命令
docker version # 查看 Docker 客户端和服务端版本信息
docker info # 查看 Docker 系统整体信息(存储驱动、容器数等)
systemctl status docker # 查看 docker 服务运行状态
systemctl restart docker # 重启 docker 服务
journalctl -u docker -f # 实时查看 docker 服务日志
八、镜像(Image)操作详解
docker search nginx # 在 Docker Hub 搜索镜像
docker pull nginx:1.25 # 拉取指定标签的镜像
docker pull nginx # 不指定标签默认拉取 latest
docker images # 列出本地已有镜像
docker image ls # 同上,官方推荐的新式写法
docker rmi nginx:1.25 # 删除指定镜像
docker image prune # 清理无用的悬空镜像(dangling images)
docker image prune -a # 清理所有未被容器使用的镜像(⚠️ 谨慎)
docker tag nginx:1.25 myrepo/nginx:v1 # 给镜像打标签,便于推送到仓库
docker push myrepo/nginx:v1 # 推送镜像到仓库(需先 docker login)
docker save -o nginx.tar nginx:1.25 # 将镜像导出为 tar 文件
docker load -i nginx.tar # 从 tar 文件导入镜像
docker history nginx:1.25 # 查看镜像的构建历史(各层信息)
docker inspect nginx:1.25 # 查看镜像的详细元数据(JSON 格式)
九、容器(Container)操作详解
9.1 创建与启动容器
docker run nginx # 创建并启动一个容器(前台运行)
docker run -d nginx # 后台运行(detached 模式)
docker run -d -p 8080:80 nginx # 端口映射:宿主机 8080 → 容器 80
docker run -d --name my-nginx nginx # 指定容器名称,便于后续管理
docker run -d -e ENV_NAME=value nginx # 设置环境变量
docker run -it ubuntu /bin/bash # 交互式运行并进入容器终端
docker run --rm nginx # 容器退出后自动删除,适合临时任务
docker run -d --restart=always nginx # 设置容器异常退出后自动重启
常用参数速查:
| 参数 | 说明 |
|---|---|
-d |
后台(detached)运行 |
-it |
交互式终端(-i 保持标准输入打开,-t 分配伪终端) |
-p 宿主机端口:容器端口 |
端口映射 |
-v 宿主机路径:容器路径 |
挂载数据卷 |
--name |
指定容器名称 |
-e |
设置环境变量 |
--rm |
容器停止后自动删除 |
--restart |
设置重启策略(no / on-failure / always / unless-stopped) |
--network |
指定容器所连接的网络 |
9.2 查看与管理容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
docker stop my-nginx # 停止容器
docker start my-nginx # 启动已停止的容器
docker restart my-nginx # 重启容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除(包括正在运行的容器)
docker pause my-nginx # 暂停容器内所有进程
docker unpause my-nginx # 恢复容器
9.3 进入容器与执行命令
docker exec -it my-nginx /bin/bash # 进入正在运行的容器内部终端
docker exec my-nginx ls /usr/share/nginx/html # 在容器内执行单条命令而不进入交互模式
docker attach my-nginx # 附加到容器主进程(⚠️ 退出会导致容器停止,谨慎使用)
💡
exec和attach的区别 :docker exec会在容器内新建一个进程,退出不影响容器主进程;docker attach是连接到容器的主进程,按Ctrl+C可能导致容器整体退出,日常调试推荐使用exec。
9.4 日志与状态查看
docker logs my-nginx # 查看容器日志
docker logs -f my-nginx # 实时追踪容器日志
docker logs --tail 100 my-nginx # 只看最近 100 行日志
docker stats # 实时查看所有容器的 CPU/内存/网络占用
docker top my-nginx # 查看容器内正在运行的进程
docker inspect my-nginx # 查看容器的详细配置信息(JSON 格式)
docker port my-nginx # 查看容器的端口映射情况
9.5 容器与宿主机之间传输文件
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf # 从容器拷贝文件到宿主机
docker cp ./index.html my-nginx:/usr/share/nginx/html/ # 从宿主机拷贝文件到容器
十、数据卷与数据持久化
容器删除后,其内部产生的数据默认会一并丢失,因此需要通过 数据卷(Volume) 或 绑定挂载(Bind Mount) 实现数据持久化。
docker volume create my-vol # 创建一个命名数据卷
docker volume ls # 查看所有数据卷
docker volume inspect my-vol # 查看数据卷详细信息
docker volume rm my-vol # 删除数据卷
docker volume prune # 清理未被任何容器使用的数据卷
# 使用数据卷启动容器
docker run -d -v my-vol:/var/lib/mysql mysql:8.0
# 使用绑定挂载(将宿主机目录直接挂载到容器)
docker run -d -v /host/data:/var/lib/mysql mysql:8.0
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 数据卷(Volume) | 由 Docker 管理,存放在 /var/lib/docker/volumes/ 下 |
数据库、需要长期持久化的数据,推荐首选 |
| 绑定挂载(Bind Mount) | 直接映射宿主机任意目录 | 开发调试、需要直接编辑宿主机文件的场景 |
十一、网络管理
docker network ls # 查看所有网络
docker network create my-net # 创建自定义桥接网络
docker network inspect my-net # 查看网络详细信息
docker network rm my-net # 删除网络
docker run -d --network my-net --name app nginx # 将容器加入自定义网络
docker network connect my-net my-nginx # 将已运行的容器接入指定网络
💡 Docker 默认提供
bridge、host、none三种网络模式。同一个自定义网络内的容器可以通过 容器名 直接互相访问,无需知道 IP,这也是 Docker Compose 多服务通信的底层原理。
十二、Dockerfile 自定义镜像
当官方镜像无法满足需求时,可以通过 Dockerfile 定义构建流程,生成自己的镜像。
Dockerfile 示例(构建一个简单的 Node.js 应用镜像):
# 指定基础镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /app
# 先复制依赖描述文件,利用构建缓存加速
COPY package*.json ./
RUN npm install
# 复制项目源码
COPY . .
# 声明容器对外暴露的端口
EXPOSE 3000
# 容器启动时执行的默认命令
CMD ["npm", "start"]
常用构建与推送命令:
docker build -t my-app:v1 . # 基于当前目录的 Dockerfile 构建镜像
docker build -t my-app:v1 -f Dockerfile.prod . # 指定 Dockerfile 文件名
docker build --no-cache -t my-app:v1 . # 不使用缓存,全量重新构建
docker run -d -p 3000:3000 my-app:v1 # 运行自定义镜像构建的容器
常用 Dockerfile 指令速查:
| 指令 | 作用 |
|---|---|
FROM |
指定基础镜像 |
WORKDIR |
设置容器内的工作目录 |
COPY / ADD |
将文件从宿主机复制到镜像中 |
RUN |
构建阶段执行的命令(如安装依赖) |
ENV |
设置环境变量 |
EXPOSE |
声明容器运行时监听的端口(仅为文档说明,不会自动映射) |
CMD |
容器启动时的默认执行命令,可被 docker run 后的参数覆盖 |
ENTRYPOINT |
容器启动时始终执行的命令,通常与 CMD 搭配传参 |
十三、Docker Compose 多容器编排
对于需要多个容器协同工作的场景(如:Web 应用 + 数据库 + 缓存),推荐使用 Docker Compose 统一编排。
docker-compose.yml 示例:
version: "3.9"
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
networks:
- app-net
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=example
- MYSQL_DATABASE=mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-net
volumes:
db-data:
networks:
app-net:
常用 Compose 命令:
docker compose up -d # 后台启动所有服务(新版为 docker compose,无中划线)
docker compose up -d --build # 启动前先重新构建镜像
docker compose down # 停止并删除所有服务的容器、网络
docker compose down -v # 同时删除数据卷(⚠️ 数据会丢失)
docker compose ps # 查看当前项目下所有服务的状态
docker compose logs -f web # 查看指定服务的实时日志
docker compose restart web # 重启指定服务
docker compose exec web sh # 进入指定服务的容器内部
💡 注意 :较新版本 Docker 已将 Compose 内置为
docker compose(插件形式,无中划线),旧版的独立命令docker-compose(有中划线)逐渐被取代,两者用法基本一致。
十四、常用运维与排查命令
docker system df # 查看镜像、容器、数据卷占用的磁盘空间
docker system prune # 清理所有停止的容器、未使用的网络、悬空镜像
docker system prune -a --volumes # 深度清理,包括未使用的镜像和数据卷(⚠️ 谨慎执行)
docker events # 实时查看 Docker 守护进程产生的事件流
docker diff my-nginx # 查看容器相对于镜像发生了哪些文件变更
常见问题排查思路:
| 现象 | 排查方向 |
|---|---|
| 容器启动后立刻退出 | docker logs 容器名 查看报错信息,多为启动命令异常或缺少必需环境变量 |
| 端口访问不通 | docker ps 确认端口映射是否正确 → 检查宿主机防火墙/安全组规则 |
| 磁盘空间被占满 | docker system df 查看占用 → docker system prune 清理无用资源 |
| 免 sudo 权限不生效 | 确认已执行 usermod -aG docker $USER 并重新登录或执行 newgrp docker |
| 容器间无法通信 | 确认多个容器处于同一自定义网络下,而非默认的 bridge 网络 |
十五、总结速查表
| 场景 | 高频命令 |
|---|---|
| 安装配置 | apt install docker-ce ...、systemctl enable docker、usermod -aG docker |
| 镜像操作 | docker pull docker images docker rmi docker build |
| 容器操作 | docker run docker ps docker stop/start docker rm |
| 进入容器 | docker exec -it |
| 日志查看 | docker logs -f |
| 数据持久化 | docker volume create -v 挂载 |
| 网络管理 | docker network create/connect |
| 多容器编排 | docker compose up -d docker compose down |
| 清理维护 | docker system prune docker image prune |
Docker 的学习曲线并不陡峭,掌握"镜像 → 容器 → 数据卷 → 网络 → Compose 编排"这条主线后,绝大部分实际场景都能顺利应对。建议结合官方文档(docs.docker.com)动手实践,加深理解。
📎 如果本文对你有帮助,欢迎点赞收藏,也欢迎在评论区分享你在 Docker 使用过程中踩过的坑!