简介
本全面的 Docker 教程为开发者和 IT 专业人员深入介绍了容器化技术。通过探索 Docker 的核心概念、架构和实际实施策略,学习者将获得在不同计算环境中打包、部署和管理应用程序的实用技能。
Docker 基础
什么是 Docker?
Docker 是一个强大的容器化平台,它彻底改变了应用程序的部署和开发方式。作为一项开源技术,Docker 使开发者能够在不同的计算环境中一致地打包、分发和运行应用程序。
Docker 的核心概念
容器与虚拟机
graph TD
A[物理硬件] --> B[Docker 容器]
A --> C[虚拟机]
B --> D[轻量级]
B --> E[共享操作系统内核]
C --> F[重量级]
C --> G[完整操作系统开销]
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 资源使用 | 轻量级 | 资源密集型 |
| 启动时间 | 秒级 | 分钟级 |
| 隔离级别 | 进程级 | 整个系统 |
Docker 架构
Docker 使用客户端 - 服务器架构,包含以下关键组件:
- Docker 守护进程
- Docker 客户端
- Docker 镜像仓库
- Docker 镜像
- Docker 容器
基本的 Docker 命令
在 Ubuntu 22.04 上安装 Docker:
## 更新系统软件包
sudo apt update
## 安装 Docker 依赖项
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## 添加 Docker 的官方 GPG 密钥
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## 设置 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## 安装 Docker 引擎
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## 验证 Docker 安装
sudo docker --version
运行你的第一个容器
## 拉取 Ubuntu 镜像
sudo docker pull ubuntu:latest
## 运行一个交互式容器
sudo docker run -it ubuntu:latest /bin/bash
## 列出正在运行的容器
sudo docker ps
## 列出所有容器
sudo docker ps -a
镜像管理
## 搜索镜像
sudo docker search nginx
## 下载一个镜像
sudo docker pull nginx
## 列出本地镜像
sudo docker images
容器网络
Docker 网络类型
graph TD
A[Docker 网络类型] --> B[桥接网络]
A --> C[主机网络]
A --> D[无网络]
A --> E[覆盖网络]
| 网络类型 | 描述 | 使用场景 |
|---|---|---|
| 桥接 | 默认网络 | 隔离容器通信 |
| 主机 | 直接使用主机网络 | 对性能要求极高的应用程序 |
| 无网络 | 无网络访问权限 | 完全隔离的容器 |
| 覆盖 | 多主机网络 | 分布式容器系统 |
端口映射技术
基本端口映射
## 将容器端口 80 映射到主机端口 8080
sudo docker run -p 8080:80 nginx
## 映射多个端口
sudo docker run -p 8080:80 -p 3306:3306 myapp
网络管理命令
## 列出 Docker 网络
sudo docker network ls
## 创建自定义网络
sudo docker network create mynetwork
## 将容器连接到网络
sudo docker network connect mynetwork mycontainer
## 检查网络详细信息
sudo docker network inspect bridge
高级网络场景
## 创建自定义桥接网络
sudo docker network create --driver bridge isolated_network
## 在自定义网络中运行容器
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
网络隔离策略
## 禁用外部网络访问
sudo docker run --network none mycontainer
## 直接使用主机网络
sudo docker run --network host mycontainer
容器 DNS 解析
## 启用容器之间的自动 DNS
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
高级 Docker 技术
容器资源管理
graph TD
A[资源管理] --> B[CPU 限制]
A --> C[内存约束]
A --> D[存储配额]
资源分配示例
## 将容器限制为 1 个 CPU 核心和 512MB 内存
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## 设置内存和交换空间限制
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
使用 Docker Compose 进行多容器部署
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
安全最佳实践
| 安全技术 | 实施方法 |
|---|---|
| 非 root 容器 | 在 Dockerfile 中使用 USER 指令 |
| 只读文件系统 | 在卷挂载中添加 :ro 标志 |
| 限制容器能力 | 使用 --cap-drop 和 --cap-add |
使用 Docker Swarm 进行容器编排
## 初始化 Swarm 集群
sudo docker swarm init
## 创建带有副本的服务
sudo docker service create --replicas 3 --name web nginx
## 动态扩展服务
sudo docker service scale web=5
高级网络配置
## 使用子网创建自定义网络
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
容器监控与日志记录
## 实时查看容器日志
sudo docker logs -f container_name
## 检查容器指标
sudo docker stats container_name
## 限制日志文件大小
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Dockerfile 优化技术
## 多阶段构建
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
总结
Docker 代表了一种变革性的软件部署方法,提供轻量级、可移植且高效的容器化解决方案。通过掌握 Docker 的基本概念、架构和命令行技术,开发者可以简化应用程序开发、提高系统一致性,并增强整体基础设施的可扩展性和性能。



