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
Compose docker compose up 启动所有服务 docker compose up -d
Compose docker compose ps 查看服务状态 docker compose ps
Compose docker 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 流水线、微服务架构等进阶内容。建议在实际项目中多加练习,将理论知识转化为实战能力。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐