文章最后更新时间:
Docker是现代应用部署的标准方式,但很多开发者对Docker的理解还停留在”会拉镜像”的阶段。本文从Docker基础讲起,到生产环境部署和优化,帮你全面掌握容器化技术。
一、Docker核心概念
镜像(Image)
镜像是一个只读模板,用来创建容器。类似于面向对象中的”类”。
# 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images
容器(Container)
容器是镜像的运行实例。类似于面向对象中的”对象”。
# 运行容器 docker run -d -p 80:80 nginx:latest # 查看运行中的容器 docker ps # 停止容器 docker stop 容器ID
仓库(Registry)
存放镜像的地方。最常用的是Docker Hub。
# 推送镜像到仓库 docker push myimage:latest
二、Dockerfile最佳实践
基础镜像选择
# 使用官方轻量级镜像 FROM node:18-alpine # 非必要不使用latest标签 FROM nginx:1.23-alpine
优化构建层级
# 不好:所有指令在一层 FROM node:18 COPY . . RUN npm install RUN npm run build # 好:分离依赖和代码 FROM node:18 WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build
使用.dockerignore
node_modules .git *.log .DS_Store dist coverage
多阶段构建
# 构建阶段 FROM node:18 AS builder WORKDIR /app COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html
三、Docker Compose编排
docker-compose.yml示例
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
- redis
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secret
redis:
image: redis:7-alpine
volumes:
db-data:
常用命令
# 启动所有服务 docker-compose up -d # 查看服务日志 docker-compose logs -f # 停止所有服务 docker-compose down # 重新构建并启动 docker-compose up -d --build
四、生产环境部署
数据持久化
# 使用卷 volumes: - ./data:/app/data - db-data:/var/lib/postgresql/data # 使用命名卷 docker volume create mydata
环境变量管理
# .env文件
DB_HOST=localhost
DB_PORT=5432
SECRET_KEY=mysecret
# docker-compose引用
environment:
- DB_HOST=${DB_HOST}
健康检查
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
资源限制
services:
web:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
五、Docker网络配置
网络模式
- bridge:默认模式,容器间通信
- host:容器共享主机网络
- none:禁用网络
- overlay:跨主机通信(Swarm模式)
创建自定义网络
docker network create mynetwork # 运行容器时指定网络 docker run -d --network mynetwork myapp
容器间通信
# 使用服务名作为主机名 # web容器可以通过 http://db:5432 访问db容器
六、镜像构建优化
构建缓存利用
# 顺序很重要:不常变化的层放前面 FROM node:18 WORKDIR /app COPY package*.json ./ # 先复制依赖文件 RUN npm ci # 安装依赖 COPY . . # 再复制代码 RUN npm run build # 构建
减小镜像体积
- 使用alpine等轻量级基础镜像
- 多阶段构建分离构建环境
- 清理不必要的文件(apt缓存、临时文件)
- 使用.dockerignore排除无关文件
安全最佳实践
# 不以root用户运行 RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser # 使用非特权端口 EXPOSE 8080
七、监控与日志
查看日志
# 查看容器日志 docker logs -f 容器ID # 查看最近100行 docker logs --tail 100 容器ID
资源监控
# 查看容器资源使用 docker stats # 查看容器详细信息 docker inspect 容器ID
日志管理
# 使用日志驱动
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
八、常见问题
Q:容器内数据如何持久化?
A:使用Docker卷(volume)或绑定挂载(bind mount)。
Q:如何查看容器内部?
A:使用 docker exec -it 容器ID /bin/sh 进入容器。
Q:容器启动失败怎么办?
A:使用 docker logs 查看日志,使用 docker inspect 检查配置。
Q:如何更新运行中的容器?
A:使用 docker-compose up -d –build 重新构建,或使用 docker pull 更新镜像后重新运行。
总结
Docker容器化是现代应用部署的标配。核心要点:写好Dockerfile利用构建缓存、使用Docker Compose编排多服务、配置生产级参数(资源限制、健康检查)、做好监控日志。掌握这些,生产环境部署不再困难。
瀚煜云提供Docker容器化部署及运维服务。


















暂无评论内容