Fix guide issues

This commit is contained in:
yeasy
2026-03-28 18:24:46 -07:00
parent 5a6a50ba97
commit 85f76aa6d9
28 changed files with 123 additions and 885 deletions

3
.gitignore vendored
View File

@@ -20,6 +20,9 @@ docker-compose.override.yml
.agent/
__pycache__/
.mdpress/
Docker -- *.html
Docker -- *_site/
# Check scripts
check*.py

View File

@@ -166,7 +166,3 @@ For more examples and ideas, visit:
### 3.1.7 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](3.9_mirror.md)
### 3.1.8 参考文档
* [Docker 官方 Ubuntu 安装文档](https://docs.docker.com/engine/install/ubuntu/)

View File

@@ -157,7 +157,3 @@ For more examples and ideas, visit:
### 3.2.7 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](3.9_mirror.md)
### 3.2.8 参考文档
* [Docker 官方 Debian 安装文档](https://docs.docker.com/engine/install/debian/)

View File

@@ -168,7 +168,3 @@ For more examples and ideas, visit:
### 3.3.7 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](3.9_mirror.md)
### 3.3.8 参考文档
* [Docker 官方 Fedora 安装文档](https://docs.docker.com/engine/install/fedora/)。

View File

@@ -197,9 +197,3 @@ EOF
```bash
$ sudo sysctl -p
```
### 3.4.10 参考文档
* [Docker 官方 CentOS 安装文档](https://docs.docker.com/engine/install/centos/)。
* https://firewalld.org/2018/07/nftables-backend
* https://github.com/moby/libnetwork/issues/2496

View File

@@ -2,7 +2,7 @@
### 3.7.1 系统要求
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Sonoma 14.0 或更高版本,建议升级到最新版本的 macOS
[Docker Desktop for Mac](https://docs.docker.com/desktop/setup/install/mac-install/) 支持当前版本及前两个主要版本的 macOS并且至少需要 4 GB 内存。对于 Apple Silicon 机型,若需要兼容部分 Intel 命令行工具,官方建议安装 Rosetta 2
### 3.7.2 安装
@@ -23,7 +23,7 @@ $ brew install --cask docker
如果需要手动下载请点击以下[链接](https://desktop.docker.com/mac/main/amd64/Docker.dmg)下载 Docker Desktop for Mac。
> 如果你的电脑搭载的是 Apple Silicon 芯片 (`arm64` 架构)请点击以下[链接](https://desktop.docker.com/mac/main/arm64/Docker.dmg)下载 Docker Desktop for Mac。你可以在[官方文档](https://docs.docker.com/docker-for-mac/apple-silicon/)查阅已知的问题。
> 如果你的电脑搭载的是 Apple Silicon 芯片 (`arm64` 架构)请点击以下[链接](https://desktop.docker.com/mac/main/arm64/Docker.dmg)下载 Docker Desktop for Mac。
如同 macOS 其它软件一样安装也非常简单双击下载的 `.dmg` 文件然后将那只叫 [Moby](https://www.docker.com/blog/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可 (其间需要输入用户密码)。
@@ -46,10 +46,10 @@ $ brew install --cask docker
之后你可以在终端通过命令检查安装后的 Docker 版本
```bash
$ docker --version
Docker version 27.0.3, build 7d4bcd8
$ docker version
$ docker info
```
如果 `docker version``docker info` 都正常的话可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/)
如果 `docker version` `docker info` 正常返回信息可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/)
```bash
$ docker run -d -p 80:80 --name webserver nginx
@@ -68,7 +68,3 @@ $ docker rm webserver
### 3.7.4 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](3.9_mirror.md)
### 3.7.5 参考链接
* [官方文档](https://docs.docker.com/desktop/setup/install/mac-install/)

View File

@@ -4,7 +4,7 @@
### 3.8.1 系统要求
[Docker Desktop for Windows](https://docs.docker.com/desktop/setup/install/windows-install/) 支持 64 位版本的 Windows 11 或 Windows 10 (需开启 Hyper-V),推荐使用 Windows 11
[Docker Desktop for Windows](https://docs.docker.com/desktop/setup/install/windows-install/) 支持 Docker 官方文档列出的受支持 Windows 10/11 64 位版本。若使用 WSL 2 后端,需要启用 WSL 2并满足官方要求的 `WSL 2.1.5` 或更高版本;若使用 Hyper-V 后端,则需要启用 Hyper-V 和 Containers 功能。Windows 10 64 位支持 Enterprise、Pro 和 Education 22H2 (build 19045)Windows 11 64 位支持 Enterprise、Pro 和 Education 23H2 (build 22631) 或更高版本
### 3.8.2 安装
@@ -17,7 +17,7 @@
下载好之后双击 `Docker Desktop Installer.exe` 开始安装
**使用**[**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/)**安装**
**使用**[**winget**](https://learn.microsoft.com/windows/package-manager/winget/)**安装**
```powershell
$ winget install Docker.DockerDesktop
@@ -25,7 +25,7 @@ $ winget install Docker.DockerDesktop
### 3.8.3 WSL2 运行 Docker
若你的 Windows 版本为 Windows 10 专业版或家庭版 v1903 及以上版本可以使用 WSL2 运行 Docker具体请查看 [Docker Desktop WSL 2 backend](https://docs.docker.com/docker-for-windows/wsl/)
若你的环境使用 WSL 2 后端请先确认 `wsl --version` 满足 Docker 官方的版本要求并按 Docker Desktop WSL 说明启用对应功能
### 3.8.4 运行
@@ -39,13 +39,8 @@ Docker 启动之后会在 Windows 任务栏出现鲸鱼图标。
等待片刻当鲸鱼图标静止时说明 Docker 启动成功之后你可以打开 PowerShell 使用 Docker
> 推荐使用 [Windows Terminal](https://docs.microsoft.com/zh-cn/windows/terminal/get-started) 在终端使用 Docker。
> 推荐使用 Windows Terminal 在终端使用 Docker
### 3.8.5 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](3.9_mirror.md)
### 3.8.6 参考链接
* [官方文档](https://docs.docker.com/desktop/setup/install/windows-install/)
* [WSL 2 Support is coming to Windows 10 Versions 1903 and 1909](https://devblogs.microsoft.com/commandline/wsl-2-support-is-coming-to-windows-10-versions-1903-and-1909/)

View File

@@ -2,7 +2,7 @@
### 8.2.1 什么是绑定挂载
Bind Mount (绑定挂载) **宿主机的目录或文件** 直接挂载到容器中容器可以读写宿主机的文件系统
Bind Mount (绑定挂载) **Docker daemon 所在主机** 上的目录或文件直接挂载到容器中容器可以读写这台主机的文件系统
```mermaid
flowchart LR
@@ -51,7 +51,7 @@ flowchart LR
### 8.2.3 基本语法
#### 使用 --mount推荐
#### 使用 `--mount`推荐
```bash
$ docker run -d \
@@ -59,7 +59,7 @@ $ docker run -d \
nginx
```
#### 使用 -v简写
#### 使用 `-v`简写
```bash
$ docker run -d \
@@ -75,7 +75,7 @@ $ docker run -d \
| 路径不存在时 | 直接报错 (Fail Fast) | 静默自动创建 **目录** |
| 推荐程度 | 推荐 | 常用 |
> ** 陷阱**如果不小心挂载了一个不存在的宿主机路径使用 `-v` 会在宿主机上静默创建一个 **空目录**即使你本来想挂载的是一个文件这常常会导致权限错误或应用无法正常读取这也正是为什么 Docker 官方更推荐使用 `--mount` 的原因它会遵循Fail Fast原则直接报错避免弄巧成拙
> ** 陷阱**如果不小心挂载了一个不存在的主机路径使用 `-v` 会在 **daemon 主机** 上静默创建一个空目录对于本地 Docker Desktop 用户这个主机通常就是本机对于远程 daemon这个主机就是远程机器这也 Docker 官方更推荐使用 `--mount` 的原因它会直接报错避免因路径拼写错误而挂错位置
---
@@ -213,7 +213,7 @@ $ docker run --mount type=bind,source=/not/exist,target=/app nginx
docker: Error response from daemon: invalid mount config for type "bind":
bind source path does not exist: /not/exist
```
**解决**确保源路径存在改用 `-v` (会自动创建)
**解决**确保源路径存在若你确实需要自动创建目录改用 `-v`但要先确认创建位置就是你想要的主机路径
#### Q权限问题
@@ -235,7 +235,7 @@ $ docker run -u $(id -u):$(id -g) ...
#### QmacOS/Windows 性能问题
Docker Desktop Bind Mount 性能较差 (需要跨文件系统同步)
Docker Desktop Bind Mount 性能通常不如 Volume因为数据需要在宿主机文件系统和 Linux VM 之间同步
```bash
## 使用 :cached 或 :delegated 提高性能macOS

View File

@@ -1,6 +1,6 @@
## 8.3 tmpfs 挂载
`tmpfs` 挂载会把数据放在宿主机内存中而不是写入容器可写层或数据卷
`tmpfs` 挂载会把数据放在内存中而不是写入容器可写层或数据卷它只适用于 Linux 语义的容器环境适合需要快速读写但不要求持久化的数据
### 8.3.1 适用场景
@@ -20,13 +20,15 @@ $ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864,tmpfs-mode=
```bash
$ docker run --tmpfs /run:size=64m nginx
```
> **注意**`--tmpfs` 支持的选项有限主要为 `size` `mode`如果需要更精细的控制 `noexec``nosuid`推荐使用 `--mount` 语法并通过 `tmpfs-mode` 参数设置权限
> **注意**`--tmpfs` 更适合简单场景如果你希望显式描述挂载点大小和权限`--mount type=tmpfs,...` 的可读性更好也更便于后续维护
### 8.3.3 注意事项
- 容器停止后`tmpfs` 数据会丢失
- `tmpfs` 占用宿主机内存建议显式限制大小
- 不适合需要持久化的数据
- `tmpfs` 不适合多个容器共享同一份数据也不适合当作跨重启的缓存层
- 在内存压力较高时部分数据可能受系统交换机制影响因此不要把 `tmpfs` 当作绝对不会落盘的安全边界
### 8.3.4 Volume / Bind Mount 对比

View File

@@ -46,7 +46,7 @@ $ docker run -d -p 8080:80 nginx
#### 2. 随机映射
如果不关心宿主机使用哪个端口可以使用随机映射使用 `-P` (大写) 参数Docker 随机映射 Dockerfile `EXPOSE` 指令暴露的所有端口到宿主机的高端口 (49000-49900)
如果不关心宿主机使用哪个端口可以使用随机映射使用 `-P` (大写) 参数Docker Dockerfile `EXPOSE` 指令暴露的所有端口发布到宿主机的随机高位端口具体落在哪个端口取决于宿主机当前可用的临时端口范围
```bash
$ docker run -d -P nginx
@@ -58,7 +58,7 @@ $ docker ps
CONTAINER ID PORTS
abc123456 0.0.0.0:49153->80/tcp
```
此时 Nginx 被映射到了宿主机的 49153 端口
此时 Nginx 被映射到了宿主机的一个随机高位端口例如 `49153`
---

View File

@@ -1,10 +1,10 @@
## 9.7 容器网络高级特性
深入探讨容器网络的核心机制Overlay 网络CNI 插件生态容器 DNS 解析网络策略等高级特性为生产级别的网络架构打下坚实基础
本节聚焦 Docker 自身可见的高级网络能力Overlay 网络服务发现和 DNS 解析更偏 Kubernetes 编排网络的概念 CNI NetworkPolicy不在本章展开
### 9.7.1 Overlay 网络原理与配置
Overlay 网络在现有网络基础上建立虚拟网络允许容器跨宿主机通信它是 Kubernetes Swarm 模式的基础
Overlay 网络在现有网络基础上建立虚拟网络允许容器跨宿主机通信它是 Swarm 场景下的核心网络驱动之一
#### Overlay 网络工作原理
@@ -32,14 +32,15 @@ veth 对
#### 创建和使用 Overlay 网络
**Docker Swarm 模式下的 Overlay 网络**
Overlay 网络依赖 Swarm若要让独立容器加入 overlay 网络需要把网络创建为 `attachable`
```bash
# 初始化 Swarm(创建集群)
# 初始化 Swarm
docker swarm init
# 创建 overlay 网络
# 创建 attachable overlay 网络
docker network create --driver overlay \
--attachable \
--subnet 192.168.0.0/24 \
--opt com.docker.network.driver.mtu=1450 \
my-overlay-net
@@ -54,191 +55,33 @@ docker service create --name web \
--replicas 3 \
nginx:latest
# 验证服务跨节点通信
docker service ps web
```
**单机 Overlay 网络模拟Linux 容器**
```bash
# 创建自定义 overlay 网络
docker network create --driver overlay custom-overlay
# 创建两个容器
docker run -d --name container1 --network custom-overlay nginx:latest
docker run -d --name container2 --network custom-overlay nginx:latest
# 单机环境下也可以让普通容器加入 attachable overlay 网络
docker run -d --name container1 --network my-overlay-net busybox sleep 1d
docker run -d --name container2 --network my-overlay-net busybox sleep 1d
# 测试跨容器通信
docker exec container1 ping container2
docker exec container1 curl http://container2
# 检查网络配置
docker network inspect custom-overlay
docker exec container1 ping -c 1 container2
```
#### Overlay 网络性能优化
```bash
# 调整 MTUMaximum Transmission Unit避免分片
# VXLAN 开销 50 字节,物理 MTU 1500建议设置为 1450
# VXLAN 开销 50 字节,物理 MTU 1500建议设置为 1450
docker network create --driver overlay \
--attachable \
--opt com.docker.network.driver.mtu=1450 \
optimized-overlay
# 启用 IP 地址管理IPAM自定义
docker network create --driver overlay \
--attachable \
--subnet 10.0.9.0/24 \
--aux-address "my-router=10.0.9.2" \
my-custom-overlay
# 在 Compose 中使用 overlay 网络
services:
web:
image: nginx
networks:
- backend
db:
image: postgres
networks:
- backend
networks:
backend:
driver: overlay
driver_opts:
com.docker.network.driver.mtu: 1450
```
### 9.7.2 CNI 插件生态概览
容器网络接口CNI是容器编排平台尤其是 Kubernetes的标准化网络接口不同的 CNI 插件提供不同的网络能力
#### 主流 CNI 插件对比
**Calico - 基于 BGP 的网络**
Calico 使用 BGP 协议进行路由支持网络策略和 eBPF 加速
```yaml
# Kubernetes 中安装 Calico
apiVersion: v1
kind: ConfigMap
metadata:
name: calico-config
namespace: kube-system
data:
cni_network_config: |
{
"name": "k8s-pod-network",
"cniVersion": "0.4.0",
"plugins": [
{
"type": "calico",
"datastore_type": "kubernetes",
"mtu": 1450,
"ipam": {
"type": "calico-ipam"
}
},
{
"type": "portmap",
"snat": true,
"capabilities": {"portMappings": true}
}
]
}
```
**Flannel - 简单可靠的 Overlay**
Flannel 提供简单的 overlay 网络实现适合小到中等规模的集群
```bash
# 安装 Flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 配置 Flannel 后端VXLAN、UDP、AWS VPC 等)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-flannel-cfg
namespace: kube-flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
EOF
```
**Cilium - eBPF 驱动的先进网络**
Cilium 使用 eBPF 在内核级别实现网络策略和可观测性性能优异
```bash
# 安装 Cilium
helm repo add cilium https://helm.cilium.io
helm install cilium cilium/cilium \
--namespace kube-system \
--set image.tag=v1.14.0 \
--set operator.replicas=1
# 启用 Hubble可观测性
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set hubble.enabled=true \
--set hubble.ui.enabled=true
```
**Weave - 跨主机网络通信**
Weave 提供简单的跨主机通信支持加密和多播
```bash
# Docker 中使用 Weave 网络
docker run -d --name weave \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_PTRACE \
ghcr.io/weaveworks/weave:latest
# 连接到 Weave 网络
docker run -d --network weave --name web nginx:latest
```
**CNI 插件对比表**
| 特性 | Calico | Flannel | Cilium | Weave |
|------|--------|---------|--------|-------|
| 路由方式 | BGP | VXLAN/UDP | eBPF | VxLAN |
| 网络策略 | | | (L3-L7) | |
| 性能 | | | | |
| 可观测性 | | | | |
| 学习曲线 | | | | |
| 生产就绪 | | | | |
### 9.7.3 容器 DNS 解析机制
### 9.7.2 容器 DNS 解析机制
Docker 内置 DNS 服务器 DNS 解析涉及多个层面的配置
@@ -280,6 +123,7 @@ docker run -d \
# 查看容器 DNS 配置
docker exec <container_id> cat /etc/resolv.conf
```
**Docker Compose DNS 配置**
```yaml
@@ -308,14 +152,13 @@ networks:
# nameserver 8.8.8.8
# nameserver 1.1.1.1
```
**Docker 守护进程级别配置**
```json
{
"dns": ["8.8.8.8", "1.1.1.1"],
"dns-search": ["example.com"],
"insecure-registries": [],
"registry-mirrors": ["https://mirror.example.com"]
"dns-search": ["example.com"]
}
```
@@ -337,6 +180,7 @@ docker run -it --network mynet busybox sh
# ping web # 自动解析到 web 容器 IP
# ping db # 自动解析到 db 容器 IP
```
**Compose 服务名自动发现**
```yaml
@@ -362,338 +206,6 @@ services:
# backend 容器可以直接访问 postgres://database:5432
```
#### DNS 性能优化
### 9.7.3 本章边界
```bash
# 检查 DNS 延迟
time docker exec <container> nslookup www.example.com
# 优化 DNS 解析
docker run -d \
--dns 127.0.0.1 \ # 使用本地缓存 DNS (Dnsmasq)
nginx:latest
# 在 Kubernetes 中优化
kubectl patch deployment -n kube-system coredns --patch '{
"spec": {
"template": {
"spec": {
"containers": [
{
"name": "coredns",
"resources": {
"limits": {
"memory": "512Mi",
"cpu": "500m"
}
}
}
]
}
}
}
}'
```
### 9.7.4 网络策略实践
网络策略定义了容器间的流量控制规则是微服务架构中的安全基础
#### 基本网络策略
**默认拒绝所有入站流量的策略**
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
# 不指定 ingress 规则,表示拒绝所有入站流量
```
**允许特定来源的入站流量**
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-frontend
spec:
podSelector:
matchLabels:
tier: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
tier: frontend
ports:
- protocol: TCP
port: 8080
```
**允许出站流量到数据库**
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-db
spec:
podSelector:
matchLabels:
tier: backend
policyTypes:
- Egress
egress:
# 允许到数据库的流量
- to:
- podSelector:
matchLabels:
tier: database
ports:
- protocol: TCP
port: 5432
# 允许 DNS 查询
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
# 允许到外部 API 的流量
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 169.254.169.254/32 # 阻止元数据服务
ports:
- protocol: TCP
port: 443
```
#### 微服务网络策略示例
```yaml
---
# 拒绝所有默认
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
# Frontend 容器策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
- Egress
ingress:
# 允许来自 Ingress Controller 的流量
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
- podSelector:
matchLabels:
app: ingress-controller
ports:
- protocol: TCP
port: 3000
egress:
# 允许到 API 的流量
- to:
- podSelector:
matchLabels:
app: api
ports:
- protocol: TCP
port: 8080
# 允许 DNS
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
---
# API 容器策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
# 允许到数据库的流量
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- protocol: TCP
port: 5432
# 允许 DNS
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
---
# 数据库容器策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-postgres
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
ports:
- protocol: TCP
port: 5432
```
#### 使用 Calico/Cilium 的高级网络策略
**L7 应用层策略 Cilium 支持**
```yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "api-gateway-policy"
spec:
description: "L7 policy for API gateway"
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
# 允许 GET /api/users
- method: "GET"
path: "/api/users/.*"
# 允许 POST /api/users 仅从管理员来源
- method: "POST"
path: "/api/users"
sourceIPs:
- "10.0.0.0/8"
```
### 9.7.5 跨主机容器通信方案对比
#### 方案对比表
| 方案 | 隔离性 | 性能 | 复杂度 | 适用场景 |
|------|--------|------|--------|---------|
| 主机网络 | | | | 高性能单主机 |
| Bridge + Host Port | | | | 小规模集群 |
| Overlay (VXLAN) | | | | 跨域通信 |
| BGP (Calico) | | | | 大规模集群 |
| eBPF (Cilium) | | | | 高性能大集群 |
#### 选择建议
```bash
# 1. 开发环境:使用 Bridge 网络
docker network create my-app
docker compose up # 默认使用 bridge
# 2. 小规模生产(< 50 节点):使用 Flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 3. 中等规模50-500 节点):使用 Calico
kubeadm init --pod-network-cidr=192.168.0.0/16
kubectl apply -f https://docs.projectcalico.org/v3.24/manifests/tigera-operator.yaml
# 4. 大规模(> 500 节点)或需要 L7 策略:使用 Cilium
helm install cilium cilium/cilium --namespace kube-system
# 5. 需要多云/跨域:使用 Weave
```
### 9.7.6 网络故障排查
**常见网络问题诊断**
```bash
# 1. 容器无法访问外部网络
docker exec <container> ping 8.8.8.8
docker exec <container> cat /etc/resolv.conf
docker logs <container> | grep -i network
# 2. 容器间无法通信
docker network inspect <network>
docker exec <container1> ping <container2>
# 3. 端口映射失效
docker port <container>
netstat -tlnp | grep <port>
# 4. DNS 解析失败
docker exec <container> nslookup example.com
docker exec <container> cat /etc/hosts
# 5. 网络延迟
docker run --rm --network host iperf3:latest -c <target>
docker exec <container> mtr -r example.com
# 使用 tcpdump 抓包分析
docker run --rm --cap-add NET_ADMIN --network host \
corfr/tcpdump -i eth0 -n "port 80"
```
Docker 的网络章节重点讨论 bridgehostnoneoverlay DNS 等能力CNINetworkPolicyCalicoCilium 这类概念属于 Kubernetes 编排网络的范畴后续在 Kubernetes 章节中再展开会更清晰

View File

@@ -1,6 +1,6 @@
## 11.1 简介
`Compose` 项目是 Docker 官方的开源项目负责实现对 Docker 容器集群的快速编排从功能上看 `OpenStack` 中的 `Heat` 十分类似
`Compose` 项目是 Docker 官方的开源项目负责实现对 Docker 容器的快速编排从功能上看 `OpenStack` 中的 `Heat` 十分类似
其代码目前在 [docker/compose 仓库](https://github.com/docker/compose) 上开源。
@@ -20,7 +20,7 @@ Docker Compose 让用户能够以声明式方式定义和管理多容器应用
Compose 模板文件采用 YAML 格式扩展名为 `.yml` `.yaml`
> **注意** Compose V2 `version` 字段已不再强制要求 Docker Compose v5 规范已完全不需要顶层 `version` 字段为了保持最佳兼容性建议不在新文件中使用该字段
> **注意**Compose Specification 的顶层 `version` 字段仅用于向后兼容当前已标记为 obsolete新文件建议直接省略该字段
Docker Compose 默认使用 `compose.yaml`也兼容 `compose.yml``docker-compose.yaml``docker-compose.yml` 等文件名
@@ -34,6 +34,6 @@ Docker Compose 默认使用 `compose.yaml`,也兼容 `compose.yml`、`docker-c
`Compose` 项目早期由 Python 编写称为 Docker Compose V1
现在的 Docker Compose V2 是一个 Go 语言编写的 Docker CLI 插件已经集成到 Docker Desktop Docker Engine 直接通过 `docker compose` 命令使用它提供了更快的性能和更好的集成体验
现在的 Docker Compose V2 是一个 Go 语言编写的 Docker CLI 插件Docker Desktop 默认包含它 Linux 也可以将它作为独立的 CLI 插件安装后直接通过 `docker compose` 命令使用它提供了更快的性能和更好的集成体验
只要所操作的平台支持 Docker API就可以在其上利用 `Compose` 来进行编排管理

View File

@@ -2,32 +2,16 @@
`Compose` Docker 官方的开源项目负责实现对 Docker 容器集群的快速编排
`v2` 版本开始`Compose` 作为 `docker` 的子命令存在例如 `docker compose up`
`Compose` 支持 LinuxmacOSWindows 10 三大平台
`Docker Desktop for Mac/Windows` 自带 `docker compose` 命令
Linux 系统请使用以下介绍的方法安装
当前的 Compose `docker compose` 子命令的形式提供Docker Desktop macOSWindows Linux 上默认包含它如果你已经在 Linux 上单独安装了 Docker Engine Docker CLI也可以再安装 Compose CLI 插件
### 11.2.1 Linux
Linux 你可以通过下载 Docker Compose CLI 插件 (二进制文件名为 `docker-compose`) 来安装
[官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
> **提示**版本更新较快请访问上述链接获取最新版本号替换下方命令中的版本号
例如 Linux 64 位系统上直接下载对应的二进制包 ( v5.1.0 为例)
Linux 你可以通过 Docker 官方发布页安装 Compose CLI 插件二进制文件保存到 `$DOCKER_CONFIG/cli-plugins/docker-compose`并赋予执行权限即可
```bash
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v5.1.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
```
之后执行
```bash
$ curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```
@@ -35,16 +19,10 @@ $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```bash
$ docker compose version
Docker Compose version v5.1.0
Docker Compose version vX.Y.Z
```
### 11.2.3 bash 补全命令
```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/v5.1.0/contrib/completion/bash/docker-compose | sudo tee /etc/bash_completion.d/docker-compose > /dev/null
```
### 11.2.4 卸载
### 11.2.3 卸载
如果是二进制包方式安装的删除二进制文件即可

View File

@@ -1,6 +1,6 @@
## 11.3 使用
本节将通过一个具体的 Web 应用案例介绍 Docker Compose 的基本概念和使用方法
本节将通过一个具体的 Web 应用案例介绍 Docker Compose 的基本概念和常用操作
### 11.3.1 术语
@@ -12,13 +12,11 @@
可见一个项目可以由多个服务 (容器) 关联而成`Compose` 面向项目进行管理
### 11.3.2 场景
### 11.3.2 准备示例
最常见的项目是 web 网站该项目应该包含 web 应用和缓存
下面创建一个由 `web` `redis` 组成的简单示例项目
下面我们用 `Python` 来建立一个能够记录页面访问次数的 web 网站
#### web 应用
#### 应用代码
新建文件夹在该目录中编写 `app.py` 文件
@@ -59,32 +57,34 @@ services:
web:
build: .
ports:
- "5000:5000"
- "5000:5000"
redis:
image: "redis:alpine"
```
#### 运行 compose 项目
### 11.3.3 启动与验证
#### 启动项目
```bash
$ docker compose up
```
此时访问本地 `5000` 端口每次刷新页面计数就会加 1
按下 `Ctrl-C` 停止项目
#### 后台运行
#### 后台运行与停止
```bash
$ docker compose up -d
$ docker compose stop
```
#### 停止
#### 查看日志
```bash
$ docker compose stop
$ docker compose logs -f
```
#### 进入服务
@@ -96,21 +96,12 @@ $ docker compose exec redis sh
"9"
```
#### 查看日志
### 11.3.4 常用命令
```bash
$ docker compose logs -f
```
#### 构建镜像
#### 构建与重建
```bash
$ docker compose build
```
#### 启动服务
```bash
$ docker compose start
```
@@ -120,14 +111,9 @@ $ docker compose start
$ docker compose run web python app.py
```
#### 验证 Compose 文件
#### 验证与清理
```bash
$ docker compose config
```
#### 删除项目
```bash
$ docker compose down
```

View File

@@ -1,8 +1,8 @@
## 14.1 使用 kubeadm 部署 Kubernetes
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `Kubernetes` 集群的最佳实践
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `Kubernetes` 集群的常用工具
> **版本说明**Kubernetes 版本更新较快 (约每 4 个月一个新版本)本文档基于 Kubernetes 1.35 编写请访问 [Kubernetes 官方发布页](https://kubernetes.io/releases/)获取最新版本信息
> **版本说明**Kubernetes 版本更新较快 (约每 4 个月一个新版本)本文档基于 Kubernetes 1.35 编写更完整的安装和兼容性说明请以 [Kubernetes 官方 kubeadm 文档](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/) 和 [containerd 官方文档](https://containerd.io/docs/) 为准
### 14.1.1 安装 containerd
@@ -20,187 +20,24 @@ $ sudo yum install containerd.io
### 14.1.2 配置 containerd
生成默认配置文件
生成默认配置文件然后只调整与 kubeadm 相关的关键项
```bash
$ sudo mkdir -p /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
```
修改 `/etc/containerd/config.toml` 配置文件
打开 `/etc/containerd/config.toml`确认 `runc` 选项使用 `systemd` cgroup 驱动
```toml
version = 2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
```
## persistent data location
默认配置里的其它内容通常可以保持不变修改完成后重启 containerd
root = "/var/lib/containerd"
## runtime state information
state = "/run/containerd"
plugin_dir = ""
disabled_plugins = []
required_plugins = []
## set containerd's OOM score
oom_score = 0
[grpc]
address = "/run/containerd/containerd.sock"
tcp_address = ""
tcp_tls_cert = ""
tcp_tls_key = ""
# socket uid
uid = 0
# socket gid
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
[debug]
address = ""
format = "json"
uid = 0
gid = 0
level = ""
[metrics]
address = "127.0.0.1:1338"
grpc_histogram = false
[cgroup]
path = ""
[timeouts]
"io.containerd.timeout.shim.cleanup" = "5s"
"io.containerd.timeout.shim.load" = "5s"
"io.containerd.timeout.shim.shutdown" = "3s"
"io.containerd.timeout.task.state" = "2s"
[plugins]
[plugins."io.containerd.gc.v1.scheduler"]
pause_threshold = 0.02
deletion_threshold = 0
mutation_threshold = 100
schedule_delay = "0s"
startup_delay = "100ms"
[plugins."io.containerd.grpc.v1.cri"]
disable_tcp_service = true
stream_server_address = "127.0.0.1"
stream_server_port = "0"
stream_idle_timeout = "4h0m0s"
enable_selinux = false
selinux_category_range = 1024
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10"
stats_collect_period = 10
# systemd_cgroup = false
enable_tls_streaming = false
max_container_log_line_size = 16384
disable_cgroup = false
disable_apparmor = false
restrict_oom_score_adj = false
max_concurrent_downloads = 3
disable_proc_mount = false
unset_seccomp_profile = ""
tolerate_missing_hugetlb_controller = true
disable_hugetlb_controller = true
ignore_image_defined_volumes = false
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
default_runtime_name = "runc"
no_pivot = false
disable_snapshot_annotations = false
discard_unpacked_layers = false
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
pod_annotations = []
container_annotations = []
privileged_without_host_devices = false
base_runtime_spec = ""
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# SystemdCgroup enables systemd cgroups.
SystemdCgroup = true
# BinaryName is the binary name of the runc binary.
# BinaryName = "runc"
# BinaryName = "crun"
# NoPivotRoot disables pivot root when creating a container.
# NoPivotRoot = false
# NoNewKeyring disables new keyring for the container.
# NoNewKeyring = false
# ShimCgroup places the shim in a cgroup.
# ShimCgroup = ""
# IoUid sets the I/O's pipes uid.
# IoUid = 0
# IoGid sets the I/O's pipes gid.
# IoGid = 0
# Root is the runc root directory.
Root = ""
# CriuPath is the criu binary path.
# CriuPath = ""
# CriuImagePath is the criu image path
# CriuImagePath = ""
# CriuWorkPath is the criu work path.
# CriuWorkPath = ""
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
max_conf_num = 1
conf_template = ""
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
# Foo = ["bar"]
[plugins."io.containerd.grpc.v1.cri".image_decryption]
key_model = ""
[plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
tls_cert_file = ""
tls_key_file = ""
[plugins."io.containerd.internal.v1.opt"]
path = "/opt/containerd"
[plugins."io.containerd.internal.v1.restart"]
interval = "10s"
[plugins."io.containerd.metadata.v1.bolt"]
content_sharing_policy = "shared"
[plugins."io.containerd.monitor.v1.cgroups"]
no_prometheus = false
[plugins."io.containerd.runtime.v2.task"]
platforms = ["linux/amd64"]
[plugins."io.containerd.service.v1.diff-service"]
default = ["walking"]
[plugins."io.containerd.snapshotter.v1.devmapper"]
root_path = ""
pool_name = ""
base_image_size = ""
async_remove = false
```bash
$ sudo systemctl restart containerd
```
### 14.1.3 安装 **kubelet****kubeadm****kubectl****cri-tools****kubernetes-cni**
@@ -436,8 +273,3 @@ $ kubectl taint nodes --all node-role.kubernetes.io/master-
...
```
### 14.1.11 参考文档
* [官方文档](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)
* [Container runtimes](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd)

View File

@@ -287,7 +287,3 @@ $ kubectl taint nodes --all node-role.kubernetes.io/master-
...
```
### 14.2.11 参考文档
* [官方文档](https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)

View File

@@ -50,13 +50,7 @@ sudo systemctl status kubelet
sudo systemctl enable kubelet
```
### 参考资源
详细的部署步骤和配置说明可以参考以下项目
- [opsnull/follow-me-install-kubernetes-cluster](https://github.com/opsnull/follow-me-install-kubernetes-cluster):一个完整的 Kubernetes 集群部署指南项目
该项目提供了详细的步骤说明涵盖 Master 节点Worker 节点的安装配置以及如何使用 systemd 管理这些组件的生命周期
如果希望查看更完整的 systemd 部署案例可以参考 `opsnull/follow-me-install-kubernetes-cluster` 这类社区项目再结合本章前文的 kubeadm 与组件配置说明理解整体流程
### 推荐学习路径

View File

@@ -40,8 +40,3 @@ $ kubectl create token dashboard-admin -n kubernetes-dashboard
```
将输出的令牌粘贴到登录页面即可登录
### 14.7.4 参考文档
* [官方文档](https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/)
* [Headlamp](https://headlamp.dev/)(推荐的替代方案)

View File

@@ -1,16 +1,12 @@
## 16.2 腾讯云
如图 16-1所示腾讯云提供完整的云基础设施与容器能力
腾讯云容器服务 TKE 是腾讯云提供的 Kubernetes 托管服务适合把容器化应用部署到云上官方文档见 [腾讯云容器服务](https://intl.cloud.tencent.com/document/product/457)
![腾讯云](./_images/qcloud-logo.jpg)
16-1腾讯云标识
[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=1040\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案
具体包括[云服务器](https://cloud.tencent.com/act/cps/redirect?redirect=1001\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[云存储](https://cloud.tencent.com/act/cps/redirect?redirect=1020\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[云数据库](https://cloud.tencent.com/act/cps/redirect?redirect=1003\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[视频与 CDN](https://cloud.tencent.com/act/cps/redirect?redirect=1019\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console) 和[域名注册](https://dnspod.cloud.tencent.com)等基础云服务;腾讯云分析 (MTA)、腾讯云推送 (信鸽) 等腾讯整体大数据能力;以及 QQ 互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
[腾讯云容器服务 TKE](https://cloud.tencent.com/act/cps/redirect?redirect=10058\&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
下面的示例只保留创建集群部署应用管理镜像和配置加速器这几类最常见操作
![腾讯云容器服务界面](../_images/tencent-cloud-container-service.png)
@@ -71,7 +67,7 @@ kubectl get svc
#### 3. 管理镜像
通过腾讯云容器镜像服务 (TCR) 存储和管理私有镜像
使用腾讯云容器镜像服务 (TCR) 存储和分发私有镜像
```bash
# 登录腾讯云镜像仓库
@@ -86,7 +82,7 @@ docker push ccr.ccs.tencentyun.com/namespace/my-app:latest
### 腾讯云 Docker 镜像加速器配置
为了加快镜像拉取速度腾讯云提供了镜像加速服务配置方法如下
如果你的账号开通了镜像加速器可以把控制台给出的地址写入 Docker 配置
#### Linux 系统配置
@@ -116,60 +112,25 @@ sudo systemctl restart docker
验证配置
```bash
# 查看镜像源是否生效
docker info | grep -A 5 "Registry Mirrors"
```
#### Windows/Mac 配置
对于 Docker Desktop在设置界面中
1. 打开 Docker Desktop 设置
2. 导航到 Docker Engine
3. JSON 配置中添加上述 `registry-mirrors` 字段
4. 点击 Apply & Restart
对于 Docker Desktop在设置界面中打开 `Docker Engine`把上述 `registry-mirrors` 字段写入 JSON 后重启即可
### 腾讯云容器镜像服务TCR
腾讯云容器镜像服务 (TCR) 提供企业级容器镜像存储和分发能力
- **私有镜像仓库**支持命名空间隔离完整的访问权限控制
- **镜像扫描**自动扫描镜像漏洞提供安全建议
- **镜像加速**支持跨地域镜像分发和加速
- **Webhook 通知**镜像推送时自动触发 CI/CD 流程
- **镜像版本管理**标签管理镜像清理策略生命周期管理
#### 快速开始
1. 在腾讯云控制台创建个人版或企业版 TCR 实例
2. 创建命名空间和镜像仓库
3. 配置 Docker 登录凭证
4. 本地构建镜像并推送到 TCR
5. TKE 集群部署时引用 TCR 镜像地址
#### 完整推送/拉取示例
TCR 提供私有镜像仓库访问控制和镜像分发能力一个最小示例如下
```bash
# 登录到腾讯云 TCR(使用 API 密钥)
docker login ccr.ccs.tencentyun.com \
--username <腾讯云账号ID> \
--password <API_KEY>
# 登录到腾讯云 TCR
docker login ccr.ccs.tencentyun.com --username <username>
# 拉取公开镜像
docker pull ccr.ccs.tencentyun.com/library/nginx:latest
# 构建本地镜像
# 构建并推送镜像
docker build -t my-app:v1.0 .
# 标记镜像为 TCR 地址
docker tag my-app:v1.0 \
ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
# 推送镜像到 TCR
docker tag my-app:v1.0 ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
docker push ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
# 在 Dockerfile 中使用 TCR 镜像
FROM ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
RUN echo "使用腾讯云镜像作为基础镜像"
```
#### TKE 集群中使用 TCR 镜像
@@ -193,7 +154,7 @@ spec:
app: my-app
spec:
imagePullSecrets:
- name: tcr-secret # 需提前创建该 Secret
- name: tcr-secret
containers:
- name: my-app
image: ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0

View File

@@ -4,9 +4,11 @@ GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款
我们可以在每个 `job` `step` 中使用 Docker 执行构建步骤
## 21.2.1 最小可用示例
### 21.2.1 最小可用示例
在仓库根目录创建 `/.github/workflows/ci.yml`
更多语法权限模型和可用 action请以 [GitHub Actions 官方文档](https://docs.github.com/en/actions) 为准。
在仓库根目录创建 `.github/workflows/ci.yml`
```yaml
name: CI
@@ -32,7 +34,7 @@ jobs:
```
该示例会在 GitHub Actions 中构建当前仓库的 Docker 镜像不推送到 registry
## 21.2.2 最佳实践
### 21.2.2 最佳实践
* 固定 action 的主版本例如 `@v4` / `@v6`避免使用 `@master` 这类浮动引用
* 设置最小权限例如 `contents: read`需要写入权限时再打开
@@ -46,7 +48,3 @@ jobs:
with:
args: go version
```
## 21.2.3 参考资料
* [Actions Docs](https://docs.github.com/en/actions)

View File

@@ -7,14 +7,14 @@
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程
当然在实际开发过程中你的代码也许不在 GitHub 托管那么你可以尝试使用 `Gogs` + `Drone` 来进行 CI/CD
## 21.3.1 关联项目
### 21.3.1 关联项目
GitHub 新建一个名为 `drone-demo` 的仓库
打开我们已经部署好的 Drone 网站或者 [Drone Cloud](https://cloud.drone.io)
使用 GitHub 账号登录在界面中关联刚刚新建的 `drone-demo` 仓库
## 21.3.2 编写项目源代码
### 21.3.2 编写项目源代码
初始化一个 git 仓库
@@ -71,7 +71,7 @@ trigger:
└── app.go
```
## 21.3.3 推送项目源代码到 GitHub
### 21.3.3 推送项目源代码到 GitHub
```bash
git add .
@@ -81,7 +81,7 @@ git commit -m "test drone ci"
git push origin master
```
## 21.3.4 查看项目构建过程及结果
### 21.3.4 查看项目构建过程及结果
打开我们部署好的 `Drone` 网站或者 Drone Cloud即可看到构建结果
@@ -89,9 +89,3 @@ git push origin master
当然我们也可以把构建结果上传到 GitHubDocker Registry
云服务商提供的对象存储或者生产环境中
## 21.3.5 参考链接
* [Drone Github](https://github.com/drone/drone)
* [Drone 文档](https://docs.drone.io/)
* [Drone 示例](https://github.com/docker-practice/drone-demo)

View File

@@ -1,15 +1,15 @@
## 21.4 Drone Demo
## 21.4.1 Demo 项目说明
### 21.4.1 Demo 项目说明
这是一个基于 Go 语言编写的简单 Web 应用示例用于演示 Drone CI 的持续集成流程
## 21.4.2 目录结构
### 21.4.2 目录结构
* `drone_demo.app.go`简单的 Go Web 服务器代码
* `drone_demo.drone.yml`Drone CI 的配置文件定义了构建和测试流程
## 21.4.3 如何使用
### 21.4.3 如何使用
1. 确保本地已安装 Docker 环境
2. 将示例文件重命名为 Drone 期望的文件名

View File

@@ -4,7 +4,7 @@
本节关注一个核心目标**开发依赖放进容器源码编辑体验留在本地 IDE**
## 21.5.1 适用场景
### 21.5.1 适用场景
* 团队希望统一开发环境Go/Node/Python 版本系统依赖编译链
* 本地系统不方便安装依赖例如 Windows公司管控环境
@@ -12,7 +12,7 @@
不太适合的场景强依赖本机 GPU/USB 设备或需要非常低延迟文件 IO 的工程此时可能需要额外调优挂载/同步策略
## 21.5.2 最小可用模式docker compose + 开发容器
### 21.5.2 最小可用模式docker compose + 开发容器
下面用一个长期运行的开发容器作为例子 Go 为例你可以替换为 Node/Python
@@ -45,7 +45,7 @@
这个模式的优点是简单直接IDE 无关缺点是 IDE 需要额外配置
例如配置远程解释器/语言服务或使用 VS Code Dev Containers
## 21.5.3 目录挂载与权限建议
### 21.5.3 目录挂载与权限建议
* Linux 下如果遇到容器内写文件权限问题优先确保容器内用户与宿主机 UID/GID 对齐
VS Code Dev Containers 支持自动处理手写 Dockerfile/compose 时也可以显式设置用户

View File

@@ -5,12 +5,12 @@ VS Code 的 [Dev Containers](https://code.visualstudio.com/docs/devcontainers/co
本节提供一个最小可用示例把任意项目 Go 为例变成打开即开发的容器化环境
## 21.6.1 前置条件
### 21.6.1 前置条件
* 安装 Docker Desktop Linux 上的 Docker Engine
* VS Code 安装扩展Dev Containers`ms-vscode-remote.remote-containers`
## 21.6.2 最小示例.devcontainer/devcontainer.json
### 21.6.2 最小示例.devcontainer/devcontainer.json
在项目根目录创建 `.devcontainer/devcontainer.json`
@@ -40,7 +40,7 @@ VS Code 会拉取镜像并启动容器,随后你就可以在容器内运行:
go test ./...
```
## 21.6.3 结合 Docker Compose可选
### 21.6.3 结合 Docker Compose可选
如果项目同时依赖数据库/缓存例如 Postgres/Redis可以使用 `dockerComposeFile`
把依赖一起拉起

View File

@@ -1,5 +1,11 @@
# 修订记录
* 1.7.2 2026-03-28
* 修正 macOSWindowsCompose Kubernetes 章节中的时效性内容和错误前提
* 收缩越界网络内容补充 bind mounttmpfs 与端口映射的关键限制说明
* 统一 numbered section 的标题层级清理正文末尾分散的参考资料小节
* 补充生成物忽略规则避免 `.mdpress` 与本地 HTML 导出误提交
* 1.7.1 2026-03-28
* 对齐附录首页与目录结构补全学习路线入口
* 重组资源链接页统一官方一手入口

View File

@@ -2,7 +2,7 @@
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![图](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![图](https://img.shields.io/badge/Based-Docker%20Engine%20v29.x-blue.svg)](https://docs.docker.com/engine/release-notes/) [![图](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1]
[**v1.7.1**](https://github.com/yeasy/docker_practice/releases/tag/v1.7.1) | [PDF 下载](https://github.com/yeasy/docker_practice/releases/latest)
[**v1.7.2**](https://github.com/yeasy/docker_practice/releases/tag/v1.7.2) | [PDF 下载](https://github.com/yeasy/docker_practice/releases/latest)
## 下载离线版本

View File

@@ -12,6 +12,12 @@
* [Docker Hub 文档](https://docs.docker.com/docker-hub/)
* [Docker Blog](https://www.docker.com/blog/)
* [Docker Roadmap](https://github.com/docker/roadmap)
* [Kubernetes 文档](https://kubernetes.io/docs/)
* [Kubernetes 发布页](https://kubernetes.io/releases/)
* [kubeadm 安装文档](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)
* [containerd 文档](https://containerd.io/docs/)
* [GitHub Actions 文档](https://docs.github.com/en/actions)
* [Drone 文档](https://docs.drone.io/)
### 参考文档
@@ -19,6 +25,8 @@
* [Dockerfile 参考](https://docs.docker.com/reference/dockerfile/)
* [Docker 构建最佳实践](https://docs.docker.com/build/building/best-practices/)
* [Docker 远端应用 API](https://docs.docker.com/develop/sdk/)
* [Docker 存储文档](https://docs.docker.com/engine/storage/)
* [Docker 网络文档](https://docs.docker.com/engine/network/)
### 源码仓库

View File

@@ -1,6 +1,6 @@
{
"name": "docker_practice",
"version": "1.7.1",
"version": "1.7.2",
"description": "docker_practice",
"main": "index.js",
"devDependencies": {