mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-28 12:45:23 +00:00
Polish Docker workflow formatting
This commit is contained in:
@@ -178,7 +178,7 @@ ubuntu:24.04
|
||||
nginx # 等同于 nginx:latest
|
||||
```
|
||||
|
||||
#### 2. 镜像 ID (Content-Addressable)
|
||||
#### 2. 镜像 ID:Content-Addressable 标识
|
||||
|
||||
每个镜像有一个基于内容计算的唯一 ID:
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ flowchart TD
|
||||
ContainerLayer --> ImageLayerN --> ImageLayerN1 --> Dots --> ImageLayer1
|
||||
```
|
||||
|
||||
#### Copy-on-Write (写时复制)
|
||||
#### Copy-on-Write:写时复制
|
||||
|
||||
当容器需要修改镜像层中的文件时:
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
> 注意:以下命令以 CentOS 7 为例。对于 CentOS Stream 9、Rocky Linux 9 或 AlmaLinux 9,请将 `yum` 替换为 `dnf`,并将软件包后缀 `el7` 替换为 `el9`。
|
||||
|
||||
#### YUM 本地文件安装 (推荐)
|
||||
#### YUM 本地文件安装:推荐
|
||||
|
||||
推荐这种方式,是因为在生产环境中一般会选定某个指定的文档软件版本使用。
|
||||
|
||||
@@ -78,7 +78,7 @@ Total
|
||||
exiting because "Download Only" specified
|
||||
```
|
||||
|
||||
##### 复制到目标服务器之后进入文件夹安装 (C-N)
|
||||
##### 复制到目标服务器之后进入文件夹安装:C-N
|
||||
|
||||
* 离线安装时,必须使用 rpm 命令不检查依赖的方式安装
|
||||
|
||||
@@ -86,7 +86,7 @@ exiting because "Download Only" specified
|
||||
rpm -Uvh *.rpm --nodeps --force
|
||||
```
|
||||
|
||||
##### 锁定软件版本 (C-N)
|
||||
##### 锁定软件版本:C-N
|
||||
|
||||
**下载锁定版本软件**
|
||||
|
||||
@@ -228,7 +228,7 @@ reposync -r docker-ce-stable -p /tmp/docker-ce/
|
||||
createrepo /var/www/html/docker-ce/
|
||||
```
|
||||
|
||||
##### YUM 客户端设置 (C...N)
|
||||
##### YUM 客户端设置:C...N
|
||||
|
||||
```bash
|
||||
rm -f /etc/yum.repos.d/*
|
||||
@@ -253,7 +253,7 @@ EOF
|
||||
|
||||
```
|
||||
|
||||
##### Docker 安装 (C...N)
|
||||
##### Docker 安装:C...N
|
||||
|
||||
```bash
|
||||
sudo yum makecache fast
|
||||
|
||||
@@ -162,7 +162,7 @@ $ docker image prune
|
||||
|
||||
除了虚悬镜像,`docker image ls` 默认列出的只是顶层镜像。还有一种镜像是为了加速镜像构建、重复利用资源而存在的中间层镜像。
|
||||
|
||||
#### 查看所有镜像 (包含中间层)
|
||||
#### 查看所有镜像:包含中间层
|
||||
|
||||
```bash
|
||||
$ docker images -a
|
||||
|
||||
@@ -208,7 +208,7 @@ Untagged: ubuntu:24.04
|
||||
|
||||
当同一个镜像有多个标签时,`docker rmi` 只是删除指定的标签,不会删除镜像本身。
|
||||
|
||||
#### 原因三:被其他镜像依赖 (中间层)
|
||||
#### 原因三:被其他镜像依赖:中间层
|
||||
|
||||
```bash
|
||||
$ docker rmi some_base_image
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
Dockerfile 是一个文本文件,其内包含了一条条的 **指令 (Instruction)**,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
|
||||
|
||||
### 4.5.1 使用 docker init 快速创建 (推荐)
|
||||
### 4.5.1 使用 docker init 快速创建:推荐
|
||||
|
||||
Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Dockerfile、.dockerignore 和 compose.yaml 文件:
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ Docker 容器默认是 **前台运行** 的。使用 `-d` (detach) 参数可以
|
||||
|
||||
### 5.2.2 基本使用
|
||||
|
||||
#### 前台运行 (默认)
|
||||
#### 前台运行:默认
|
||||
|
||||
```bash
|
||||
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
@@ -29,7 +29,7 @@ hello world
|
||||
- 按 `Ctrl+C` 会终止容器
|
||||
- 关闭终端窗口,容器也会停止
|
||||
|
||||
#### 后台运行 (使用 -d 参数)
|
||||
#### 后台运行:使用 -d 参数
|
||||
|
||||
```bash
|
||||
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
---
|
||||
|
||||
### 5.3.2 docker stop (推荐)
|
||||
### 5.3.2 docker stop:推荐
|
||||
|
||||
#### docker stop 基本用法
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Docker 提供两种进入容器的命令:
|
||||
|
||||
---
|
||||
|
||||
### 5.4.3 docker exec (推荐)
|
||||
### 5.4.3 docker exec:推荐
|
||||
|
||||
#### docker exec 基本用法
|
||||
|
||||
@@ -109,7 +109,7 @@ root@69d137adef7a:/# # 有提示符
|
||||
|
||||
---
|
||||
|
||||
### 5.4.4 docker attach (谨慎使用)
|
||||
### 5.4.4 docker attach:谨慎使用
|
||||
|
||||
#### docker attach 基本用法
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ Total reclaimed space: 150MB
|
||||
$ docker container prune -f
|
||||
```
|
||||
|
||||
#### 删除所有容器 (包括运行中的)
|
||||
#### 删除所有容器:包括运行中的
|
||||
|
||||
```bash
|
||||
## 先停止所有容器,再删除
|
||||
|
||||
@@ -94,7 +94,7 @@ $ docker push username/myapp:v1
|
||||
|
||||
### 6.1.4 安全最佳实践
|
||||
|
||||
#### 1. 启用 2FA (双因素认证)
|
||||
#### 1. 启用 2FA:双因素认证
|
||||
|
||||
为了保护您的 Docker Hub 账号安全,我们建议采取以下措施。
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ RUN addgroup -g 1001 -S appgroup && \
|
||||
|
||||
### 7.11.5 运行时切换用户
|
||||
|
||||
#### 使用 gosu (推荐)
|
||||
#### 使用 gosu:推荐
|
||||
|
||||
在 ENTRYPOINT 脚本中切换用户时,不要使用 `su` 或 `sudo`,应使用 [gosu](https://github.com/tianon/gosu):
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LABEL version="1.0"
|
||||
LABEL description="这是一个 Web 应用服务器"
|
||||
```
|
||||
|
||||
#### 定义多个标签 (推荐)
|
||||
#### 定义多个标签:推荐
|
||||
|
||||
```docker
|
||||
LABEL maintainer="user@example.com" \
|
||||
@@ -68,7 +68,7 @@ LABEL org.opencontainers.image.authors="yeasy" \
|
||||
|
||||
---
|
||||
|
||||
### 7.14.5 MAINTAINER 指令 (已废弃)
|
||||
### 7.14.5 MAINTAINER 指令:已废弃
|
||||
|
||||
旧版本的 Dockerfile 中常看到 `MAINTAINER` 指令:
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ RUN ["apt-get", "update"]
|
||||
|
||||
### 7.1.3 常见最佳实践
|
||||
|
||||
#### 1. 组合命令 (减少层数)
|
||||
#### 1. 组合命令:减少层数
|
||||
|
||||
每一个 `RUN` 指令都会新建一层镜像。为了减少镜像体积和层数,应使用 `&&` 连接命令。
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ COPY app[0-9].js /app/ # app0.js ~ app9.js
|
||||
COPY app.js /usr/src/app/
|
||||
```
|
||||
|
||||
#### 相对路径 (基于 WORKDIR)
|
||||
#### 相对路径:基于 WORKDIR
|
||||
|
||||
```docker
|
||||
WORKDIR /app
|
||||
|
||||
@@ -30,7 +30,7 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### 7.3.3 自动解压功能
|
||||
|
||||
#### 基本用法 (自动解压本地 tar)
|
||||
#### 基本用法:自动解压本地 tar
|
||||
|
||||
```docker
|
||||
## 自动解压 tar.gz 到目标目录
|
||||
@@ -71,7 +71,7 @@ app.tar.gz 包含: /app/ 目录结果:
|
||||
|
||||
---
|
||||
|
||||
### 7.3.4 URL 下载功能 (不推荐)
|
||||
### 7.3.4 URL 下载功能:不推荐
|
||||
|
||||
#### 基本用法
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ CMD 有三种格式:
|
||||
| **shell 格式** | `CMD 命令 参数1 参数2` | ⚠️ 简单场景 |
|
||||
| **参数格式** | `CMD [“参数1”, “参数2”]` | 配合 ENTRYPOINT |
|
||||
|
||||
#### exec 格式 (推荐)
|
||||
#### exec 格式:推荐
|
||||
|
||||
```docker
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
@@ -80,7 +80,7 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
|
||||
|
||||
### 7.5.4 场景一:让镜像像命令一样使用
|
||||
|
||||
#### 需求 (启动前准备)
|
||||
#### 需求:启动前准备
|
||||
|
||||
创建一个查询公网 IP 的 “命令” 镜像。
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ flowchart LR
|
||||
|
||||
### 8.1.3 数据卷 vs 容器存储层
|
||||
|
||||
#### 容器存储层 (不推荐存储重要数据)
|
||||
#### 容器存储层:不推荐存储重要数据
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
@@ -43,7 +43,7 @@ graph TD
|
||||
Delete[容器删除] -->|导致| DataLost[数据丢失 ❌]
|
||||
```
|
||||
|
||||
#### 数据卷 (推荐)
|
||||
#### 数据卷:推荐
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
@@ -105,7 +105,7 @@ $ docker volume inspect my-vol
|
||||
|
||||
### 8.1.5 挂载数据卷
|
||||
|
||||
#### 方式一:--mount (推荐)
|
||||
#### 方式一:--mount:推荐
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
@@ -122,7 +122,7 @@ $ docker run -d \
|
||||
| `target` | 容器内挂载路径 |
|
||||
| `readonly` | 可选,只读挂载 |
|
||||
|
||||
#### 方式二:-v (简写)
|
||||
#### 方式二:-v:简写
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
|
||||
@@ -53,7 +53,7 @@ flowchart LR
|
||||
|
||||
### 8.2.3 基本语法
|
||||
|
||||
#### 使用 --mount (推荐)
|
||||
#### 使用 --mount:推荐
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
@@ -61,7 +61,7 @@ $ docker run -d \
|
||||
nginx
|
||||
```
|
||||
|
||||
#### 使用 -v (简写)
|
||||
#### 使用 -v:简写
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
|
||||
@@ -59,7 +59,7 @@ nameserver 114.114.114.114
|
||||
$ docker run --dns-search=example.com myapp
|
||||
```
|
||||
|
||||
#### 3. --hostname (-h)
|
||||
#### 3. --hostname 与 -h
|
||||
|
||||
设置容器的主机名。
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ ghi789... none null local
|
||||
| **overlay** | 跨主机网络 | Docker Swarm 集群 |
|
||||
| **macvlan** | 容器拥有独立 MAC 地址 | 需要直接接入物理网络 |
|
||||
|
||||
### 9.2.2 Bridge 网络 (默认)
|
||||
### 9.2.2 Bridge 网络:默认
|
||||
|
||||
Bridge 是 Docker 默认使用的网络模式。Docker 启动时会自动创建 `docker0` 虚拟网桥,所有未指定网络的容器都会连接到这个网桥上。
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Overlay 网络在现有网络基础上建立虚拟网络,允许容器跨宿主
|
||||
|
||||
Overlay 网络通过隧道封装技术(通常是 VXLAN)将容器网络流量封装在宿主机物理网络的 UDP 数据包中传输。
|
||||
|
||||
```
|
||||
```text
|
||||
容器 A (192.168.0.2)
|
||||
↓
|
||||
veth 对
|
||||
@@ -250,7 +250,7 @@ Docker 内置 DNS 服务器,但 DNS 解析涉及多个层面的配置。
|
||||
|
||||
#### DNS 解析流程
|
||||
|
||||
```
|
||||
```text
|
||||
容器应用 (dig www.example.com)
|
||||
↓
|
||||
容器内 /etc/resolv.conf (127.0.0.11:53)
|
||||
|
||||
@@ -101,7 +101,7 @@ COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
|
||||
ENTRYPOINT ["/dist"]
|
||||
```
|
||||
|
||||
### 10.3.3 使用 `docker manifest` (底层工具)
|
||||
### 10.3.3 使用 `docker manifest`:底层工具
|
||||
|
||||
除了 `docker buildx`,我们也可以直接操作 Manifest List 来手动组合不同架构的镜像。
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ networks:
|
||||
|
||||
### 11.8.3 配置文件详解
|
||||
|
||||
#### 1. 环境变量 (.env)
|
||||
#### 1. 环境变量文件 .env
|
||||
|
||||
为了安全,不要在 `compose.yaml` 中直接写密码。创建 `.env` 文件:
|
||||
|
||||
|
||||
@@ -8,17 +8,10 @@ Docker 采用了 **C/S (客户端/服务端)** 架构。Client 向 Daemon 发送
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Client[客户端 (Docker CLI)] -- docker run --> Dockerd
|
||||
Client -- docker pull --> Dockerd
|
||||
|
||||
subgraph "Docker Host"
|
||||
Dockerd(dockerd<br>守护进程)
|
||||
Containers(Containers<br>容器)
|
||||
Images(Images<br>镜像)
|
||||
|
||||
Dockerd -- 管理 --> Containers
|
||||
Dockerd -- 管理 --> Images
|
||||
end
|
||||
C1["客户端"] -->|docker run| D["dockerd\n守护进程"]
|
||||
C1 -->|docker pull| D
|
||||
D -->|管理| C2["Containers\n容器"]
|
||||
D -->|管理| C3["Images\n镜像"]
|
||||
```
|
||||
|
||||
---
|
||||
@@ -27,11 +20,11 @@ graph LR
|
||||
|
||||
Docker 的内部架构如同洋葱一样分层,每一层专注解决特定问题:
|
||||
|
||||
#### 1. Docker CLI (客户端)
|
||||
#### 1. Docker CLI:客户端
|
||||
|
||||
用户与 Docker 交互的主要方式。它将用户命令 (如 `docker run`) 转换为 API 请求发送给 dockerd。
|
||||
|
||||
#### 2. Dockerd (守护进程)
|
||||
#### 2. Dockerd:守护进程
|
||||
|
||||
Docker 的大脑。
|
||||
|
||||
@@ -39,7 +32,7 @@ Docker 的大脑。
|
||||
- 管理 Docker 对象 (镜像、容器、网络、卷)
|
||||
- 编排下层组件完成工作
|
||||
|
||||
#### 3. Containerd (高级运行时)
|
||||
#### 3. Containerd:高级运行时
|
||||
|
||||
行业标准的容器运行时 (CNCF 毕业项目)。
|
||||
|
||||
@@ -48,7 +41,7 @@ Docker 的大脑。
|
||||
- **不包含** 复杂的与容器无关的功能 (如构建、API)
|
||||
- Kubernetes 也可以直接使用 containerd (跳过 Docker)
|
||||
|
||||
#### 4. Runc (低级运行时)
|
||||
#### 4. Runc:低级运行时
|
||||
|
||||
用于创建和运行容器的 CLI 工具。
|
||||
|
||||
@@ -72,31 +65,24 @@ Docker 的大脑。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
User((用户))
|
||||
|
||||
subgraph DockerCLI [Docker CLI]
|
||||
Cmd[docker run -d nginx]
|
||||
end
|
||||
|
||||
subgraph DockerHost [Docker Host]
|
||||
Dockerd[Dockerd]
|
||||
Containerd[Containerd]
|
||||
subgraph ContainerRuntime [Runtime]
|
||||
Shim[Containerd-shim]
|
||||
Runc[Runc]
|
||||
Container[容器进程 (nginx)]
|
||||
end
|
||||
end
|
||||
|
||||
User --> Cmd
|
||||
Cmd -- 1. REST API --> Dockerd
|
||||
Dockerd -- 2. gRPC --> Containerd
|
||||
Containerd -- 3. 准备镜像 & Bundle --> Containerd
|
||||
Containerd -- 4. Fork --> Shim
|
||||
Shim -- 5. Exec --> Runc
|
||||
Runc -- 6. Create Namespaces/Cgroups --> Container
|
||||
Runc -.-> |7. Exit| Runc
|
||||
Shim -.-> |8. Monitor IO/Exit| Container
|
||||
U["用户"]
|
||||
K["docker run -d nginx"]
|
||||
D["Dockerd"]
|
||||
C["Containerd"]
|
||||
B["OCI Bundle"]
|
||||
S["Containerd-shim"]
|
||||
R["Runc"]
|
||||
P["容器进程\nnginx"]
|
||||
E["退出"]
|
||||
|
||||
U -->|1. REST API| D
|
||||
K -->|2. gRPC| C
|
||||
C -->|3. 准备镜像和 Bundle| B
|
||||
C -->|4. 启动 Shim| S
|
||||
S -->|5. 执行| R
|
||||
R -->|6. 创建 Namespaces 和 Cgroups| P
|
||||
R -->|7. 进程退出| E
|
||||
S -->|8. 监控 IO 和退出| P
|
||||
```
|
||||
|
||||
1. **CLI** 发送请求给 **Dockerd**
|
||||
|
||||
@@ -60,7 +60,7 @@ COPY . . # 层4:应用代码
|
||||
|
||||
---
|
||||
|
||||
### 12.4.3 Copy-on-Write (写时复制)
|
||||
### 12.4.3 Copy-on-Write:写时复制
|
||||
|
||||
当容器修改只读层中的文件时:
|
||||
|
||||
|
||||
@@ -32,23 +32,23 @@ Kubernetes 完美解决了这些问题。
|
||||
|
||||
### 13.1.3 核心概念
|
||||
|
||||
#### Pod (豆荚)
|
||||
#### Pod:豆荚
|
||||
|
||||
Kubernetes 的最小调度单位。一个 Pod 可以包含一个或多个紧密协作的容器 (共享网络和存储)。就像豌豆荚里的豌豆一样。
|
||||
|
||||
#### Node (节点)
|
||||
#### Node:节点
|
||||
|
||||
运行 Pod 的物理机或虚拟机。
|
||||
|
||||
#### Deployment (部署)
|
||||
#### Deployment:部署
|
||||
|
||||
定义应用的期望状态 (如:需要 3 个副本,镜像版本为 v1)。K8s 会持续确保当前状态符合期望状态。
|
||||
|
||||
#### Service (服务)
|
||||
#### Service:服务
|
||||
|
||||
定义一组 Pod 的访问策略。提供稳定的 Cluster IP 和 DNS 名称,负责负载均衡。
|
||||
|
||||
#### Namespace (命名空间)
|
||||
#### Namespace:命名空间
|
||||
|
||||
用于多租户资源隔离。
|
||||
|
||||
|
||||
@@ -284,7 +284,7 @@ $ sudo modprobe overlay
|
||||
$ sudo modprobe br_netfilter
|
||||
```
|
||||
|
||||
#### 禁用 swap (必须)
|
||||
#### 禁用 swap:必须
|
||||
|
||||
kubelet 默认要求禁用 swap,否则可能导致初始化失败或节点无法加入集群。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## 14.2 使用 kubeadm 部署 Kubernetes (使用 Docker)
|
||||
## 14.2 使用 kubeadm 部署 Kubernetes:使用 Docker
|
||||
|
||||
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令,作为快速创建 `Kubernetes` 集群的最佳实践。
|
||||
|
||||
@@ -70,7 +70,7 @@ $ sudo modprobe overlay
|
||||
$ sudo modprobe br_netfilter
|
||||
```
|
||||
|
||||
#### 禁用 swap (必须)
|
||||
#### 禁用 swap:必须
|
||||
|
||||
kubelet 默认要求禁用 swap,否则可能导致初始化失败或节点无法加入集群。
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
为了让 systemd 管理 Kubernetes 服务,需要创建相应的 `.service` 文件,例如:
|
||||
|
||||
```
|
||||
```text
|
||||
/etc/systemd/system/kubelet.service
|
||||
/etc/systemd/system/kube-proxy.service
|
||||
/etc/systemd/system/kube-apiserver.service
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
图 16-2:腾讯云容器服务示意图
|
||||
|
||||
### 腾讯云容器服务 (TKE) 简介
|
||||
### 腾讯云容器服务:TKE 简介
|
||||
|
||||
腾讯云容器服务 (TKE, Tencent Kubernetes Engine) 是一款容器编排平台,基于原生 Kubernetes 提供,支持自动扩展、负载均衡、多可用区高可用等企业级功能。TKE 帮助开发者快速部署和管理容器化应用,消除集群运维的复杂度。
|
||||
|
||||
@@ -132,7 +132,7 @@ docker info | grep -A 5 "Registry Mirrors"
|
||||
3. 在 JSON 配置中添加上述 `registry-mirrors` 字段
|
||||
4. 点击 “Apply & Restart”
|
||||
|
||||
### 腾讯云容器镜像服务 (TCR)
|
||||
### 腾讯云容器镜像服务:TCR
|
||||
|
||||
腾讯云容器镜像服务 (TCR) 提供企业级容器镜像存储和分发能力:
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ docker pull nginx:latest
|
||||
time docker pull alpine:latest
|
||||
```
|
||||
|
||||
### 阿里云容器镜像服务 (ACR)
|
||||
### 阿里云容器镜像服务:ACR
|
||||
|
||||
阿里云容器镜像服务 (ACR, Container Registry) 是企业级的容器镜像存储和分发平台:
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
|
||||
随着企业业务的扩展,单一云平台可能无法满足所有需求,多云部署成为趋势。
|
||||
|
||||
#### 1. 跨云灾备 (Active-Passive)
|
||||
#### 1. 跨云灾备:Active-Passive
|
||||
|
||||
主要业务运行在一个云 (如 AWS),数据实时复制到另一个云 (如阿里云)。当主云发生故障时,流量切换到备云。
|
||||
|
||||
* **优点**:架构相对简单,数据一致性好控制。
|
||||
* **缺点**:资源闲置浪费,切换可能有 RTO。
|
||||
|
||||
#### 2. 多活部署 (Active-Active)
|
||||
#### 2. 多活部署:Active-Active
|
||||
|
||||
业务同时在多个云上运行,通过全局流量管理 (DNS/GSLB) 分发流量。
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ dockerd \
|
||||
> [!CAUTION]
|
||||
> 永远不要将不可信的普通用户加入到 `docker` 用户组中。同样,在容器编排时尽量避免将宿主机的 `/var/run/docker.sock` 直接映射给普通容器使用,这种模式被称为 Docker-in-Docker (DinD) 或 Docker-out-of-Docker (DooD),存在极高的越权风险。
|
||||
|
||||
### 18.3.3 Rootless 模式 (非特权运行)
|
||||
### 18.3.3 Rootless 模式:非特权运行
|
||||
|
||||
为了从根本上解决“拥有 Docker socket 就是 root”的问题,Docker 在近年推出了 **Rootless 模式**。
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ chmod: /etc/passwd: Operation not permitted
|
||||
```
|
||||
应用只要被劫持进行越界尝试,其操作系统层命令便会立刻吃瘪。
|
||||
|
||||
### 18.5.2 强制访问控制 (AppArmor / SELinux)
|
||||
### 18.5.2 强制访问控制:AppArmor / SELinux
|
||||
|
||||
传统的 Linux 模型遵循 DAC(自主访问控制),这意味着如果一个文件被赋予了全员读写权限(`777`),普通隔离下任何人便都能修改。但 **MAC(强制访问控制)** 技术,诸如 `AppArmor` (常用于 Ubuntu/Debian) 或 `SELinux` (常用于 CentOS/RHEL),可以制定比“文件所有权”更宏观且优先的策略控制模块。
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ $ docker compose up -d
|
||||
* **cAdvisor 无数据或报错**:确认挂载了 Docker 目录与宿主机的 `/sys`、`/var/run` 等路径,并确保宿主机上 Docker 运行正常。
|
||||
* **指标缺失**:确认你的 Docker/内核版本与 cAdvisor 兼容;对于 containerd 等运行时,采集方式会不同。
|
||||
|
||||
#### 关键指标速查 (节点/容器)
|
||||
#### 关键指标速查:节点/容器
|
||||
|
||||
在生产环境排障时,建议优先关注下面几类指标,并在 Grafana 面板中建立对应的常用视图。
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ docker run -d \
|
||||
* **时间窗口/时区**:Discover 右上角的时间范围默认可能是最近 15 分钟,且时区可能影响显示。建议先把范围扩大到最近 24 小时再验证。
|
||||
* **数据解析失败**:若日志是非结构化文本,仍可入库但字段不可用;生产环境建议输出 JSON 并在采集端解析。
|
||||
|
||||
#### 5. 验证日志是否写入 Elasticsearch (生产排错必备)
|
||||
#### 5. 验证日志是否写入 Elasticsearch:生产排错必备
|
||||
|
||||
当你在 Kibana 看不到日志时,建议先跳过 UI,从存储端直接验证“日志是否入库”。
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ docker history go-app:latest
|
||||
|
||||
**go.mod 和 go.sum 示例:**
|
||||
|
||||
```
|
||||
```text
|
||||
module github.com/example/go-app
|
||||
|
||||
go 1.20
|
||||
|
||||
@@ -65,7 +65,7 @@ graph LR
|
||||
|
||||
您也可以选择以下方式在本地离线阅读。
|
||||
|
||||
#### 方式 1:Docker 镜像 (推荐)
|
||||
#### 方式 1:Docker 镜像:推荐
|
||||
|
||||
无需安装任何依赖,一条命令即可启动。
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
`dockerd` 参数会随版本变化。建议优先在目标机器上执行 `dockerd --help`,并以 `daemon.json` 为主进行持久化配置。
|
||||
|
||||
### 常用选项 (Docker Engine 29.x)
|
||||
### 常用选项:Docker Engine 29.x
|
||||
|
||||
* `--config-file="/etc/docker/daemon.json"`:指定 daemon 配置文件路径;
|
||||
* `--data-root=""`:Docker 数据目录 (默认 `/var/lib/docker`);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
* **全书统一标准**:所有的编排命令必须书写为 `docker compose` (带空格的 V2 CLI 插件版)。
|
||||
* 不得在新的文档和案例中提及或使用旧版格式,除非是为了特意说明 V1 到 V2 的迁移。
|
||||
|
||||
## 4. 可复现性目标 (以可重建为目标)
|
||||
## 4. 可复现性目标:以可重建为目标
|
||||
|
||||
本书中的所有实战和案例 (尤其 OS 与 DevOps 章节) 应尽量给出“最小可复现实验环境”。
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
||||
|
||||
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 `supervisord` 来管理所运行的进程。可以参考 https://docs.docker.com/engine/containers/multi-service_container/ 。
|
||||
|
||||
### 如何控制容器占用系统资源 (CPU、内存) 的份额?
|
||||
### 如何控制容器占用 CPU、内存等系统资源的份额?
|
||||
|
||||
答:在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候,可以使用 -c|--cpu-shares\[=0] 参数来调整容器使用 CPU 的权重;使用 -m|--memory\[=MEMORY] 参数来调整容器使用内存的大小。
|
||||
|
||||
@@ -166,7 +166,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
|
||||
## 其它
|
||||
|
||||
### Docker 能在非 Linux 平台 (比如 Windows 或 macOS) 上运行么?
|
||||
### Docker 能在非 Linux 平台上运行么?比如 Windows 或 macOS
|
||||
|
||||
答:完全可以。安装方法请查看[安装 Docker](../../03_install/README.md) 一节
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ Docker 学习可分为四个递进阶段,每个阶段都有明确的学习目
|
||||
- 了解镜像和仓库的基本操作
|
||||
|
||||
**核心内容:**
|
||||
```
|
||||
```text
|
||||
Docker 简介
|
||||
├── 为什么需要 Docker
|
||||
├── 容器 vs 虚拟机 vs 云计算
|
||||
@@ -64,7 +64,7 @@ Docker 安装配置
|
||||
- 熟悉 Docker Compose 编排
|
||||
|
||||
**核心内容:**
|
||||
```
|
||||
```text
|
||||
Dockerfile 指令详解
|
||||
├── FROM / RUN / COPY / ADD
|
||||
├── WORKDIR / ENV / ARG
|
||||
@@ -122,7 +122,7 @@ Docker Compose
|
||||
- 总计:4-6 周
|
||||
|
||||
**项目实战:**
|
||||
```
|
||||
```text
|
||||
项目 1: Python Web 应用(Flask/Django)
|
||||
- 编写多阶段 Dockerfile
|
||||
- 使用 Compose 配置数据库
|
||||
@@ -148,7 +148,7 @@ Docker Compose
|
||||
- 熟悉 CI/CD 集成
|
||||
|
||||
**核心内容:**
|
||||
```
|
||||
```text
|
||||
容器安全
|
||||
├── 镜像安全
|
||||
│ ├── 漏洞扫描(Trivy/Grype/Snyk)
|
||||
@@ -231,7 +231,7 @@ CI/CD 集成
|
||||
- 总计:6-12 周
|
||||
|
||||
**项目实战:**
|
||||
```
|
||||
```text
|
||||
项目 1: 安全镜像构建流程
|
||||
- 集成 Trivy 扫描
|
||||
- 镜像签名和验证
|
||||
@@ -263,7 +263,7 @@ CI/CD 集成
|
||||
- 贡献开源社区
|
||||
|
||||
**核心内容:**
|
||||
```
|
||||
```text
|
||||
Kubernetes 高级特性
|
||||
├── 集群管理
|
||||
│ ├── 节点管理和驱逐
|
||||
@@ -329,7 +329,7 @@ DevOps 工程化
|
||||
|
||||
### 知识点依赖关系
|
||||
|
||||
```
|
||||
```text
|
||||
基础概念 (Week 0-2)
|
||||
├── 容器 vs 虚拟机
|
||||
├── Docker 三大概念
|
||||
@@ -430,7 +430,7 @@ Kubernetes 进阶 (Week 24-36)
|
||||
- 有效期:3 年
|
||||
|
||||
考试内容比例:
|
||||
```
|
||||
```text
|
||||
镜像和仓库(20%)
|
||||
- 镜像构建和管理
|
||||
- 镜像层和缓存
|
||||
@@ -513,7 +513,7 @@ docker stats / events / inspect
|
||||
**Q1: Docker 容器和虚拟机有什么区别?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
虚拟机:
|
||||
- 完整的操作系统环境(GB 级)
|
||||
- 启动时间:分钟级
|
||||
@@ -532,7 +532,7 @@ A(要点):
|
||||
**Q2: 什么是 Docker 镜像?它如何存储的?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
镜像本质:
|
||||
- 只读的文件系统快照
|
||||
- 分层存储结构
|
||||
@@ -552,7 +552,7 @@ A(要点):
|
||||
**Q3: 容器如何实现隔离?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
技术手段:
|
||||
1. Namespace(资源隔离):
|
||||
- PID Namespace:进程隔离
|
||||
@@ -579,7 +579,7 @@ A(要点):
|
||||
**Q4: 如何优化 Docker 镜像大小?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
1. 选择合适的基础镜像:
|
||||
scratch < alpine:3.17 < python:3.11-slim < python:3.11
|
||||
|
||||
@@ -610,7 +610,7 @@ A(要点):
|
||||
**Q5: CMD 和 ENTRYPOINT 有什么区别?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
CMD:
|
||||
- 定义容器默认命令
|
||||
- 容器运行时可被覆盖:docker run image_name custom_cmd
|
||||
@@ -634,7 +634,7 @@ CMD ["--port", "8000"]
|
||||
**Q6: Docker 网络驱动的区别?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
Bridge(默认):
|
||||
- 虚拟网桥,容器间通过网桥通信
|
||||
- 支持端口映射
|
||||
@@ -662,7 +662,7 @@ None:
|
||||
**Q7: Volume 和 Bind Mount 有什么区别?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
Volume:
|
||||
- Docker 管理,存储位置:/var/lib/docker/volumes/
|
||||
- 跨平台兼容,隔离性好
|
||||
@@ -686,7 +686,7 @@ tmpfs:
|
||||
**Q8: 如何提高 Docker 安全性?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
镜像安全:
|
||||
- 使用官方镜像或可信镜像源
|
||||
- 定期扫描漏洞(Trivy/Grype)
|
||||
@@ -714,7 +714,7 @@ A(要点):
|
||||
**Q9: 容器被 OOM 杀死,如何诊断和解决?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
诊断:
|
||||
1. 检查容器是否被 OOM 杀死:
|
||||
docker inspect <container> | grep OOMKilled
|
||||
@@ -746,7 +746,7 @@ A(要点):
|
||||
**Q10: 如何在 CI/CD 中集成 Docker?**
|
||||
|
||||
A(要点):
|
||||
```
|
||||
```text
|
||||
构建阶段:
|
||||
- 触发器:Push / PR 事件
|
||||
- 构建镜像:docker build
|
||||
|
||||
Reference in New Issue
Block a user