Remove blank lines after code block markers

This commit is contained in:
yeasy
2026-03-21 22:36:09 -07:00
parent 312f8fea42
commit 9ac19d79ee
132 changed files with 0 additions and 1517 deletions

View File

@@ -44,7 +44,6 @@ RUN apt-get update && apt-get install -y \
mercurial \
subversion
```
#### 构建缓存
在镜像的构建过程中Docker 会遍历 `Dockerfile` 文件中的指令然后按顺序执行在执行每条指令之前Docker 都会在缓存中查找是否已经存在可重用的镜像如果有就使用现存的镜像不再重复创建如果你不想在构建过程中使用缓存你可以在 `docker build` 命令中使用 `--no-cache=true` 选项
@@ -73,7 +72,6 @@ RUN apt-get update && apt-get install -y \
> 注意如果你的字符串中包含空格必须将字符串放入引号中或者对空格使用转义如果字符串内容本身就包含引号必须对引号使用转义
```docker
## Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
@@ -84,11 +82,9 @@ LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
```
一个镜像可以包含多个标签但建议将多个标签放入到一个 `LABEL` 指令中
```docker
## Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
@@ -97,7 +93,6 @@ LABEL vendor=ACME\ Incorporated \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
```
关于标签可以接受的键值对参考 [Understanding object labels](https://docs.docker.com/config/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/config/labels-custom-metadata/)。
#### RUN
@@ -118,7 +113,6 @@ RUN apt-get update && apt-get install -y \
package-baz \
package-foo
```
`apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败比如假设你有一个 `Dockerfile` 文件
```docker
@@ -128,7 +122,6 @@ RUN apt-get update
RUN apt-get install -y curl
```
构建镜像后所有的层都在 Docker 的缓存中假设你后来又修改了其中的 `apt-get install` 添加了一个包
```docker
@@ -138,7 +131,6 @@ RUN apt-get update
RUN apt-get install -y curl nginx
```
Docker 发现修改后的 `RUN apt-get update` 指令和之前的完全一样所以`apt-get update` 不会执行而是使用之前的缓存镜像因为 `apt-get update` 没有运行后面的 `apt-get install` 可能安装的是过时的 `curl` `nginx` 版本
使用 `RUN apt-get update && apt-get install -y` 可以确保你的 Dockerfiles 每次安装的都是包的最新的版本而且这个过程不需要进一步的编码或额外干预这项技术叫作 `cache busting`你也可以显示指定一个包的版本号来达到 `cache-busting`这就是所谓的固定版本例如
@@ -149,7 +141,6 @@ RUN apt-get update && apt-get install -y \
package-baz \
package-foo=1.3.*
```
固定版本会迫使构建过程检索特定的版本而不管缓存中有什么这项技术也可以减少因所需包中未预料到的变化而导致的失败
下面是一个 `RUN` 指令的示例模板展示了所有关于 `apt-get` 的建议
@@ -167,7 +158,6 @@ RUN apt-get update && apt-get install -y \
redis-server \
&& rm -rf /var/lib/apt/lists/*
```
其中 `redis-server` 是示例包确保安装的是最新版本
另外清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小因为 `RUN` 指令的开头为 `apt-get update`包缓存总是会在 `apt-get install` 之前刷新
@@ -203,7 +193,6 @@ RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
```
类似于程序中的常量这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本
#### ADD COPY
@@ -219,7 +208,6 @@ RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
```
如果将 `COPY . /tmp/` 放置在 `RUN` 指令之前只要 `.` 目录中任何一个文件变化都会导致后续指令的缓存失效
为了让镜像尽量小最好不要使用 `ADD` 指令从远程 URL 获取包而是使用 `curl` `wget`这样你可以在文件提取完之后删掉不再需要的文件来避免在镜像中额外添加一层比如尽量避免下面的用法
@@ -231,7 +219,6 @@ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
```
而是应该使用下面这种方法
```docker
@@ -240,7 +227,6 @@ RUN mkdir -p /usr/src/things \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
```
上面使用的管道操作所以没有中间文件需要删除
对于其他不需要 `ADD` 的自动提取功能的文件或目录你应该使用 `COPY`
@@ -256,19 +242,16 @@ ENTRYPOINT ["s3cmd"]
CMD ["--help"]
```
现在直接运行该镜像创建的容器会显示命令帮助
```bash
$ docker run s3cmd
```
或者提供正确的参数来执行某个命令
```bash
$ docker run s3cmd ls s3://mybucket
```
这样镜像名可以当成命令行的参考
`ENTRYPOINT` 指令也可以结合一个辅助脚本使用和前面命令行风格类似即使启动工具需要不止一个步骤
@@ -291,7 +274,6 @@ fi
exec "$@"
```
> 注意该脚本使用了 Bash 的内置命令 exec所以最后运行的进程就是容器的 PID 1 的进程这样进程就可以接收到任何发送给容器的 Unix 信号了
该辅助脚本被拷贝到容器并在容器启动时通过 `ENTRYPOINT` 执行
@@ -301,7 +283,6 @@ COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
```
该脚本可以让用户用几种不同的方式和 `Postgres` 交互
你可以很简单地启动 `Postgres`
@@ -309,19 +290,16 @@ ENTRYPOINT ["/docker-entrypoint.sh"]
```bash
$ docker run postgres
```
也可以执行 `Postgres` 并传递参数
```bash
$ docker run postgres postgres --help
```
最后你还可以启动另外一个完全不同的工具比如 `Bash`
```bash
$ docker run --rm -it postgres bash
```
#### VOLUME
`VOLUME` 指令用于暴露任何数据库存储文件配置文件或容器创建的文件和目录强烈建议使用 `VOLUME` 来管理镜像中的可变部分和用户可以改变的部分

View File

@@ -9,13 +9,11 @@
"debug": true
}
```
重启守护进程
```bash
$ sudo kill -SIGHUP $(pidof dockerd)
```
此时 dockerd 会在日志中输入更多信息供分析
### 检查内核日志
@@ -24,7 +22,6 @@ $ sudo kill -SIGHUP $(pidof dockerd)
$ sudo dmesg |grep dockerd
$ sudo dmesg |grep runc
```
### Docker 不响应时处理
可以杀死 dockerd 进程查看其堆栈调用情况
@@ -32,7 +29,6 @@ $ sudo dmesg |grep runc
```bash
$ sudo kill -SIGUSR1 $(pidof dockerd)
```
### 重置 Docker 本地数据
*注意本操作会移除所有的 Docker 本地数据包括镜像和容器等*
@@ -42,13 +38,11 @@ $ sudo kill -SIGUSR1 $(pidof dockerd)
```bash
$ docker system prune
```
如果你只是想 恢复出厂设置 Docker Desktop 里也提供了相应入口
```bash
$ sudo rm -rf /var/lib/docker
```
### 常见故障排查
#### 容器启动失败

View File

@@ -52,7 +52,6 @@
```bash
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
```
### 如何获取某个容器的 IP 地址
可以使用
@@ -60,7 +59,6 @@ docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
```bash
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
```
### 如何给容器指定一个固定 IP 地址而不是每次重启容器 IP 地址都会变
使用以下命令启动容器可以使容器 IP 固定不变
@@ -70,7 +68,6 @@ $ docker network create -d bridge --subnet 172.25.0.0/16 my-net
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
```
### 如何临时退出一个正在交互的容器的终端而不终止它
`Ctrl-p Ctrl-q`如果按 `Ctrl-c` 往往会让容器内应用进程终止进而会终止容器
@@ -126,7 +123,6 @@ tmpfs 48G 228K 48G 1% /dev/shm
lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
[root@s26 lib]# service docker start
```
### 使用内存和 swap 限制启动容器时候报警告WARNINGYour kernel does not support cgroup swap limitWARNINGYour kernel does not support swap limit capabilitiesLimitation discarded
这是因为系统默认没有开启对内存和 swap 使用的统计功能引入该功能会带来性能的下降要开启该功能可以采取如下操作
@@ -186,26 +182,22 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
$ docker inspect --format='{{. State.Pid}} ' $container_id
1234
```
接下来 `/proc` 目录下把对应的网络命名空间文件链接到 `/var/run/netns` 目录
```bash
$ sudo ln -s /proc/1234/ns/net /var/run/netns/
```
然后在宿主主机上就可以看到容器的网络命名空间信息例如
```bash
$ sudo ip netns show
1234
```
此时用户可以通过正常的系统命令来查看或操作容器的命名空间了例如修改容器的 IP 地址信息为 `172.17.0.100/16`
```bash
$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16
```
### 如何获取容器绑定到本地那个 veth 接口上
Docker 容器启动后会通过 veth 接口对连接到本地网桥veth 接口命名跟容器命名毫无关系十分难以找到对应关系

View File

@@ -35,7 +35,6 @@ Docker 安装配置
├── 镜像加速器配置
└── 权限和用户配置
```
**学习资源**
- [官方教程](https://docs.docker.com/get-started/)
- 本书第 1-3 入门篇基础概念
@@ -48,14 +47,12 @@ Docker 安装配置
**验证学习成果**
```bash
# 完成以下任务说明基础入门完成
1. 运行官方 nginx 镜像,访问 http://localhost
2. 使用 docker exec 进入容器修改首页
3. 提交修改为新镜像
4. 推送镜像到 Docker Hub需创建账户
```
#### 第二阶段核心开发2-6
**学习目标**
@@ -111,7 +108,6 @@ Docker Compose
├── exec / run
└── build / push
```
**学习资源**
- 本书第 4-11 进阶篇
- [Docker 官方最佳实践](https://docs.docker.com/develop/dev-best-practices/)
@@ -139,7 +135,6 @@ Docker Compose
- 数据持久化
- 备份恢复策略
```
#### 第三阶段生产优化6-12
**学习目标**
@@ -220,7 +215,6 @@ CI/CD 集成
├── Buildah镜像构建
└── Kollabot
```
**学习资源**
- 本书第 12-21 深入篇和实战篇
- [Kubernetes 官方文档](https://kubernetes.io/docs/)
@@ -254,7 +248,6 @@ CI/CD 集成
- 部署有状态应用
- 配置持久化存储
```
#### 第四阶段专家深造12+
**学习目标**
@@ -321,7 +314,6 @@ DevOps 工程化
├── 代码审查
└── 文档和最佳实践传播
```
**贡献机会**
- [Kubernetes](https://github.com/kubernetes/kubernetes)
- [Cilium](https://github.com/cilium/cilium)
@@ -384,7 +376,6 @@ Kubernetes 进阶 (Week 24-36)
├── 成本优化
└── 开源贡献
```
### 推荐学习资源
#### 官方文档
@@ -466,10 +457,8 @@ Kubernetes 进阶 (Week 24-36)
- Logging drivers
- 事件处理
```
准备建议
```bash
# 1. 学习本书第 1-11 章(基础到中级)
# 2. 完成 20+ 个实战项目
# 3. 参考官方学习指南
@@ -486,7 +475,6 @@ docker volume / network / service
docker compose up / down / logs / ps
docker stats / events / inspect
```
#### Kubernetes 认证
**认证路径**
@@ -530,7 +518,6 @@ A要点
总结:容器更轻量、更快、密度更高
```
**Q2: 什么是 Docker 镜像它如何存储的**
A要点
@@ -550,7 +537,6 @@ A要点
- 层级缓存加快构建
- 支持高效分发
```
**Q3: 容器如何实现隔离**
A要点
@@ -575,7 +561,6 @@ A要点
4. SELinux / AppArmor强制访问控制
```
#### Dockerfile 面试题
**Q4: 如何优化 Docker 镜像大小**
@@ -608,7 +593,6 @@ A要点
7. 压缩资源:
gzip 静态文件,压缩图片
```
**Q5: CMD ENTRYPOINT 有什么区别**
A要点
@@ -630,7 +614,6 @@ CMD ["--port", "8000"]
# 运行 docker run image --debug 会执行:
# python app.py --debug
```
#### 网络和存储面试题
**Q6: Docker 网络驱动的区别**
@@ -660,7 +643,6 @@ macvlan
None
- 无网络,完全隔离
```
**Q7: Volume Bind Mount 有什么区别**
A要点
@@ -682,7 +664,6 @@ tmpfs
- 用于临时文件、敏感数据
- 性能最好,重启丢失
```
#### 安全和生产面试题
**Q8: 如何提高 Docker 安全性**
@@ -712,7 +693,6 @@ A要点
- 配置网络策略
- 限制出入站流量
```
**Q9: 容器被 OOM 杀死如何诊断和解决**
A要点
@@ -744,7 +724,6 @@ A要点
4. 使用内存交换(最后手段):
docker run -m 512m --memory-swap 1g
```
**Q10: 如何在 CI/CD 中集成 Docker**
A要点
@@ -779,11 +758,9 @@ A要点
5. 触发 ArgoCD / Flux 自动部署
6. 监控部署状态
```
### 学习进度跟踪模板
```markdown
# Docker 学习进度跟踪
## 第一阶段基础入门目标2 周)
@@ -828,13 +805,11 @@ A要点
- [ ] 监控和日志系统
- [ ] CI/CD 流程实现
```
### 快速参考速查表
**常用命令速查**
```bash
# 镜像管理
docker build -t image:tag . # 构建镜像
docker images # 列出镜像

View File

@@ -20,13 +20,11 @@
```bash
$ docker run --name rocky -it rockylinux:9 bash
```
使用旧版 CentOS 7 (**仅用于维护旧项目不推荐**)
```bash
$ docker run --name centos -it centos:7 bash
```
### Dockerfile
请到 [CentOS 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/centos) 查看。

View File

@@ -13,7 +13,6 @@ MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结
```bash
$ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-address ':9090'
```
### 离线部署
许多生产环境是一般是没有公网资源的这就需要从有公网资源的服务器上把镜像导出然后导入到需要运行镜像的内网服务器
@@ -25,7 +24,6 @@ $ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-add
```bash
$ docker save -o minio.tar minio/minio:latest
```
> 使用 docker save 的时候也可以使用 image id 来导出但是那样导出的时候就会丢失原来的镜像名称推荐还是使用镜像名字+tag 来导出镜像
#### 导入镜像
@@ -35,7 +33,6 @@ $ docker save -o minio.tar minio/minio:latest
```bash
$ docker load -i minio.tar
```
#### 运行 minio
- `/mnt/data` 改成要替换的数据目录
@@ -52,7 +49,6 @@ $ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
--restart=always \
minio/minio server /data --console-address ':9090'
```
#### 访问 web 管理页面
打开 `http://<server-ip>:9090` 访问 Web 控制台

View File

@@ -13,22 +13,18 @@
```bash
$ docker run --name mongo -d mongo
```
使用其他应用连接到容器首先创建网络
```bash
$ docker network create my-mongo-net
```
然后启动 MongoDB 容器
```bash
$ docker run --name some-mongo -d --network my-mongo-net mongo
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-mongo-net application-that-uses-mongo
```
或者通过 `mongo`
```bash
@@ -37,7 +33,6 @@ $ docker run -it --rm \
mongo \
sh -c 'exec mongo "some-mongo:27017/test"'
```
### Dockerfile
请到 [Mongo 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/mongo) 查看。

View File

@@ -13,24 +13,20 @@
```bash
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
```
之后就可以使用其它应用来连接到该容器
首先创建网络
```bash
$ docker network create my-mysql-net
```
然后启动 MySQL 容器
```bash
$ docker run --name some-mysql -d --network my-mysql-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-mysql-net application-that-uses-mysql
```
或者通过 `mysql` 命令行连接
```bash
@@ -40,7 +36,6 @@ $ docker run -it --rm \
sh -c 'exec mysql -hsome-mysql -P3306 -uroot -pmysecretpassword'
```
### Dockerfile
请到 [MySQL 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/mysql) 查看。

View File

@@ -13,27 +13,23 @@
```bash
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
用户也可以不使用这种映射方式通过利用 Dockerfile 来直接将静态页面内容放到镜像中内容为
```docker
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```
之后生成新的镜像并启动一个容器
```bash
$ docker build -t some-content-nginx .
$ docker run --name some-nginx -d some-content-nginx
```
开放端口并映射到本地的 `8080` 端口
```bash
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
Nginx 的默认配置文件路径为 `/etc/nginx/nginx.conf`可以通过映射它来使用本地的配置文件例如
```bash
@@ -43,7 +39,6 @@ $ docker run -d \
-v /path/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx
```
### Dockerfile
请到 [Nginx 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/nginx) 查看。

View File

@@ -17,14 +17,12 @@ FROM node:20
EXPOSE 8888
```
然后创建镜像并启动容器
```bash
$ docker build -t my-nodejs-app
$ docker run -it --rm --name my-running-app my-nodejs-app
```
也可以直接运行一个简单容器
```bash
@@ -37,7 +35,6 @@ $ docker run -it --rm \
node:20-alpine \
node your-daemon-or-script.js
```
### Dockerfile
请到 [Node 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/node) 查看。

View File

@@ -13,7 +13,6 @@
```bash
$ docker run -it --rm -v "$PWD":/app -w /app php:alpine php your-script.php
```
### Dockerfile
请到 [PHP 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/php) 查看。

View File

@@ -13,30 +13,25 @@
```bash
$ docker run --name some-redis -d -p 6379:6379 redis
```
另外还可以启用[持久存储](https://redis.io/topics/persistence)。
```bash
$ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly yes
```
默认数据存储位置在 `VOLUME/data`可以使用 `--volumes-from some-volume-container` `-v /docker/host/dir:/data` 将数据存放到本地
使用其他应用连接到容器首先创建网络
```bash
$ docker network create my-redis-net
```
然后启动 redis 容器
```bash
$ docker run --name some-redis -d --network my-redis-net redis
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-redis-net application-that-uses-redis
```
或者通过 `redis-cli`
```bash
@@ -45,7 +40,6 @@ $ docker run -it --rm \
redis \
sh -c 'exec redis-cli -h some-redis'
```
### Dockerfile
请到 [Redis 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/redis) 查看。

View File

@@ -14,7 +14,6 @@
$ docker run --name some-ubuntu -it ubuntu:20.04
root@523c70904d54:/#
```
### Dockerfile
请到 [Ubuntu 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/ubuntu) 查看。

View File

@@ -14,17 +14,14 @@
```bash
$ docker network create my-wordpress-net
```
启动 MySQL 容器
```bash
$ docker run --name some-mysql -d --network my-wordpress-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
```
启动 WordPress 容器
```bash
$ docker run --name some-wordpress -d --network my-wordpress-net -e WORDPRESS_DB_HOST=some-mysql -e WORDPRESS_DB_PASSWORD=mysecretpassword wordpress
```
启动 WordPress 容器时可以指定的一些环境变量包括
* `WORDPRESS_DB_HOST`MySQL 服务的主机名