Skip to content

Docker 实战

Docker 容器化部署的核心概念与实操流程。

核心概念

概念说明
镜像 (Image)只读模板,包含运行环境和代码
容器 (Container)镜像的运行实例,可以启停
Dockerfile构建镜像的指令文件
Volume持久化存储,容器删除后数据不丢
网络 (Network)容器之间的通信桥梁

常用命令

镜像操作

bash
# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 构建镜像
docker build -t my-app:v1 .

# 删除镜像
docker rmi my-app:v1

容器操作

bash
# 运行容器(后台 + 端口映射 + 自动重启)
docker run -d --name my-nginx -p 80:80 --restart=unless-stopped nginx

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 进入容器终端
docker exec -it my-nginx /bin/bash

# 查看容器日志
docker logs -f --tail 100 my-nginx

# 停止 / 启动 / 重启
docker stop my-nginx
docker start my-nginx
docker restart my-nginx

# 删除容器
docker rm -f my-nginx

Dockerfile 示例

Node.js 项目

dockerfile
FROM node:20-alpine

WORKDIR /app

# 利用缓存层:先复制依赖文件
COPY package*.json ./
RUN npm ci --only=production

# 再复制源代码
COPY . .

RUN npm run build

EXPOSE 3000
CMD ["node", "dist/index.js"]

Python 项目

dockerfile
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000
CMD ["python", "main.py"]

Docker Compose

使用 docker-compose.yml 编排多容器服务:

yaml
version: "3.8"

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret

volumes:
  pgdata:

常用 compose 命令:

bash
# 启动所有服务(后台)
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f web

# 停止并删除
docker compose down

# 重建镜像并启动
docker compose up -d --build

数据持久化

bash
# 命名卷(推荐,Docker 管理)
docker run -v mydata:/app/data my-app

# 绑定挂载(映射主机目录)
docker run -v /host/path:/container/path my-app

清理空间

bash
# 删除未使用的资源
docker system prune

# 深度清理(包括未使用的镜像)
docker system prune -a

# 查看磁盘占用
docker system df

最佳实践

  • 使用 .dockerignore 排除 node_modules.git
  • 多阶段构建减小镜像体积
  • 一个容器只运行一个进程
  • 不要在容器内存储重要数据,用 Volume

用知识连接未来