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-nginxDockerfile 示例
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