mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-04-05 16:25:25 +00:00
Fix guide issues
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -20,6 +20,9 @@ docker-compose.override.yml
|
||||
|
||||
.agent/
|
||||
__pycache__/
|
||||
.mdpress/
|
||||
Docker -- *.html
|
||||
Docker -- *_site/
|
||||
|
||||
# Check scripts
|
||||
check*.py
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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/)。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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) ...
|
||||
|
||||
#### Q:macOS/Windows 性能问题
|
||||
|
||||
在 Docker Desktop 上,Bind Mount 性能较差 (需要跨文件系统同步):
|
||||
在 Docker Desktop 上,Bind Mount 性能通常不如 Volume,因为数据需要在宿主机文件系统和 Linux VM 之间同步:
|
||||
|
||||
```bash
|
||||
## 使用 :cached 或 :delegated 提高性能(macOS)
|
||||
|
||||
@@ -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 对比
|
||||
|
||||
|
||||
@@ -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`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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
|
||||
# 调整 MTU(Maximum 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 的网络章节重点讨论 bridge、host、none、overlay 和 DNS 等能力。CNI、NetworkPolicy、Calico、Cilium 这类概念属于 Kubernetes 编排网络的范畴,后续在 Kubernetes 章节中再展开会更清晰。
|
||||
|
||||
@@ -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` 来进行编排管理。
|
||||
|
||||
@@ -2,32 +2,16 @@
|
||||
|
||||
`Compose` 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
|
||||
|
||||
从 `v2` 版本开始,`Compose` 作为 `docker` 的子命令存在,例如 `docker compose up`。
|
||||
|
||||
`Compose` 支持 Linux、macOS、Windows 10 三大平台。
|
||||
|
||||
`Docker Desktop for Mac/Windows` 自带 `docker compose` 命令。
|
||||
|
||||
Linux 系统请使用以下介绍的方法安装。
|
||||
当前的 Compose 以 `docker compose` 子命令的形式提供。Docker Desktop 在 macOS、Windows 和 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 卸载
|
||||
|
||||
如果是二进制包方式安装的,删除二进制文件即可。
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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/)
|
||||
|
||||
@@ -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 与组件配置说明理解整体流程。
|
||||
|
||||
### 推荐学习路径
|
||||
|
||||
|
||||
@@ -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/)(推荐的替代方案)
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
## 16.2 腾讯云
|
||||
|
||||
如图 16-1:所示,腾讯云提供完整的云基础设施与容器能力。
|
||||
腾讯云容器服务 TKE 是腾讯云提供的 Kubernetes 托管服务,适合把容器化应用部署到云上。官方文档见 [腾讯云容器服务](https://intl.cloud.tencent.com/document/product/457)。
|
||||
|
||||

|
||||
|
||||
图 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 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
下面的示例只保留创建集群、部署应用、管理镜像和配置加速器这几类最常见操作。
|
||||
|
||||

|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub、Docker Registry、
|
||||
云服务商提供的对象存储,或者生产环境中。
|
||||
|
||||
## 21.3.5 参考链接
|
||||
|
||||
* [Drone Github](https://github.com/drone/drone)
|
||||
* [Drone 文档](https://docs.drone.io/)
|
||||
* [Drone 示例](https://github.com/docker-practice/drone-demo)
|
||||
|
||||
@@ -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 期望的文件名:
|
||||
|
||||
@@ -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 时也可以显式设置用户。
|
||||
|
||||
@@ -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`
|
||||
把依赖一起拉起。
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# 修订记录
|
||||
|
||||
* 1.7.2 2026-03-28
|
||||
* 修正 macOS、Windows、Compose 与 Kubernetes 章节中的时效性内容和错误前提
|
||||
* 收缩越界网络内容,补充 bind mount、tmpfs 与端口映射的关键限制说明
|
||||
* 统一 numbered section 的标题层级,清理正文末尾分散的参考资料小节
|
||||
* 补充生成物忽略规则,避免 `.mdpress` 与本地 HTML 导出误提交
|
||||
|
||||
* 1.7.1 2026-03-28
|
||||
* 对齐附录首页与目录结构,补全学习路线入口
|
||||
* 重组资源链接页,统一官方一手入口
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://docs.docker.com/engine/release-notes/) [][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)
|
||||
|
||||
## 下载离线版本
|
||||
|
||||
|
||||
@@ -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/)
|
||||
|
||||
### 源码仓库
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "docker_practice",
|
||||
"version": "1.7.1",
|
||||
"version": "1.7.2",
|
||||
"description": "docker_practice",
|
||||
"main": "index.js",
|
||||
"devDependencies": {
|
||||
|
||||
Reference in New Issue
Block a user