Docker 容器、网络与数据持久化实战
结合个人博客部署讲清容器生命周期、日志、服务名访问、端口暴露原则和 MySQL 数据卷。
知识目录Docker 从入门到生产部署4 / 14
动手前先知道
这篇文章对应的真实任务是:结合个人博客部署讲清容器生命周期、日志、服务名访问、端口暴露原则和 MySQL 数据卷。
第一次阅读先弄清“为什么需要这一步、它改变了哪个运行对象、失败时去哪里检查”,再执行命令。命令可以查,运行模型和排障路径才是长期能力。
容器、网络和数据卷是 Docker 真正运行时最重要的三件事。镜像构建成功只是第一步,服务能不能稳定运行,主要看这三个地方有没有设计清楚。
容器生命周期
常用命令:
docker ps
docker ps -a
docker stop <container>
docker start <container>
docker restart <container>
docker rm <container>
docker ps 只看正在运行的容器;docker ps -a 可以看到已经退出的容器。
如果服务访问不了,第一眼先看:
docker ps
确认容器是不是还活着。
看日志定位问题
容器启动失败时,不要先猜,先看日志:
docker logs <container>
持续追踪日志:
docker logs -f <container>
只看最近 100 行:
docker logs --tail=100 <container>
个人项目排障顺序建议是:
容器是否运行
↓
日志有没有报错
↓
端口有没有映射
↓
容器之间网络是否能通
↓
环境变量是否正确
容器网络
Compose 默认会给项目创建一个内部网络。同一个 Compose 项目里的服务可以直接用服务名互相访问。
例如:
services:
api:
depends_on:
- mysql
mysql:
image: mysql:8
后端连接数据库时,主机名可以写:
mysql
而不是 127.0.0.1。
这是很多初学部署的人最容易踩的坑:容器里的 127.0.0.1 指的是容器自己,不是宿主机,也不是另一个容器。
端口暴露原则
生产环境建议:
- Nginx 暴露 80/443。
- 前端容器只在内部网络开放。
- 后端容器只在内部网络开放。
- MySQL 不映射公网端口。
- Redis 不映射公网端口。
也就是说,外部用户只应该通过 Nginx 进入系统。
数据卷
数据卷用于保存容器重建后仍要保留的数据。
MySQL 示例:
services:
mysql:
image: mysql:8
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
这样容器删除重建后,只要数据卷还在,数据库数据就还在。
绑定目录和数据卷怎么选
绑定目录适合:
- Nginx 配置文件。
- 证书文件。
- 需要人工查看的日志目录。
Docker volume 适合:
- MySQL 数据。
- Redis 数据。
- 不需要直接人工编辑的持久化数据。
个人项目为了可控,Nginx 配置和证书可以用宿主机目录挂载,数据库用 Docker volume。
小艾知行录建议结构
nginx
├─ 对外暴露 80/443
├─ 转发页面到 web
└─ 转发 API 到 api
web
└─ 只在 Docker 内网被 nginx 访问
api
├─ 只在 Docker 内网被 nginx 访问
├─ 连接 MySQL
└─ 连接 COS / AI 服务
mysql
└─ 使用 volume 保存数据,不暴露公网
这个结构清楚、稳定,也适合一个人维护。
有哪里没看懂?可以只问这篇。
Jarvis 会限定在《Docker 容器、网络与数据持久化实战》及其公开关联内容中检索,并把引用定位回原文章节。