【Docker】Docker 安装与使用详解:从零搭建到日常实战

本文参考 Docker 官方文档(docs.docker.com)整理,涵盖 Docker 核心概念、Ubuntu/CentOS 安装步骤、镜像与容器操作、Dockerfile 构建、数据卷、网络、Docker Compose 等内容,适合从零开始系统学习 Docker。


📌 前言

Docker 是目前应用最广泛的容器化技术,能够将应用及其依赖打包成一个轻量、可移植的"容器",实现"一次构建,到处运行"。本文按照 概念 → 安装 → 基础命令 → 进阶用法 的顺序讲解,所有安装步骤均以 Docker 官方文档为准,确保命令可以直接复制执行。

目录导航:

  1. Docker 核心概念
  2. 卸载旧版本(避免冲突)
  3. Ubuntu 安装 Docker Engine(官方仓库方式)
  4. CentOS 安装 Docker Engine
  5. 便捷脚本安装方式
  6. 安装后配置(免 sudo、开机自启)
  7. 验证安装与常用管理命令
  8. 镜像(Image)操作详解
  9. 容器(Container)操作详解
  10. 数据卷与数据持久化
  11. 网络管理
  12. Dockerfile 自定义镜像
  13. Docker Compose 多容器编排
  14. 常用运维与排查命令
  15. 总结速查表

一、Docker 核心概念

在动手安装之前,先明确几个核心概念,方便理解后续命令:

概念 说明
镜像(Image) 只读的模板,包含运行应用所需的代码、依赖、环境变量、配置文件等,类似"安装包"
容器(Container) 镜像的运行实例,可以启动、停止、删除,多个容器可以基于同一镜像创建
仓库(Repository) 存放镜像的地方,如 Docker Hub(官方公共仓库)、私有仓库
Dockerfile 用于自定义构建镜像的文本文件,包含一系列构建指令
数据卷(Volume) 用于持久化容器数据的机制,容器删除后数据卷中的数据依然保留
Docker Compose 用于定义和管理多容器应用的工具,通过一个 YAML 文件即可编排多个服务

💡 Docker 采用 Client-Server 架构docker 命令行工具是客户端,真正干活的是后台的 dockerd(Docker daemon),二者通过 Unix Socket 或 TCP 通信。


二、卸载旧版本(避免冲突)

根据 Docker 官方文档,安装前需要先卸载可能存在冲突的旧版本或非官方软件包,包括:docker.iodocker-composedocker-compose-v2docker-docdocker-buildxpodman-docker,以及旧版的 containerdrunc

复制代码
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                # 附加到容器主进程(⚠️ 退出会导致容器停止,谨慎使用)

💡 execattach 的区别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 默认提供 bridgehostnone 三种网络模式。同一个自定义网络内的容器可以通过 容器名 直接互相访问,无需知道 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 dockerusermod -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 使用过程中踩过的坑!

相关推荐
zhangfeng11331 小时前
AtomCode等ai agent 软件解决 直接设置限流等待时间为 5 分钟 例如商汤api限流
人工智能·算子开发
uncle_ll1 小时前
大模型落地选型GGUF 量化与 Ollama 部署指南
人工智能·大模型·llm·ollama·gguf
Dovis(誓平步青云)2 小时前
从Redis指标采集到异常告警:redis_exporter + Prometheus 完整实战
服务器·数据库·人工智能·redis·架构·prometheus·vibe coding
AcaDesign3 小时前
国家/省部市级科技奖答辩PPT_科技进步奖_自然科学奖_技术发明奖|WordinPPT
大数据·人工智能·科技·powerpoint
Ai-_Man5 小时前
希望大家能推荐一款软件,可以直接把文心生成的代码变流程图,提高办公效率
人工智能·ai·小程序·流程图
AI02267 小时前
探秘AI Agent软件公司:开启智能时代的创新引擎
人工智能
小O的算法实验室9 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
fīɡЙtīиɡ ℡9 小时前
AI 应用系统设计
java·开发语言·人工智能