Docker 入门到实战教程
1. 什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口。
简单来说,Docker 解决了「在我机器上能跑,在你机器上跑不了」的经典问题。通过将应用、配置、依赖和环境一起打包,Docker 让软件的交付和部署变得前所未有的简单。
为了更直观地理解 Docker 的优势,下面将 Docker 容器与传统虚拟机(VM)进行对比:
| 对比维度 | Docker 容器 | 传统虚拟机 |
|---|---|---|
| 启动速度 | 秒级(毫秒~秒) | 分钟级(需启动完整操作系统) |
| 资源占用 | 轻量,共享宿主机内核,占用小 | 重量级,每个 VM 独占完整操作系统,占用大 |
| 隔离级别 | 进程级隔离(共享内核) | 硬件级虚拟化,隔离更彻底 |
| 性能 | 接近原生,开销极小 | 有一定性能损耗(虚拟化层开销) |
| 镜像体积 | 小(通常几十 MB 到几百 MB) | 大(通常几个 GB) |
下面这张架构图直观地展示了 Docker 容器与传统虚拟机在架构上的本质区别:
核心差异:Docker 容器直接共享宿主机内核,仅对进程进行隔离,因此资源占用极小、启动只需秒级;而传统虚拟机通过 Hypervisor 虚拟化硬件,每个 VM 都需运行完整的 Guest OS,隔离更彻底但资源开销大、启动慢。这也是 Docker 在资源利用率和部署速度上远胜传统虚拟机的原因。
总结:Docker 容器凭借秒级启动、低资源占用和接近原生的性能,在开发、测试和微服务场景中极具优势;而传统虚拟机由于提供更彻底的硬件级隔离,更适合需要强隔离、多租户安全边界或运行异构操作系统的场景。两者并非互斥,实际生产中常结合使用。
2. Docker 核心概念
在开始使用 Docker 之前,需要先理解几个核心概念:
- 镜像(Image):镜像是一个只读的模板,用于创建容器。它包含了运行某个应用所需的全部内容——代码、运行时、系统工具、系统库和设置。可以把镜像理解为一个「类」。
- 容器(Container):容器是镜像的运行实例。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器理解为一个「对象」。
- 仓库(Repository):仓库是集中存放镜像文件的地方,类似于代码仓库。最常用的公共仓库是 Docker Hub。
- Dockerfile:一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。
下面这张架构图展示了 Docker 的核心组件及其协作关系:
图中各组件的作用如下:
- 客户端(Docker CLI):用户通过命令行工具向 Docker 守护进程发送指令,例如
docker build、docker 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:
- 前往 Docker 官网 下载对应系统的安装包。
- 双击安装包,按提示完成安装。
- 启动 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 --help或docker <子命令> --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 指令减少层数
每一条 RUN、COPY、ADD 都会生成一个镜像层。将相关的命令用 && 合并到同一条 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")。
验证步骤
- 确认副本数量:
# 查看 web 服务的容器实例数
docker compose ps web
# 输出中应包含 3 个 web 容器,名称形如 <项目名>-web-1、<项目名>-web-2、<项目名>-web-3
- 验证负载均衡:
# 进入任意一个容器,多次访问 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
- 缩容:
# 将 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 镜像优化技巧
- 使用精简基础镜像:优先选择
alpine、slim等精简版本。 - 合并 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 流水线、微服务架构等进阶内容。建议在实际项目中多加练习,将理论知识转化为实战能力。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)