数据、网络与 Registry
容器默认文件系统是可写但易失的:删容器,未挂卷的数据就没了。多容器怎么互相找到对方、镜像怎么推到仓库,是联调与上线的另一半。Compose 用法见 Compose 与本地联调。
Volume 直觉
| 类型 | 一句话 | 常见场景 |
|---|---|---|
| Volume(命名卷) | Docker 管理的持久存储 | 数据库数据目录 |
| Bind mount | 挂主机某个目录进容器 | 开发时挂源码 |
| 不挂卷 | 数据在容器可写层 | 临时文件;容器删则丢 |
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
开发挂源码示例(直觉即可):
volumes:
- ./src:/app/src
不要把生产数据库目录随手 bind 到笔记本任意路径却不备份;命名卷更适合「容器生命周期外还要留着」的数据。
网络基础
- Compose 项目默认创建 bridge 网络,同文件内 服务名可互解析
docker run -p 8080:80:主机8080→ 容器内80- 容器对外暴露的是容器端口;主机端口只是映射
docker run --rm -p 8080:80 nginx:1.27-alpine
# 浏览器访问本机 http://localhost:8080
多机 / 集群入口(Ingress、Service)见 K8s 网络篇;本机 Compose 先掌握服务名与 -p。
Registry:推拉与标签
docker pull postgres:16
docker tag my-app:dev ghcr.io/<org>/my-app:1.2.3
docker push ghcr.io/<org>/my-app:1.2.3
| 概念 | 注意 |
|---|---|
| 标签(tag) | 可变指针;生产应用不可变标签(如 git sha / semver),慎用 latest 当唯一依据 |
| 私有仓 | 需 docker login;CI 用机器人账号 / OIDC(以团队为准) |
| 拉不到镜像 | 先看标签是否存在、是否登录、基础镜像是否被墙或限流 |
CI 典型链路:build → tag → push → 部署侧按同一标签拉取。
要点
- 要持久就挂 Volume;开发热更新才用 bind
- Compose 内用服务名;对本机用
-p映射 - 推送前打清标签;生产以不可变标签为准
- 私有仓先解决认证,再查网络
面试速记
- Volume 和 bind mount 区别? Volume 由 Docker 管理,适合持久数据;bind 挂主机路径,适合开发挂源码。
- 容器删了数据还在吗? 未挂卷则通常不在;挂了命名卷则卷里还在。
-p 8080:80哪个是容器端口? 右边80是容器端口,左边是主机端口。- 为什么生产慎用
latest? 标签可变,难以回溯「当时跑的是哪一版」。 - 镜像如何到别的机器?
push到 Registry,目标环境pull同名标签。