Docker 容器化
约 993 字大约 3 分钟
Docker容器DevOps
2024-08-13
概述
Docker 是一个开源的容器化平台,让开发者可以打包应用及其依赖到容器中,实现一致的运行环境。
核心概念
| 概念 | 说明 |
|---|---|
| 镜像 (Image) | 应用的只读模板 |
| 容器 (Container) | 镜像的运行实例 |
| 仓库 (Registry) | 存储和分发镜像的服务 |
常用命令
镜像操作
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:latest .
# 推送镜像
docker push myregistry.com/myapp:latest
# 导出/导入
docker save -o myapp.tar myapp:latest
docker load -i myapp.tar容器操作
# 运行容器
docker run -d -p 80:80 --name web nginx:latest
# -d: 后台运行
# -p 80:80: 端口映射 (宿主机:容器)
# --name: 容器名称
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止/启动容器
docker stop web
docker start web
# 重启容器
docker restart web
# 删除容器
docker rm web
docker rm -f web # 强制删除
# 进入容器
docker exec -it web /bin/bash
# 查看日志
docker logs -f web
# 查看资源使用
docker statsDocker Compose
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
- redis
networks:
- app-network
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
redis:
image: redis:alpine
networks:
- app-network
volumes:
db-data:
networks:
app-network:
driver: bridge# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f web
# 重新构建
docker-compose up -d --buildDockerfile 最佳实践
Node.js 应用
# 多阶段构建
FROM node:20-alpine AS builder
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
RUN npm ci --only=production
# 复制源代码
COPY . .
# 构建应用
RUN npm run build
# 生产镜像
FROM node:20-alpine AS production
WORKDIR /app
# 从 builder 复制构建产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
# 使用非 root 用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
USER nextjs
EXPOSE 3000
CMD ["node", "dist/server.js"]Vue/React 应用
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Nginx 配置
# nginx.conf
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
# React Router 支持
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Gzip 压缩
gzip on;
gzip_types text/plain application/javascript application/json image/svg+xml;
}
}网络配置
# 创建网络
docker network create mynetwork
# 容器连接到网络
docker run -d --network mynetwork --name web nginx
# 查看网络
docker network ls
docker network inspect mynetwork网络模式
| 模式 | 说明 |
|---|---|
| bridge | 默认模式,容器在独立网络 |
| host | 容器共享宿主机网络 |
| overlay | 跨 Docker 守护进程通信 |
| none | 禁用网络 |
数据管理
Volume
# 创建 volume
docker volume create mydata
# 查看 volume
docker volume ls
docker volume inspect mydata
# 容器使用 volume
docker run -d -v mydata:/app/data nginx# docker-compose.yml
volumes:
mydata:
driver: local绑定挂载
# 绑定宿主目录
docker run -d -v $(pwd):/app nginx常用镜像
| 镜像 | 用途 |
|---|---|
| nginx | Web 服务器 |
| redis:alpine | Redis 缓存 |
| postgres:15 | PostgreSQL 数据库 |
| mysql:8 | MySQL 数据库 |
| node:20-alpine | Node.js 运行环境 |
| python:3.11 | Python 环境 |
| maven:3.9 | Java Maven 构建 |
实用技巧
清理资源
# 清理未使用的镜像、容器、网络
docker system prune
# 清理所有未使用的资源
docker system prune -a
# 清理悬空镜像
docker image prune
# 清理停止的容器
docker container prune.dockerignore
# 忽略不需要的文件
node_modules
.git
.env*
*.log
dist
.DS_Store构建加速
# 使用阿里云镜像加速
RUN npm install -g mirror-config-china --registry=https://registry.npmmirror.com
# 或在 daemon.json 配置
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}部署示例
前端应用部署
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
restart: unless-stopped
networks:
- app-net
networks:
app-net:
driver: bridgeNode.js API 部署
version: '3.8'
services:
api:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/myapp
depends_on:
- db
- redis
restart: unless-stopped
networks:
- app-net
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
networks:
- app-net
redis:
image: redis:alpine
networks:
- app-net
volumes:
pgdata:
networks:
app-net:
driver: bridge