1. 什么是 Docker

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口。

简单来说,Docker 解决了「在我机器上能跑,在你机器上跑不了」的经典问题。通过将应用、配置、依赖和环境一起打包,Docker 让软件的交付和部署变得前所未有的简单。

为了更直观地理解 Docker 的优势,下面将 Docker 容器与传统虚拟机(VM)进行对比:

对比维度Docker 容器传统虚拟机
启动速度秒级(毫秒~秒)分钟级(需启动完整操作系统)
资源占用轻量,共享宿主机内核,占用小重量级,每个 VM 独占完整操作系统,占用大
隔离级别进程级隔离(共享内核)硬件级虚拟化,隔离更彻底
性能接近原生,开销极小有一定性能损耗(虚拟化层开销)
镜像体积小(通常几十 MB 到几百 MB)大(通常几个 GB)

下面这张架构图直观地展示了 Docker 容器与传统虚拟机在架构上的本质区别:

共享内核
进程级隔离

传统虚拟机架构

宿主机

虚拟机 2

Guest OS
完整操作系统

应用 B

宿主机内核
Host OS Kernel

Hypervisor
虚拟化层

虚拟机 1

Guest OS
完整操作系统

应用 A

Docker 容器架构

宿主机

容器层

应用 A

应用 B

应用 C

宿主机内核
Host OS Kernel

核心差异:Docker 容器直接共享宿主机内核,仅对进程进行隔离,因此资源占用极小、启动只需秒级;而传统虚拟机通过 Hypervisor 虚拟化硬件,每个 VM 都需运行完整的 Guest OS,隔离更彻底但资源开销大、启动慢。这也是 Docker 在资源利用率和部署速度上远胜传统虚拟机的原因。

总结:Docker 容器凭借秒级启动、低资源占用和接近原生的性能,在开发、测试和微服务场景中极具优势;而传统虚拟机由于提供更彻底的硬件级隔离,更适合需要强隔离、多租户安全边界或运行异构操作系统的场景。两者并非互斥,实际生产中常结合使用。

2. Docker 核心概念

在开始使用 Docker 之前,需要先理解几个核心概念:

  • 镜像(Image):镜像是一个只读的模板,用于创建容器。它包含了运行某个应用所需的全部内容——代码、运行时、系统工具、系统库和设置。可以把镜像理解为一个「类」。
  • 容器(Container):容器是镜像的运行实例。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器理解为一个「对象」。
  • 仓库(Repository):仓库是集中存放镜像文件的地方,类似于代码仓库。最常用的公共仓库是 Docker Hub。
  • Dockerfile:一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。

下面这张架构图展示了 Docker 的核心组件及其协作关系:

Docker 主机

客户端

容器运行时

REST API

拉取/推送

创建/运行

创建/运行

基于

基于

构建

Docker CLI

Docker 守护进程
dockerd

容器 1

容器 2

镜像

仓库
Docker Hub

图中各组件的作用如下:

  • 客户端(Docker CLI):用户通过命令行工具向 Docker 守护进程发送指令,例如 docker builddocker run
  • Docker 守护进程(dockerd):运行在宿主机上的后台服务,负责接收客户端请求,并管理镜像、容器、网络和卷等资源。
  • 镜像(Image):只读模板,是创建容器的「蓝图」,由 Dockerfile 构建而来。
  • 容器(Container):镜像的运行实例,是实际运行应用的环境,彼此相互隔离。
  • 仓库(Registry):集中存储和分发镜像的服务,最常用的是 Docker Hub。守护进程可以从仓库拉取镜像,也可以将本地镜像推送上去。

3. 安装 Docker

3.1 在 Linux(Ubuntu)上安装

# 更新软件包索引
sudo apt-get update

# 安装依赖包
sudo apt-get install -y ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker run hello-world

3.2 在 macOS 和 Windows 上安装

在 macOS 和 Windows 上,推荐直接安装 Docker Desktop

  1. 前往 Docker 官网 下载对应系统的安装包。
  2. 双击安装包,按提示完成安装。
  3. 启动 Docker Desktop,等待状态栏显示 Docker 引擎运行中。

3.3 验证安装

# 查看 Docker 版本
docker --version

# 查看 Docker 引擎信息
docker info

# 运行测试容器
docker run hello-world

如果看到 Hello from Docker! 的输出,说明 Docker 已成功安装并运行。

4. Docker 常用命令

4.1 镜像相关命令

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像列表
docker images

# 删除镜像
docker rmi nginx:latest

# 构建镜像(从 Dockerfile)
docker build -t my-app:1.0 .

4.2 容器相关命令

# 运行容器(前台)
docker run nginx

# 运行容器(后台运行)
docker run -d --name my-nginx nginx

# 映射端口:宿主机 8080 -> 容器 80
docker run -d -p 8080:80 --name my-nginx nginx

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 进入容器内部(交互式终端)
docker exec -it my-nginx /bin/bash

# 查看容器日志
docker logs my-nginx

# 删除容器
docker rm my-nginx

4.3 其他常用命令

4.4 常用命令速查表

下面按类别汇总了最常用的 Docker 命令,方便日常查阅:

类别命令作用说明典型示例
镜像docker pull从仓库拉取镜像docker pull nginx:latest
镜像docker images查看本地镜像列表docker images
镜像docker rmi删除本地镜像docker rmi nginx:latest
镜像docker build从 Dockerfile 构建镜像docker build -t my-app:1.0 .
容器docker run创建并启动容器docker run -d -p 8080:80 nginx
容器docker ps查看运行中的容器docker ps -a
容器docker stop停止容器docker stop my-nginx
容器docker start启动已停止的容器docker start my-nginx
容器docker exec进入容器内部执行命令docker exec -it my-nginx /bin/bash
容器docker logs查看容器日志docker logs my-nginx
容器docker rm删除容器docker rm my-nginx
网络docker network create创建自定义网络docker network create my-network
网络docker network ls查看网络列表docker network ls
网络docker network inspect查看网络详细信息docker network inspect bridge
docker volume create创建数据卷docker volume create my-data
docker volume ls查看卷列表docker volume ls
docker volume rm删除数据卷docker volume rm my-data
Composedocker compose up启动所有服务docker compose up -d
Composedocker compose ps查看服务状态docker compose ps
Composedocker compose down停止并删除所有服务docker compose down

提示:以上命令覆盖了日常开发中最常用的操作。更多命令可通过 docker --helpdocker <子命令> --help 查看完整帮助信息。

# 查看 Docker 磁盘占用
docker system df

# 清理未使用的资源
docker system prune -a

# 查看容器资源占用
docker stats

5. 编写第一个 Dockerfile

Dockerfile 是构建镜像的蓝图。下面以一个简单的 Node.js 应用为例:

# 指定基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制项目源码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "app.js"]

构建并运行:

# 构建镜像
docker build -t my-node-app:1.0 .

# 运行容器
docker run -d -p 3000:3000 --name my-node-app my-node-app:1.0

# 访问应用
curl http://localhost:3000

Dockerfile 常用指令速查

Dockerfile 编写最佳实践

掌握常用指令后,还需要遵循一些最佳实践,才能写出体积更小、构建更快、更安全的镜像。下面逐条给出示例。

1. 使用 .dockerignore 排除无关文件

构建时把本地无关文件一并复制进镜像,会白白增大镜像体积,甚至可能泄露敏感信息。通过 .dockerignore 可以提前排除它们:

# .dockerignore
node_modules
.git
*.md
Dockerfile
.dockerignore
2. 合并 RUN 指令减少层数

每一条 RUNCOPYADD 都会生成一个镜像层。将相关的命令用 && 合并到同一条 RUN 中,可以减少层数、缩小体积:

# 不推荐:产生多个层
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*

# 推荐:合并为一条 RUN
RUN apt-get update \
    && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
3. 利用构建缓存(先复制依赖清单再复制源码)

Docker 构建时会复用未变化的层。把变化频率低的依赖清单(如 package.json)放在前面复制,源码放在后面,这样依赖未变时可直接命中缓存,大幅加快构建:

# 先复制依赖清单并安装依赖(依赖变化频率低,利于缓存)
COPY package*.json ./
RUN npm install

# 最后再复制源码(源码变化频率高,不影响前面的缓存)
COPY . .
4. 使用非 root 用户运行

默认情况下容器以 root 运行,一旦被攻破风险极大。应创建专用用户并以该用户运行应用:

FROM node:18-alpine

# 创建非 root 用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .

# 切换到非 root 用户
USER appuser

EXPOSE 3000
CMD ["node", "app.js"]
5. 多阶段构建减小镜像体积

多阶段构建可以在一个 Dockerfile 中完成「编译」和「运行」两个阶段,最终只保留运行所需的产物,镜像体积大幅减小:

# 第一阶段:构建(包含完整的编译工具链)
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

# 第二阶段:运行(只保留可执行文件)
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

小结:以上 5 条最佳实践相互配合——.dockerignore 控制构建上下文、合并 RUN 与利用缓存提升构建效率、非 root 用户增强安全性、多阶段构建压缩镜像体积。建议在编写 Dockerfile 时一并应用。

指令作用
FROM指定基础镜像,必须是第一条指令
WORKDIR设置工作目录
COPY复制文件到镜像中
ADD复制文件并支持自动解压和远程 URL
RUN在构建时执行命令
CMD容器启动时执行的命令(可被覆盖)
ENTRYPOINT容器启动时执行的命令(不可被覆盖)
EXPOSE声明容器运行时监听的端口
ENV设置环境变量
ARG构建时传入的参数
VOLUME声明挂载的匿名卷

6. 数据管理:卷与挂载

容器是临时的,当容器被删除时,容器内产生的数据也会随之消失。为了解决数据持久化问题,Docker 提供了三种数据管理方式:

6.1 卷(Volume)

卷是 Docker 推荐的持久化方式,由 Docker 管理:

# 创建卷
docker volume create my-data

# 使用卷运行容器
docker run -d -v my-data:/app/data --name my-app my-app:1.0

# 查看卷列表
docker volume ls

# 删除卷
docker volume rm my-data

6.2 绑定挂载(Bind Mount)

将宿主机的目录直接挂载到容器中,适合开发环境实时同步代码:

# 将当前目录挂载到容器的 /app 目录
docker run -d -v $(pwd):/app -p 3000:3000 my-node-app:1.0

6.3 tmpfs 挂载

数据只保存在内存中,容器停止后数据即消失,适合存放敏感信息:

docker run -d --tmpfs /tmp --name my-app my-app:1.0

7. 容器网络

Docker 提供了多种网络模式,用于控制容器之间的通信:

7.1 网络模式

网络模式说明
bridge默认模式,容器通过虚拟网桥通信
host容器直接使用宿主机网络
none无网络
overlay用于 Swarm 集群跨主机通信

7.2 自定义网络

# 创建自定义网络
docker network create my-network

# 在自定义网络中运行容器
docker run -d --network my-network --name app1 my-app:1.0
docker run -d --network my-network --name app2 my-app:1.0

# 容器间通过容器名互相访问
docker exec -it app1 ping app2

7.3 端口映射

# 将容器 80 端口映射到宿主机 8080
docker run -d -p 8080:80 nginx

# 随机映射端口
docker run -d -P nginx

# 指定 IP 和端口映射
docker run -d -p 192.168.1.100:8080:80 nginx

8. Docker Compose 多容器编排

当应用包含多个服务(如前端、后端、数据库)时,使用 Docker Compose 可以一键启动所有服务。

8.1 docker-compose.yml 示例

下面是一个 Web 应用 + Redis 的示例:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - REDIS_HOST=redis
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

8.2 Compose 常用命令

# 强制重建容器(忽略缓存,重新创建容器实例)
docker compose up -d --force-recreate

# 重启所有服务(或指定服务)
docker compose restart

# 进入指定服务的容器内部(交互式终端)
docker compose exec web sh

# 查看各服务容器内运行的进程
docker compose top

# 查看 Compose 使用的镜像列表
docker compose images

各命令的适用场景如下:

  • docker compose up -d --force-recreate:当修改了 docker-compose.yml 中的配置(如环境变量、端口映射、卷挂载)或镜像构建参数,但容器未自动重建时,使用该命令强制重新创建容器,确保新配置生效。常用于配置变更后需要彻底重建的场景。
  • docker compose restart:仅重启容器进程,不重新创建容器,也不会重新读取 docker-compose.yml 中的配置变更。适用于应用运行异常、需要快速恢复服务,或修改了容器内文件(如挂载卷中的代码)后希望重启进程加载新内容的场景。
  • docker compose exec web sh:进入 web 服务的容器内部,获得一个交互式 Shell,便于排查问题、查看日志文件或执行调试命令。与 docker exec 类似,但无需手动指定容器 ID,Compose 会自动定位到对应服务的容器。
  • docker compose top:列出 Compose 项目中所有服务容器内正在运行的进程及其 PID、用户等信息。适用于排查容器内进程是否异常、确认某个服务是否真的在运行,或定位资源占用较高的进程。
  • docker compose images:列出 Compose 项目当前使用的所有镜像及其标签、大小、容器 ID 等信息。适用于确认各服务实际使用的镜像版本,排查镜像是否过期或意外被替换。

8.3 服务弹性伸缩实战

当应用流量突增时,可以通过 docker compose up --scale 快速扩容服务实例,实现简单的水平伸缩。

使用 --scale 扩容

以 8.1 节的 Web 应用为例,将 web 服务扩容到 3 个实例:

# 将 web 服务扩容到 3 个实例
docker compose up -d --scale web=3

# 查看服务状态,可以看到 3 个 web 容器
docker compose ps

执行后,Compose 会创建 3 个 web 容器副本,它们共享同一个网络,并通过服务名 web 进行负载均衡。

负载均衡配置说明

Compose 内置的 DNS 负载均衡会自动将请求分发到同一服务的多个容器副本。当客户端通过服务名 web 访问时,Docker 内置 DNS 会随机返回其中一个容器的 IP,实现简单的轮询负载均衡。

version: "3.8"

services:
  web:
    build: .
    # 注意:使用 --scale 时不能固定映射宿主端口,否则会端口冲突
    # 只暴露容器内部端口,由 Compose 网络进行负载均衡
    expose:
      - "3000"
    environment:
      - REDIS_HOST=redis
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

注意:使用 --scale 扩容时,ports 中不能使用固定的宿主机端口映射(如 "3000:3000"),否则多个容器会因端口冲突而启动失败。应改用 expose 仅暴露容器内部端口,或使用 ports 的范围映射(如 "3000-3005:3000")。

验证步骤
  1. 确认副本数量
# 查看 web 服务的容器实例数
docker compose ps web

# 输出中应包含 3 个 web 容器,名称形如 <项目名>-web-1、<项目名>-web-2、<项目名>-web-3
  1. 验证负载均衡
# 进入任意一个容器,多次访问 web 服务名
docker exec -it <项目名>-web-1 sh

# 在容器内多次请求,观察返回的容器 ID 是否轮换
for i in 1 2 3 4 5 6; do
  curl -s http://web:3000 && echo
done
  1. 缩容
# 将 web 服务缩容到 1 个实例
docker compose up -d --scale web=1

# 确认只剩 1 个 web 容器
docker compose ps

通过 --scale 可以快速应对流量波动,但这种方式仅适用于无状态服务。对于有状态服务(如数据库),应使用卷持久化并结合集群方案(如 Swarm、Kubernetes)进行更完善的编排。

# 启动所有服务(后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f

# 停止并删除所有服务
docker compose down

# 重新构建并启动
docker compose up -d --build

# 查看配置
docker compose config

9. 实战:部署一个完整的 Web 应用

下面通过一个完整的实战案例,将前面学到的知识串联起来。

9.1 项目结构

my-project/
├── backend/
│   ├── Dockerfile
│   └── app.py
├── frontend/
│   ├── Dockerfile
│   └── index.html
├── nginx/
│   └── nginx.conf
└── docker-compose.yml

9.2 后端服务(Python Flask)

backend/Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

backend/app.py

from flask import Flask, jsonify
import redis

app = Flask(__name__)
cache = redis.Redis(host="redis", port=6379)

@app.route("/")
def index():
    return jsonify({"message": "Hello from Docker!"})

@app.route("/count")
def count():
    count = cache.incr("visits")
    return jsonify({"visits": count})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

9.3 前端服务(Nginx 静态页面)

frontend/Dockerfile

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

9.4 编排所有服务

docker-compose.yml

version: "3.8"

services:
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - redis

  frontend:
    build: ./frontend
    ports:
      - "8080:80"
    depends_on:
      - backend

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

9.5 启动项目

10. 使用 Docker 搭建 Web 安全靶场

对于安全学习者来说,搭建一个可复现、易清理的 Web 漏洞靶场至关重要。Docker 可以让我们在几分钟内拉起 DVWA、Pikachu、SQLi-Labs 等经典靶场,且互不干扰、用完即删。下面逐一演示。

10.1 DVWA(Damn Vulnerable Web Application)

DVWA 是最经典的 PHP + MySQL 漏洞靶场,内置 SQL 注入、XSS、文件上传、命令注入等常见漏洞。

# 拉取镜像并启动(默认账号 admin / password)
docker run -d --name dvwa -p 8081:80 vulnerables/web-dvwa

# 查看容器状态
docker ps

# 访问靶场
# 浏览器打开 http://localhost:8081

说明:首次访问 DVWA 时,页面会提示数据库未初始化。点击页面底部的 Create / Reset Database 按钮完成初始化,然后使用默认账号 admin / password 登录,即可进入漏洞练习页面。

10.2 Pikachu 靶场

Pikachu 是一个基于 PHP 的中文漏洞靶场,覆盖暴力破解、XSS、CSRF、SQL 注入、RCE、文件包含、越权等 20 余类漏洞,界面友好,非常适合初学者。

# 拉取镜像并启动(默认端口 8082)
docker run -d --name pikachu -p 8082:80 area39/pikachu

# 访问靶场
# 浏览器打开 http://localhost:8082

说明:Pikachu 镜像内置了 MySQL 数据库,启动后即可直接使用,无需额外初始化。页面左侧为漏洞分类导航,点击即可进入对应练习。

10.3 SQLi-Labs 靶场

SQLi-Labs 是专注于 SQL 注入的靶场,包含 65 个由浅入深的注入关卡,覆盖报错注入、布尔盲注、时间盲注、堆叠注入、宽字节注入等各类场景。

# 拉取镜像并启动(默认端口 8083)
docker run -d --name sqli-labs -p 8083:80 acgpiano/sqli-labs

# 访问靶场
# 浏览器打开 http://localhost:8083

说明:SQLi-Labs 首页会列出全部关卡,点击任意关卡即可开始练习。部分关卡需要结合 Burp Suite 等工具进行抓包分析。

10.4 使用 Docker Compose 一键搭建靶场环境

如果希望同时启动多个靶场,可以编写一个 docker-compose.yml 统一管理:

version: "3.8"

services:
  dvwa:
    image: vulnerables/web-dvwa
    container_name: dvwa
    ports:
      - "8081:80"

  pikachu:
    image: area39/pikachu
    container_name: pikachu
    ports:
      - "8082:80"

  sqli-labs:
    image: acgpiano/sqli-labs
    container_name: sqli-labs
    ports:
      - "8083:80"

启动与清理:

# 一键启动所有靶场
docker compose up -d

# 查看运行状态
docker compose ps

# 停止并删除所有靶场容器
docker compose down

10.5 靶场使用注意事项

  • 仅限本地或隔离环境使用:靶场包含大量高危漏洞,切勿暴露到公网,否则极易被入侵利用。
  • 端口冲突处理:若宿主机端口被占用,可修改 docker-compose.yml 中的映射端口(如 8084:80)。
  • 数据持久化:靶场容器删除后,练习数据会丢失。如需保留,可为数据库目录挂载卷。
  • 资源占用:同时运行多个靶场会占用较多内存,建议按需启动,练习完及时 docker compose down 清理。
# 一键启动所有服务
docker compose up -d

# 访问前端页面
curl http://localhost:8080

# 访问后端 API
curl http://localhost:5000/count

10. 镜像优化与最佳实践

10.1 使用多阶段构建

多阶段构建可以显著减小镜像体积:

# 第一阶段:构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

# 第二阶段:运行
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

10.2 镜像优化技巧

  • 使用精简基础镜像:优先选择 alpineslim 等精简版本。
  • 合并 RUN 指令:减少镜像层数。
  • 利用构建缓存:将变化频率低的文件(如依赖清单)放在前面复制。
  • 使用 .dockerignore:排除不需要的文件。

.dockerignore 示例:

node_modules
.git
*.md
Dockerfile
.dockerignore

10.3 安全最佳实践

  • 不要以 root 用户运行容器,创建专用用户。
  • 使用官方镜像并定期更新。
  • 最小化安装依赖,减少攻击面。
  • 敏感信息通过环境变量或密钥管理工具注入,不要写死在镜像中。

11. 常见问题与排查

11.1 容器启动后立即退出

# 查看容器日志
docker logs <container-id>

# 以交互模式运行,便于调试
docker run -it <image> /bin/bash

11.2 端口被占用

# 查看端口占用
docker ps | grep <port>

# 换一个端口映射
docker run -d -p 8081:80 nginx

11.3 镜像拉取慢

配置国内镜像加速器:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

11.4 容器内无法访问外网

# 检查 DNS 配置
docker run --dns 8.8.8.8 --dns 114.114.114.114 <image>

# 检查网络模式
docker network inspect bridge

12. 总结

通过本教程,你已经掌握了 Docker 的核心知识:

  • 核心概念:镜像、容器、仓库、Dockerfile。
  • 常用命令:镜像管理、容器生命周期管理、日志查看。
  • 数据管理:卷、绑定挂载、tmpfs。
  • 网络配置:网络模式、自定义网络、端口映射。
  • 多容器编排:Docker Compose。
  • 实战部署:完整 Web 应用的一键部署。
  • 优化实践:多阶段构建、镜像瘦身、安全加固。

Docker 是现代 DevOps 和云原生技术栈的基石。掌握 Docker 后,你可以进一步学习 Kubernetes、CI/CD 流水线、微服务架构等进阶内容。建议在实际项目中多加练习,将理论知识转化为实战能力。

更多推荐