跳到主要内容

数据、网络与 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 → 部署侧按同一标签拉取。

要点​

  1. 要持久就挂 Volume;开发热更新才用 bind
  2. Compose 内用服务名;对本机用 -p 映射
  3. 推送前打清标签;生产以不可变标签为准
  4. 私有仓先解决认证,再查网络

面试速记​

  1. Volume 和 bind mount 区别? Volume 由 Docker 管理,适合持久数据;bind 挂主机路径,适合开发挂源码。
  2. 容器删了数据还在吗? 未挂卷则通常不在;挂了命名卷则卷里还在。
  3. -p 8080:80 哪个是容器端口? 右边 80 是容器端口,左边是主机端口。
  4. 为什么生产慎用 latest? 标签可变,难以回溯「当时跑的是哪一版」。
  5. 镜像如何到别的机器? push 到 Registry,目标环境 pull 同名标签。