mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-13 21:31:09 +00:00
style: apply global formatting fixes (struct, spacing, zhlint)
This commit is contained in:
@@ -4,9 +4,11 @@
|
||||
|
||||
### 一般性的指南和建议
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 容器应该是短暂的
|
||||
|
||||
通过 `Dockerfile` 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。
|
||||
通过 `Dockerfile` 构建的镜像所启动的容器应该尽可能短暂 (生命周期短)。“短暂” 意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。
|
||||
|
||||
#### 使用 `.dockerignore` 文件
|
||||
|
||||
@@ -14,7 +16,7 @@
|
||||
|
||||
#### 使用多阶段构建
|
||||
|
||||
在 Docker 17.05 以上版本中,你可以使用 [多阶段构建](../07_dockerfile/7.17_multistage_builds.md) 来减少所构建镜像的大小。
|
||||
在 Docker 17.05 以上版本中,你可以使用[多阶段构建](../07_dockerfile/7.17_multistage_builds.md)来减少所构建镜像的大小。
|
||||
|
||||
#### 避免安装不必要的包
|
||||
|
||||
@@ -22,17 +24,17 @@
|
||||
|
||||
#### 一个容器只运行一个进程
|
||||
|
||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web应用、数据库、缓存。
|
||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web 应用、数据库、缓存。
|
||||
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../08_data_network/network/README.md) 来把这些容器连接起来。
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../08_data_network/network/README.md)来把这些容器连接起来。
|
||||
|
||||
#### 镜像层数尽可能少
|
||||
|
||||
你需要在 `Dockerfile` 可读性(也包括长期的可维护性)和减少层数之间做一个平衡。
|
||||
你需要在 `Dockerfile` 可读性 (也包括长期的可维护性) 和减少层数之间做一个平衡。
|
||||
|
||||
#### 将多行参数排序
|
||||
|
||||
将多行参数按字母顺序排序(比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 `PRs` 阅读和审查。建议在反斜杠符号 `\` 之前添加一个空格,以增加可读性。
|
||||
将多行参数按字母顺序排序 (比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 `PRs` 阅读和审查。建议在反斜杠符号 `\` 之前添加一个空格,以增加可读性。
|
||||
|
||||
下面是来自 `buildpack-deps` 镜像的例子:
|
||||
|
||||
@@ -51,7 +53,7 @@ RUN apt-get update && apt-get install -y \
|
||||
|
||||
但是,如果你想在构建的过程中使用缓存,你得明白什么时候会,什么时候不会找到匹配的镜像,遵循的基本规则如下:
|
||||
|
||||
* 从一个基础镜像开始(`FROM` 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。
|
||||
* 从一个基础镜像开始 (`FROM` 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。
|
||||
* 在大多数情况下,只需要简单地对比 `Dockerfile` 中的指令和子镜像。然而,有些指令需要更多的检查和解释。
|
||||
* 对于 `ADD` 和 `COPY` 指令,镜像中对应文件的内容也会被检查,每个文件都会计算出一个校验和。文件的最后修改时间和最后访问时间不会纳入校验。在缓存的查找过程中,会将这些校验和和已存在镜像中的文件校验和进行对比。如果文件有任何改变,比如内容和元数据,则缓存失效。
|
||||
* 除了 `ADD` 和 `COPY` 指令,缓存匹配过程不会查看临时容器中的文件来决定缓存是否匹配。例如,当执行完 `RUN apt-get -y update` 指令后,容器中一些文件被更新,但 Docker 不会检查这些文件。这种情况下,只有指令字符串本身被用来匹配缓存。
|
||||
@@ -64,7 +66,7 @@ RUN apt-get update && apt-get install -y \
|
||||
|
||||
#### FROM
|
||||
|
||||
尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 [Alpine](https://hub.docker.com/_/alpine/) 镜像,因为它被严格控制并保持最小尺寸(目前小于 5 MB),但它仍然是一个完整的发行版。
|
||||
尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 [Alpine](https://hub.docker.com/_/alpine/) 镜像,因为它被严格控制并保持最小尺寸 (目前小于 5 MB),但它仍然是一个完整的发行版。
|
||||
|
||||
#### LABEL
|
||||
|
||||
@@ -102,11 +104,15 @@ LABEL vendor=ACME\ Incorporated \
|
||||
|
||||
为了保持 `Dockerfile` 文件的可读性,可理解性,以及可维护性,建议将长的或复杂的 `RUN` 指令用反斜杠 `\` 分割成多行。
|
||||
|
||||
##### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
##### apt-get
|
||||
|
||||
`RUN` 指令最常见的用法是安装包用的 `apt-get`。因为 `RUN apt-get` 指令会安装包,所以有几个问题需要注意。
|
||||
|
||||
不要使用 `RUN apt-get upgrade` 或 `dist-upgrade`,因为许多基础镜像中的「必须」包不会在一个非特权容器中升级。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 `foo`,需要升级,使用 `apt-get install -y foo` 就行,该指令会自动升级 `foo` 包。
|
||||
不要使用 `RUN apt-get upgrade` 或 `dist-upgrade`,因为许多基础镜像中的 “必须” 包不会在一个非特权容器中升级。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 `foo`,需要升级,使用 `apt-get install -y foo` 就行,该指令会自动升级 `foo` 包。
|
||||
|
||||
永远将 `RUN apt-get update` 和 `apt-get install` 组合成一条 `RUN` 声明,例如:
|
||||
|
||||
@@ -174,9 +180,9 @@ RUN apt-get update && apt-get install -y \
|
||||
|
||||
#### CMD
|
||||
|
||||
`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务(比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。
|
||||
`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务 (比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。
|
||||
|
||||
多数情况下,`CMD` 都需要一个交互式的 `shell` (bash, Python, perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。
|
||||
多数情况下,`CMD` 都需要一个交互式的 `shell` (bash,Python,perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。
|
||||
|
||||
#### EXPOSE
|
||||
|
||||
@@ -206,7 +212,7 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
||||
|
||||
#### ADD 和 COPY
|
||||
|
||||
虽然 `ADD` 和 `COPY` 功能类似,但一般优先使用 `COPY`。因为它比 `ADD` 更透明。`COPY` 只支持简单将本地文件拷贝到容器中,而 `ADD` 有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)。因此,`ADD` 的最佳用例是将本地 tar 文件自动提取到镜像中,例如 `ADD rootfs.tar.xz`。
|
||||
虽然 `ADD` 和 `COPY` 功能类似,但一般优先使用 `COPY`。因为它比 `ADD` 更透明。`COPY` 只支持简单将本地文件拷贝到容器中,而 `ADD` 有一些并不明显的功能 (比如本地 tar 提取和远程 URL 支持)。因此,`ADD` 的最佳用例是将本地 tar 文件自动提取到镜像中,例如 `ADD rootfs.tar.xz`。
|
||||
|
||||
如果你的 `Dockerfile` 有多个步骤需要使用上下文中不同的文件。单独 `COPY` 每个文件,而不是一次性的 `COPY` 所有文件,这将保证每个步骤的构建缓存只在特定的文件变化时失效。例如:
|
||||
|
||||
@@ -245,9 +251,9 @@ RUN mkdir -p /usr/src/things \
|
||||
|
||||
#### ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 的最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行(用 `CMD` 提供默认选项)。
|
||||
`ENTRYPOINT` 的最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行 (用 `CMD` 提供默认选项)。
|
||||
|
||||
例如,下面的示例镜像提供了命令行工具 `s3cmd`:
|
||||
例如,下面的示例镜像提供了命令行工具 `s3cmd`:
|
||||
|
||||
```docker
|
||||
ENTRYPOINT ["s3cmd"]
|
||||
@@ -330,7 +336,7 @@ $ docker run --rm -it postgres bash
|
||||
|
||||
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显式的指定一个 UID/GID。
|
||||
|
||||
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
|
||||
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能 (例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
|
||||
|
||||
最后,为了减少层数和复杂度,避免频繁地使用 `USER` 来回切换用户。
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
## 16.2 如何调试 Docker
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 开启 Debug 模式
|
||||
|
||||
在 dockerd 配置文件 daemon.json(默认位于 /etc/docker/)中添加
|
||||
在 dockerd 配置文件 daemon.json (默认位于 /etc/docker/) 中添加
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -45,7 +47,7 @@ $ sudo kill -SIGUSR1 $(pidof dockerd)
|
||||
$ docker system prune
|
||||
```
|
||||
|
||||
如果你只是想“恢复出厂设置”,在 Docker Desktop 里也提供了相应入口。
|
||||
如果你只是想 “恢复出厂设置”,在 Docker Desktop 里也提供了相应入口。
|
||||
|
||||
```bash
|
||||
$ sudo rm -rf /var/lib/docker
|
||||
@@ -53,32 +55,36 @@ $ sudo rm -rf /var/lib/docker
|
||||
|
||||
### 常见故障排查
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 容器启动失败
|
||||
|
||||
如果容器启动后立即退出,可以使用 `docker logs` 查看原因。
|
||||
|
||||
* **Exit Code 1**: 应用程序错误。通常是配置错误或依赖缺失。
|
||||
* **Exit Code 137**: OOM (Out Of Memory)。容器内存不足被内核杀掉。
|
||||
* **Exit Code 1**:应用程序错误。通常是配置错误或依赖缺失。
|
||||
* **Exit Code 137**:OOM (Out Of Memory)。容器内存不足被内核杀掉。
|
||||
* 检查宿主机内存。
|
||||
* 调整容器内存限制 (`--memory`)。
|
||||
* **Exit Code 127**: 命令未找到。可能是 `ENTRYPOINT` 或 `CMD` 指定的命令不存在。
|
||||
* **Exit Code 127**:命令未找到。可能是 `ENTRYPOINT` 或 `CMD` 指定的命令不存在。
|
||||
|
||||
#### 网络连接问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
##### 容器内部无法联网
|
||||
|
||||
1. 检查 Docker DNS 配置 (`/etc/docker/daemon.json`)。
|
||||
2. 检查宿主机防火墙 (iptables/firewalld) 是否拦截了转发。
|
||||
3. 容器内测试: `ping 8.8.8.8` (测试连通性), `nslookup google.com` (测试 DNS)。
|
||||
3. 容器内测试:`ping 8.8.8.8` (测试连通性),`nslookup google.com` (测试 DNS)。
|
||||
|
||||
##### 端口映射不通
|
||||
|
||||
1. 检查容器端口是否正确监听: `netstat -tunlp` (宿主机) 或 `docker exec <container> netstat -tunlp`。
|
||||
1. 检查容器端口是否正确监听:`netstat -tunlp` (宿主机) 或 `docker exec <container> netstat -tunlp`。
|
||||
2. 确认应用监听地址是 `0.0.0.0` 而不是 `127.0.0.1`。
|
||||
* 如果应用监听在 `127.0.0.1`,只有容器内部能访问,映射到宿主机外部也无法被外部请求访问。
|
||||
|
||||
#### 镜像拉取失败
|
||||
|
||||
* **connection refused**: 检查网络或代理设置。
|
||||
* **image not found**: 检查镜像名称和 Tag 拼写。
|
||||
* **EOF / timeout**: 网络不稳定,尝试配置镜像加速器。
|
||||
* **connection refused**:检查网络或代理设置。
|
||||
* **image not found**:检查镜像名称和 Tag 拼写。
|
||||
* **EOF / timeout**:网络不稳定,尝试配置镜像加速器。
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 16.3 资源链接
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 官方网站
|
||||
|
||||
* Docker 官方主页:https://www.docker.com
|
||||
@@ -19,7 +21,7 @@
|
||||
|
||||
### 技术交流
|
||||
|
||||
* Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user
|
||||
* Docker 邮件列表:https://groups.google.com/forum/#!forum/docker-user
|
||||
* Docker 社区 Slack:https://dockercommunity.slack.com/
|
||||
* Docker Community Discord: https://discord.gg/docker
|
||||
* Docker 的 X (Twitter) 主页:https://twitter.com/docker
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## 16.4 术语词表(出版统一版)
|
||||
## 16.4 术语词表 (出版统一版)
|
||||
|
||||
本词表用于统一全书术语、缩写和命令表达,适用于最终出版前清稿。
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
### 清稿执行规则
|
||||
|
||||
1. 术语首次出现采用“中文(英文)”格式,例如“注册服务器(Registry)”。
|
||||
1. 术语首次出现采用 “中文 (英文)” 格式,例如 “注册服务器 (Registry)”。
|
||||
2. 命令、文件名、配置键统一使用反引号包裹。
|
||||
3. 同一章节中,术语只保留一种主写法,不混用同义词。
|
||||
4. 若引用历史名词(如 `docker-compose.yml`),需显式标注“历史文件名”。
|
||||
4. 若引用历史名词 (如 `docker-compose.yml`),需显式标注 “历史文件名”。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## 16.5 出版清稿规范(图号与章节风格)
|
||||
## 16.5 出版清稿规范 (图号与章节风格)
|
||||
|
||||
本规范用于最终出版前清稿,确保全书图号、图题、章节结构与行文风格一致。
|
||||
|
||||
@@ -6,22 +6,22 @@
|
||||
|
||||
1. 图号格式统一为:`图 <章号>-<序号> <图题>`,例如 `图 10-2 Rails + PostgreSQL 的 Compose 架构`。
|
||||
2. 图号在同一章内按出现顺序连续编号,不重复、不跳号。
|
||||
3. 正文引用图片统一写法:`如图 <章号>-<序号> 所示`,不使用“下图/上图/示意图如下”。
|
||||
4. 所有图片必须提供有意义的 alt 文本,不使用空 alt(``)。
|
||||
3. 正文引用图片统一写法:`如图 <章号>-<序号> 所示`,不使用 “下图/上图/示意图如下”。
|
||||
4. 所有图片必须提供有意义的 alt 文本,不使用空 alt (``)。
|
||||
5. 图题单独成行,放在图片下方。
|
||||
|
||||
### 章节风格规范
|
||||
|
||||
1. 小节标题统一使用编号体例:`## 10.6 ...`、`### 步骤 1:...`。
|
||||
2. 步骤型内容统一使用“步骤 N:”中文格式,不使用 `Step N:`。
|
||||
2. 步骤型内容统一使用 “步骤 N:” 中文格式,不使用 `Step N:`。
|
||||
3. 命令行示例统一以 `bash` 代码块展示,提示符统一为 `$`。
|
||||
4. 关键提醒统一使用引用块(`> 注意/提示/警告`),避免正文中混杂多种强调样式。
|
||||
5. 章节内术语使用需遵循《[术语词表(出版统一版)](16.4_terminology.md)》。
|
||||
4. 关键提醒统一使用引用块 (`> 注意/提示/警告`),避免正文中混杂多种强调样式。
|
||||
5. 章节内术语使用需遵循《[术语词表 (出版统一版)](16.4_terminology.md)》。
|
||||
|
||||
### 出版前自检清单
|
||||
|
||||
1. 是否仍存在“下图/上图/示意图如下”等相对指代。
|
||||
1. 是否仍存在 “下图/上图/示意图如下” 等相对指代。
|
||||
2. 是否存在未编号或编号冲突的图题。
|
||||
3. 是否存在 `kubernetes`、`compose` 等正文大小写不统一写法。
|
||||
4. 是否存在 `Step N:` 与“步骤 N:”混用。
|
||||
4. 是否存在 `Step N:` 与 “步骤 N:” 混用。
|
||||
5. 是否存在未加反引号的命令、文件名和配置键名。
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
# 第十六章 附录
|
||||
# 第十六章附录
|
||||
|
||||
本章包含了 Docker 相关的参考资料、常见问题解答以及最佳实践指南,旨在为读者提供便捷的查阅工具。
|
||||
|
||||
## 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
## 目录
|
||||
|
||||
* [**常见问题总结 (FAQ)**](faq/README.md):汇总了学习和使用 Docker 过程中的常见问题与错误解决方案。
|
||||
* [**热门镜像介绍**](repo/README.md):详细介绍了 Nginx, MySQL, Redis 等常用官方镜像的使用方法。
|
||||
* [**热门镜像介绍**](repo/README.md):详细介绍了 Nginx,MySQL,Redis 等常用官方镜像的使用方法。
|
||||
* [**Docker 命令查询**](command/README.md):速查 Docker 客户端和服务端的常用命令。
|
||||
* [**Dockerfile 最佳实践**](16.1_best_practices.md):提供编写高效、安全 Dockerfile 的指导原则。
|
||||
* [**如何调试 Docker**](16.2_debug.md):介绍 Docker 调试技巧和工具。
|
||||
* [**资源链接**](16.3_resources.md):推荐更多 Docker 相关的学习资源。
|
||||
* [**术语词表(出版统一版)**](16.4_terminology.md):统一全书中英文术语、缩写与命令写法。
|
||||
* [**出版清稿规范(图号与章节风格)**](16.5_editorial_style.md):统一图号命名、图题写法与章节风格。
|
||||
* [**术语词表 (出版统一版)**](16.4_terminology.md):统一全书中英文术语、缩写与命令写法。
|
||||
* [**出版清稿规范 (图号与章节风格)**](16.5_editorial_style.md):统一图号命名、图题写法与章节风格。
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Docker 命令查询
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
## 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
## 基本语法
|
||||
|
||||
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 客户端命令 - docker
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 客户端命令选项
|
||||
|
||||
* `--config=""`:指定客户端配置文件,默认为 `~/.docker`;
|
||||
@@ -27,7 +29,7 @@
|
||||
* `export`:导出容器内容为一个 `tar` 包;
|
||||
* `history`:显示一个镜像的历史信息;
|
||||
* `images`:列出存在的镜像;
|
||||
* `import`:导入一个文件(典型为 `tar` 包)路径或目录来创建一个本地镜像;
|
||||
* `import`:导入一个文件 (典型为 `tar` 包) 路径或目录来创建一个本地镜像;
|
||||
* `info`:显示一些相关的系统信息;
|
||||
* `inspect`:显示一个容器的具体配置信息;
|
||||
* `kill`:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
@@ -40,7 +42,7 @@
|
||||
* `pause`:暂停一个容器中的所有进程;
|
||||
* `port`:查找一个 nat 到一个私有网口的公共口;
|
||||
* `ps`:列出主机上的容器;
|
||||
* `pull`:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* `pull`:从一个 Docker 的仓库服务器下拉一个镜像或仓库;
|
||||
* `push`:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* `rename`:重命名一个容器;
|
||||
* `restart`:重启一个运行中的容器;
|
||||
@@ -51,7 +53,7 @@
|
||||
* `search`:在 Docker index 中搜索一个镜像;
|
||||
* `service`:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* `start`:启动一个容器;
|
||||
* `stats`:输出(一个或多个)容器的资源使用统计信息;
|
||||
* `stats`:输出 (一个或多个) 容器的资源使用统计信息;
|
||||
* `stop`:终止一个运行中的容器;
|
||||
* `swarm`:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* `tag`:为一个镜像打标签;
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
## 服务端命令(dockerd)
|
||||
## 服务端命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 使用说明
|
||||
|
||||
`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`);
|
||||
* `-H, --host=[]`:指定 daemon 监听地址(Unix socket / TCP);
|
||||
* `--data-root=""`:Docker 数据目录 (默认 `/var/lib/docker`);
|
||||
* `-H, --host=[]`:指定 daemon 监听地址 (Unix socket / TCP);
|
||||
* `-D, --debug`:开启调试日志;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:日志级别;
|
||||
* `--group=""`:Unix socket 所属用户组(默认 `docker`);
|
||||
* `--group=""`:Unix socket 所属用户组 (默认 `docker`);
|
||||
* `--containerd=""`:指定 containerd socket;
|
||||
* `--exec-opt=[]`:运行时执行选项(如 cgroup 驱动);
|
||||
* `--exec-opt=[]`:运行时执行选项 (如 cgroup 驱动);
|
||||
* `--default-ulimit=[]`:设置容器默认 ulimit;
|
||||
* `--dns=[]` / `--dns-search=[]` / `--dns-opt=[]`:DNS 配置;
|
||||
* `--registry-mirror=[]`:镜像加速地址;
|
||||
@@ -23,7 +25,7 @@
|
||||
* `--storage-driver=""` / `--storage-opt=[]`:存储驱动及参数;
|
||||
* `--log-driver=""` / `--log-opt=[]`:容器日志驱动与参数;
|
||||
* `--authorization-plugin=[]`:鉴权插件;
|
||||
* `--selinux-enabled=true|false`:启用 SELinux 集成(依赖发行版策略);
|
||||
* `--selinux-enabled=true|false`:启用 SELinux 集成 (依赖发行版策略);
|
||||
* `--userns-remap=...`:用户命名空间映射;
|
||||
* `--tls` / `--tlscacert` / `--tlscert` / `--tlskey` / `--tlsverify`:TLS 安全配置。
|
||||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
# 附录一:常见问题总结
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
## 镜像相关
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 如何批量清理临时镜像文件?
|
||||
|
||||
答:可以使用 `docker image prune` 命令。
|
||||
@@ -23,7 +27,7 @@
|
||||
* 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
|
||||
* 从安全角度考虑,应用要尽量使用系统的库和依赖;
|
||||
* 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
|
||||
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。
|
||||
* 使用 Dockerfile 创建镜像时候要添加。dockerignore 文件或使用干净的工作目录。
|
||||
|
||||
更多内容请查看 [Dockerfile 最佳实践](../16.1_best_practices.md)
|
||||
|
||||
@@ -33,9 +37,11 @@
|
||||
|
||||
## 容器相关
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?
|
||||
|
||||
答:容器退出后会处于终止(exited)状态,此时可以通过 `docker container ls -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
答:容器退出后会处于终止 (exited) 状态,此时可以通过 `docker container ls -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
|
||||
|
||||
### 如何停止所有正在运行的容器?
|
||||
|
||||
@@ -75,7 +81,7 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
||||
|
||||
答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。
|
||||
|
||||
### 使用 `docker port` 命令映射容器的端口时,系统报错“Error: No public port '80' published for xxx”?
|
||||
### 使用 `docker port` 命令映射容器的端口时,系统报错 “Error:No public port ‘80’ published for xxx”?
|
||||
|
||||
答:
|
||||
|
||||
@@ -86,13 +92,19 @@ $ 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] 参数来调整容器使用内存的大小。
|
||||
|
||||
## 仓库相关
|
||||
|
||||
### 仓库(Repository)、注册服务器(Registry)、注册索引(Index) 有何关系?
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 仓库、注册服务器、注册索引有何关系?
|
||||
|
||||
首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。
|
||||
|
||||
@@ -100,9 +112,11 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
||||
|
||||
## 配置相关
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### Docker 的配置文件放在哪里,如何修改配置?
|
||||
|
||||
答:使用 `systemd` 的系统(如 Ubuntu 22.04+、Debian 12+、Rocky/Alma/CentOS Stream 9+)的配置文件在 `/etc/docker/daemon.json`。
|
||||
答:使用 `systemd` 的系统 (如 Ubuntu 22.04+、Debian 12+、Rocky/Alma/CentOS Stream 9+) 的配置文件在 `/etc/docker/daemon.json`。
|
||||
|
||||
### 如何更改 Docker 的默认存储位置?
|
||||
|
||||
@@ -127,31 +141,33 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
[root@s26 lib]# service docker start
|
||||
```
|
||||
|
||||
### 使用内存和 swap 限制启动容器时候报警告:"WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded."?
|
||||
### 使用内存和 swap 限制启动容器时候报警告:“WARNING:Your kernel does not support cgroup swap limit。WARNING:Your kernel does not support swap limit capabilities。Limitation discarded。”?
|
||||
|
||||
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
|
||||
|
||||
* 编辑 `/etc/default/grub` 文件(Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
|
||||
* 编辑 `/etc/default/grub` 文件 (Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
|
||||
* 更新 grub:`$ sudo update-grub`
|
||||
* 重启系统,即可。
|
||||
|
||||
## Docker 与虚拟化
|
||||
|
||||
### Docker 与 LXC(Linux Container)有何不同?
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### Docker 与 LXC 有何不同?
|
||||
|
||||
答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
|
||||
|
||||
* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
|
||||
* 镜像系统:基于 OverlayFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 版本管理:类似于 Git 的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
|
||||
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
* 周边工具:各种现有工具 (配置管理、云平台) 对 Docker 的支持,以及基于 Docker 的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
|
||||
### Docker 与 Vagrant 有何不同?
|
||||
|
||||
答:两者的定位完全不同。
|
||||
|
||||
* Vagrant 类似 Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
|
||||
* Vagrant 类似 Boot2Docker (一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
|
||||
* 原生的 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
|
||||
|
||||
简单说:Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。
|
||||
@@ -166,9 +182,11 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
|
||||
## 其它
|
||||
|
||||
### Docker 能在非 Linux 平台(比如 Windows 或 macOS )上运行么?
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
答:完全可以。安装方法请查看 [安装 Docker](../../03_install/README.md) 一节
|
||||
### Docker 能在非 Linux 平台 (比如 Windows 或 macOS) 上运行么?
|
||||
|
||||
答:完全可以。安装方法请查看[安装 Docker](../../03_install/README.md) 一节
|
||||
|
||||
### 如何将一台宿主主机的 Docker 环境迁移到另外一台宿主主机?
|
||||
|
||||
|
||||
@@ -1,27 +1,29 @@
|
||||
## [CentOS]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
||||
|
||||
> ⚠️ **重要提示**:CentOS 8 已于 2021 年 12 月 31 日停止维护(EOL),CentOS 7 也已于 2024 年 6 月 30 日**完全结束支持**。Docker Hub 上的 CentOS 官方镜像**已停止更新**且存在未修复的安全漏洞。
|
||||
> ⚠️ **重要提示**:CentOS 8 已于 2021 年 12 月 31 日停止维护 (EOL),CentOS 7 也已于 2024 年 6 月 30 日**完全结束支持**。Docker Hub 上的 CentOS 官方镜像**已停止更新**且存在未修复的安全漏洞。
|
||||
>
|
||||
> 2026 年了,对于任何新项目,**强烈建议**使用以下生产级替代方案:
|
||||
> - [Rocky Linux](https://hub.docker.com/_/rockylinux):CentOS 原创始人发起的社区驱动项目,目前主流为 Rocky Linux 9。
|
||||
> - [AlmaLinux](https://hub.docker.com/_/almalinux):由 CloudLinux 支持的企业级发行版,提供长期支持。
|
||||
> - [CentOS Stream](https://hub.docker.com/r/centos/centos):RHEL 的上游开发分支(适合开发测试,不建议用于生产环境)。
|
||||
> - [CentOS Stream](https://hub.docker.com/r/centos/centos):RHEL 的上游开发分支 (适合开发测试,不建议用于生产环境)。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/centos`,提供了 CentOS 从 5 ~ 8 各个版本的镜像(仅作为历史归档,不再更新)。
|
||||
该仓库位于 `https://hub.docker.com/_/centos`,提供了 CentOS 从 5 ~ 8 各个版本的镜像 (仅作为历史归档,不再更新)。
|
||||
|
||||
### 使用方法
|
||||
|
||||
使用 Rocky Linux 9 替代(**推荐**):
|
||||
使用 Rocky Linux 9 替代 (**推荐**):
|
||||
|
||||
```bash
|
||||
$ docker run --name rocky -it rockylinux:9 bash
|
||||
```
|
||||
|
||||
使用旧版 CentOS 7(**仅用于维护旧项目,不推荐**):
|
||||
使用旧版 CentOS 7 (**仅用于维护旧项目,不推荐**):
|
||||
|
||||
```bash
|
||||
$ docker run --name centos -it centos:7 bash
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**MinIO** 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
|
||||
|
||||
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
|
||||
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS,Redis 或者 MySQL。
|
||||
|
||||
[官方文档](https://docs.min.io/)
|
||||
|
||||
@@ -20,13 +20,13 @@ $ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-add
|
||||
|
||||
#### 导出镜像
|
||||
|
||||
在有公网资源的服务器上下载好`minio/minio`镜像
|
||||
在有公网资源的服务器上下载好 `minio/minio` 镜像
|
||||
|
||||
```bash
|
||||
$ docker save -o minio.tar minio/minio:latest
|
||||
```
|
||||
|
||||
> 使用docker save 的时候,也可以使用image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag来导出镜像
|
||||
> 使用 docker save 的时候,也可以使用 image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag 来导出镜像
|
||||
|
||||
#### 导入镜像
|
||||
|
||||
@@ -41,8 +41,8 @@ $ docker load -i minio.tar
|
||||
- 把 `/mnt/data` 改成要替换的数据目录
|
||||
- 替换 `MINIO_ROOT_USER` 的值
|
||||
- 替换 `MINIO_ROOT_PASSWORD` 的值
|
||||
- 替换 name,minio1(可选)
|
||||
- 如果 9000、9090 端口冲突,替换端口前面的如 `9009:9000`
|
||||
- 替换 name,minio1 (可选)
|
||||
- 如果 9000、9090 端口冲突,替换端口前面的如 `9009:9000`
|
||||
|
||||
```bash
|
||||
$ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [MongoDB]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [MySQL]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [Nginx]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
|
||||
@@ -34,7 +36,7 @@ $ docker run --name some-nginx -d some-content-nginx
|
||||
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
|
||||
```
|
||||
|
||||
Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
|
||||
Nginx 的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [Node.js]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
## [PHP]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[PHP](https://en.wikipedia.org/wiki/Php)(Hypertext Preprocessor 超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
[PHP](https://en.wikipedia.org/wiki/Php) (Hypertext Preprocessor 超文本预处理器的字母缩写) 是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/php/`。具体可用版本以 Docker Hub 上的 tags 列表为准。
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [Redis]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
||||
@@ -14,7 +16,7 @@
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis
|
||||
```
|
||||
|
||||
另外还可以启用 [持久存储](https://redis.io/topics/persistence)。
|
||||
另外还可以启用[持久存储](https://redis.io/topics/persistence)。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly yes
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [Ubuntu]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## [WordPress]
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本信息
|
||||
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PHP 和 MySQL。
|
||||
@@ -27,10 +29,10 @@ $ docker run --name some-wordpress -d --network my-wordpress-net -e WORDPRESS_DB
|
||||
|
||||
启动 WordPress 容器时可以指定的一些环境变量包括:
|
||||
|
||||
* `WORDPRESS_DB_HOST`: MySQL 服务的主机名
|
||||
* `WORDPRESS_DB_USER`: MySQL 数据库的用户名
|
||||
* `WORDPRESS_DB_PASSWORD`: MySQL 数据库的密码
|
||||
* `WORDPRESS_DB_NAME`: WordPress 要使用的数据库名
|
||||
* `WORDPRESS_DB_HOST`:MySQL 服务的主机名
|
||||
* `WORDPRESS_DB_USER`:MySQL 数据库的用户名
|
||||
* `WORDPRESS_DB_PASSWORD`:MySQL 数据库的密码
|
||||
* `WORDPRESS_DB_NAME`:WordPress 要使用的数据库名
|
||||
|
||||
|
||||
### Dockerfile
|
||||
|
||||
Reference in New Issue
Block a user