mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-09-10 07:08:17 +00:00
跑不起来的五处:
- 11.5:604 的 Compose 示例里 `db:` 顶在第 0 列,是**顶级键而不是服务**。
实测 yaml 解析结果是 `{'services': None, 'db': {...}}`,`docker compose up`
直接报错。同文件其他服务示例都缩进正确。
- 10.3 的 `docker manifest create` 把 `--amend` 当成每个 manifest 的前缀写了
两遍。upstream `docker/cli` 里它是 `BoolVarP(&opts.amend, "amend", "a", ...)`,
不取值;用法是 `create MANIFEST_LIST MANIFEST [MANIFEST...]`。照抄不仅参数
错位,还会打开"修改已有列表"的语义。改为直接跟位置参数。
- 21.7:288 `apk add postgresql-contrib pg-stat-monitor`。核对 Alpine v3.23 的
APKINDEX(427828 行,直接解包官方索引):这两个包名都**不存在**,Alpine 只
提供带主版本号的 `postgresql16-contrib` 等;`apk add` 遇到未知包会中止,
该 Dockerfile 卡在第二步。改为 postgresql16-contrib 并去掉 pg-stat-monitor,
同时注明原因。
- 19.3:528 用 `pip install --user` 装到 `/root/.local`,运行阶段却 `USER nobody`。
Debian 的 `/root` 是 0700,nobody 无法进入,容器起来就找不到依赖。改为装到
`/opt/pydeps`(PYTHONUSERBASE)并同步 COPY 与 PATH。
- 11.8:202 的 `WORDPRESS_REDIS_HOST` 不被官方镜像识别——`wp-config-docker.php`
只映射固定的一组 WORDPRESS_* 变量,其中没有 Redis 项;Redis Object Cache
插件读的是 PHP 常量 `WP_REDIS_HOST`。改为经 `WORDPRESS_CONFIG_EXTRA` 注入。
违反本书自己规则的四处:
- 全书 21 处 `FROM ... as`(13 处在正文、8 处在 Dockerfile)用小写 as,会被
`docker buildx build --check` 的 FromAsCasing 报
`'as' and 'FROM' keywords' casing do not match`——而本书正是拿 `--check`
当准绳(7.6:16、10.2:23),且自己另有 12 处已经写成大写 AS。统一为 AS,
并把 7.17:174 那句"可以使用 `as` 来为某一阶段命名"一并改掉并附上检查项链接。
- 6.3:137 建议"可替换为 `httpd:latest`",而同文件 22 行之后就写着"不要使用
`latest`,以保证部署的可重复性"。删去该建议。
- 7.6:253 写"多个 ENV 会创建多层",而 4.5:5 明确区分过:只改元数据的指令
不新增文件系统层。ENV 正属于后者。改为"多出几条构建历史记录"。
核验方式的一点说明:查 Alpine 包是否存在时,我先用网页搜索接口做了一遍,
结果四个包名全部"命中"(包括本不该存在的那个)——那个页面会把查询词回显。
改用官方 APKINDEX 解包比对后才得到可信结论,两种方法交叉确认后才动手。
第六章 访问仓库
仓库 (Repository) 是集中存放镜像的地方。
一个容易混淆的概念是注册服务器 (Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。
大部分时候,并不需要严格区分这两者的概念。
版本号说明
本章涉及的 Registry 和相关工具版本说明:
- Docker Registry / CNCF Distribution:本章示例使用
registry:2兼容路径;新生产部署应评估 Distribution 3.x,并核对配置路径、迁移说明和生态兼容性。已停止维护的registry:1不建议使用 - Nexus 3:建议指定具体版本(如
sonatype/nexus3:3.69)而非latest,避免自动升级带来的兼容性问题 - 镜像标签规范:
- 生产环境推送至仓库时应明确指定版本号(如
myapp:v1.0.0) - 避免依赖
latest标签,因为其含义存在歧义且易导致版本混淆
- 生产环境推送至仓库时应明确指定版本号(如
为什么需要私有仓库?
在讨论具体的安装和配置前,让我们先理解:什么时候你应该建设私有仓库?
开发团队(有专利代码、不能公开):
- 需要私有仓库存储内部镜像
- 涉及访问控制和审计
- 强烈推荐使用托管方案(如 Harbor 或云厂商提供的镜像仓库)
开源项目或个人学习:
- Docker Hub 公开仓库足够
- 无需自建私有仓库的成本
企业级部署:
- 需要高可用、备份、灾难恢复
- 推荐使用专业级方案(Nexus 3、Harbor)而非简单的 Registry
本章涵盖的方案从简到复杂:
- Docker Registry:最小化部署(适合简单场景)
- 私有仓库高级配置:添加认证、HTTPS 等生产必需项
- Nexus 3:企业级完整解决方案,支持权限管理、备份等