Docker容器化部署实战指南
Docker 已经成为现代开发运维不可或缺的工具,本文将带你从零掌握容器化部署的核心技能。
什么是 Docker?
Docker 是一个开源的容器化平台,它可以将应用及其依赖打包到一个轻量级、可移植的容器中运行。与虚拟机相比,Docker 容器启动更快、资源占用更少。
核心概念
- 镜像(Image):只读模板,包含运行应用所需的所有内容
- 容器(Container):镜像的运行实例
- 仓库(Registry):存储和分发镜像的服务(如 Docker Hub)
- Dockerfile:描述如何构建镜像的文本文件
编写 Dockerfile
以下是一个 Node.js 应用的 Dockerfile 示例:
dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]多阶段构建
多阶段构建可以显著减小镜像体积:
dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Docker Compose 编排
对于多容器应用,使用 Docker Compose 进行编排:
yaml
version: "3.8"
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=pass
volumes:
pgdata:数据卷管理
数据卷用于持久化容器数据:
bash
# 创建命名卷
docker volume create mydata
# 挂载卷到容器
docker run -v mydata:/data alpine
# 挂载宿主机目录
docker run -v /host/path:/container/path alpine网络配置
Docker 提供多种网络驱动:
| 驱动 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认桥接网络 | 单机容器通信 |
| host | 共享宿主机网络 | 需要最高网络性能 |
| overlay | 跨主机网络 | Docker Swarm 集群 |
| none | 无网络 | 安全隔离 |
常用命令速查
bash
# 构建镜像
docker build -t myapp:latest .
# 运行容器
docker run -d --name myapp -p 3000:3000 myapp:latest
# 查看容器日志
docker logs -f myapp
# 进入容器
docker exec -it myapp sh
# 清理资源
docker system prune -a最佳实践
- 使用
.dockerignore排除不需要的文件 - 合并
RUN指令减少镜像层数 - 使用特定版本标签而非
latest - 非 root 用户运行容器
- 利用构建缓存优化构建速度
总结
Docker 容器化部署能够极大简化应用的部署和运维流程。掌握 Dockerfile 编写、Compose 编排和数据卷管理,就能应对大多数部署场景。


评论 3