为什么用 Docker
- "在我电脑上能跑"问题消失——镜像里啥都打包好
- 部署 =
docker compose up,不再装 Python / Node / Postgres - 隔离:不同服务环境不打架
- 版本回滚一行
装 Docker(Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # 让当前用户能直接跑 docker
# 重新登录 SSH 让 group 生效
测试:docker run hello-world。
docker compose:多服务编排
docker-compose.yml:
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped
api:
build: ./api
environment:
- DATABASE_URL=postgresql://app:secret@db:5432/app
depends_on:
- db
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=app
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=app
volumes:
- pg-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
pg-data:
操作:
docker compose up -d # 起栈,后台
docker compose ps # 看服务
docker compose logs -f api # 流式看日志
docker compose restart api # 重启单个
docker compose down # 停 + 删容器(卷保留)
docker compose down -v # 删卷(数据会丢)
自己的应用:写 Dockerfile
api/Dockerfile(Node 例子):
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]
每次代码变了:
docker compose build api
docker compose up -d api
数据卷 vs 绑定挂载
volumes:
- pg-data:/var/lib/postgresql/data # 命名卷(Docker 管理,推荐数据库用)
- ./html:/usr/share/nginx/html # 绑定挂载(本机目录直接挂进容器)
网络
compose 自动建一个网络,服务之间用服务名互通——api 可以直接连 db:5432,不用 IP。
常见坑
- Mac/Windows 体验差:Docker Desktop 巨吃资源;Linux 原生最快
- logs 要管:默认 logs 无限增长,加
logging限制:logging: driver: json-file options: { max-size: "10m", max-file: "3" } - secret 别写死在 compose:用
.env文件 +.gitignore - 生产用 image tag 别用
latest:今天的 latest 明天可能 break
下一篇:用 docker compose 起常用数据库。