为什么用 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 起常用数据库。