10.2.2 部署到底要填什么——配置要素:镜像/启动命令/端口/卷/环境变量
Docker 配置看起来复杂,其实就五个核心要素。
五大核心配置要素
1. 镜像(Image)
镜像是容器的"安装包",包含了运行应用所需的一切:代码、运行时、库、配置文件。
镜像命名规则
[仓库地址/]镜像名[:标签]| 示例 | 说明 |
|---|---|
node:18 | Docker Hub 官方 Node.js 18 |
node:18-alpine | 轻量版,体积更小 |
postgres:15 | PostgreSQL 15 |
my-app:v1.0.0 | 自定义应用指定版本 |
镜像选择建议
| 场景 | 推荐镜像 | 理由 |
|---|---|---|
| Node.js 应用 | node:18-alpine | 体积小(~120MB vs ~1GB) |
| Python 应用 | python:3.11-slim | 精简版,够用 |
| 生产数据库 | postgres:15 | 稳定版本 |
2. 端口映射(Port Mapping)
端口映射让外部能够访问容器内的服务。
格式说明
宿主机端口:容器端口| 配置 | 含义 |
|---|---|
3000:3000 | 用 3000 访问容器的 3000 端口 |
8080:3000 | 用 8080 访问容器的 3000 端口 |
127.0.0.1:3000:3000 | 只允许本机访问 |
常见端口规划
| 服务 | 容器端口 | 建议宿主机端口 |
|---|---|---|
| Next.js | 3000 | 3000 |
| NestJS | 3001 | 3001 |
| PostgreSQL | 5432 | 5432 |
| Redis | 6379 | 6379 |
| Nginx | 80/443 | 80/443 |
端口冲突
同一宿主机端口只能被一个容器占用。如果端口已被占用,需要修改映射端口。
3. 卷挂载(Volume Mount)
容器删除后,里面的数据默认会丢失。卷挂载将数据保存到宿主机。
格式说明
宿主机路径:容器路径[:权限]| 配置 | 含义 |
|---|---|
/data/postgres:/var/lib/postgresql/data | 数据库文件持久化 |
/app/logs:/app/logs | 日志文件持久化 |
/config:/app/config:ro | 只读挂载配置文件 |
必须挂载的数据
| 服务 | 容器路径 | 数据类型 |
|---|---|---|
| PostgreSQL | /var/lib/postgresql/data | 数据库文件 |
| MySQL | /var/lib/mysql | 数据库文件 |
| Redis | /data | 持久化数据 |
| 应用 | /app/uploads | 用户上传文件 |
| 应用 | /app/logs | 日志文件 |
4. 环境变量(Environment Variables)
环境变量是传递配置给应用的标准方式,比硬编码更安全、更灵活。
常用环境变量
| 变量名 | 作用 | 示例值 |
|---|---|---|
NODE_ENV | 运行环境 | production |
DATABASE_URL | 数据库连接串 | postgresql://user:pass@host:5432/db |
REDIS_URL | Redis 连接串 | redis://localhost:6379 |
JWT_SECRET | JWT 密钥 | your-secret-key |
PORT | 应用监听端口 | 3000 |
环境变量安全实践
安全警告
绝对不要在代码仓库中提交真实的数据库密码、API 密钥等敏感信息!
5. 启动命令(Command)
启动命令决定容器启动后执行什么操作。
常见启动命令
| 应用类型 | 启动命令 |
|---|---|
| Next.js 生产 | npm run start 或 node server.js |
| NestJS 生产 | node dist/main.js |
| 开发调试 | npm run dev(不推荐生产使用) |
Dockerfile 中的 CMD vs ENTRYPOINT
| 指令 | 特点 |
|---|---|
CMD | 可被运行时命令覆盖 |
ENTRYPOINT | 固定执行,运行时参数追加 |
完整配置示例
以 Next.js 应用为例:
yaml
# docker-compose.yml 等效配置
services:
nextjs:
image: node:18-alpine
container_name: my-nextjs-app
ports:
- "3000:3000"
volumes:
- ./app:/app
- /app/node_modules # 排除 node_modules
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@postgres:5432/mydb
command: npm run start
restart: always对应 1Panel 配置:
| 配置项 | 值 |
|---|---|
| 镜像 | node:18-alpine |
| 容器名 | my-nextjs-app |
| 端口 | 3000:3000 |
| 挂载 | ./app:/app |
| 环境变量 | NODE_ENV=production |
| 命令 | npm run start |
| 重启策略 | always |
配置验证清单
部署前检查:
- [ ] 镜像版本是否正确
- [ ] 端口是否冲突
- [ ] 数据目录是否挂载
- [ ] 敏感信息是否使用环境变量
- [ ] 重启策略是否设置为 always
