Docker环境部署与优化实战指南
1. 为什么选择Docker环境部署
在Linux服务器上部署应用时,传统方式往往面临"依赖地狱"和环境不一致的困扰。三年前我负责一个Python项目迁移时,就曾因目标服务器缺少特定版本的libssl库导致服务崩溃。Docker通过容器化技术将应用及其所有依赖打包成标准化单元,彻底解决了"在我机器上能跑"的经典难题。
Docker-compose则进一步简化了多容器应用的编排管理。上周刚用它在测试环境快速搭建了一套包含Nginx、MySQL和Redis的微服务原型,从裸机到完整环境只用了17分钟。这种效率在传统部署方式中是不可想象的。
2. 环境准备与基础配置
2.1 系统要求检查
推荐使用Ubuntu 20.04/22.04或CentOS 7/8等主流Linux发行版。在终端执行以下命令检查内核版本:
uname -r # 要求内核版本≥3.10 lsmod | grep overlay # 检查overlay文件系统支持我曾在一台老旧的CentOS 6.5机器上遇到内核版本不兼容的问题,最终不得不升级系统。建议新项目直接选择较新的发行版,避免兼容性问题。
2.2 存储驱动选择
不同的文件系统会影响Docker性能。通过df -T查看当前文件系统类型:
- ext4:默认选择,稳定性好
- xfs:适合大文件操作
- btrfs:需要额外配置
重要提示:生产环境避免使用devicemapper驱动,容易导致存储泄漏。去年我们一个CI服务器就因此占满磁盘空间。
3. Docker安装与优化
3.1 官方源安装
Ubuntu系统推荐使用官方仓库安装:
sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io3.2 权限配置
避免每次使用sudo执行docker命令:
sudo usermod -aG docker $USER newgrp docker # 立即生效验证安装:
docker run hello-world3.3 生产环境调优
修改/etc/docker/daemon.json进行性能优化:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }, "storage-driver": "overlay2", "live-restore": true }重启服务生效:
sudo systemctl restart docker4. Docker-compose部署实践
4.1 二进制安装
下载最新稳定版(当前v2.23.0):
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose验证安装:
docker compose version4.2 典型应用编排
以WordPress为例的docker-compose.yml:
version: '3.8' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: example_rootpass MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: example_dbpass networks: - wp-network wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: example_dbpass volumes: - wp_data:/var/www/html networks: - wp-network volumes: db_data: wp_data: networks: wp-network: driver: bridge启动服务:
docker compose up -d5. 运维监控与问题排查
5.1 常用监控命令
docker stats # 实时资源监控 docker events # 事件日志 docker inspect <container> # 详细配置查看5.2 日志分析技巧
查看最近100行日志:
docker logs --tail 100 <container>实时日志追踪(类似tail -f):
docker logs -f <container>5.3 常见问题处理
容器启动失败:
- 查看详细错误:
docker logs <container> - 检查端口冲突:
netstat -tulnp | grep <port> - 验证镜像完整性:
docker inspect --format='{{.RepoDigests}}' <image>
磁盘空间不足: 定期清理无用资源:
docker system prune -a --volumes6. 安全加固措施
6.1 容器用户隔离
避免以root用户运行容器:
FROM alpine RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser ...6.2 网络隔离
创建自定义网络:
docker network create --driver bridge isolated_net限制容器网络访问:
services: app: networks: isolated_net: aliases: - app1 cap_drop: - NET_RAW6.3 镜像扫描
使用Trivy进行漏洞扫描:
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image <your-image>7. 性能优化实战
7.1 构建缓存优化
.dockerignore文件示例:
**/*.log .git/ tmp/多阶段构建示例:
FROM golang:1.19 as builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest COPY --from=builder /app/myapp . CMD ["./myapp"]7.2 资源限制
限制容器资源使用:
services: app: deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M7.3 存储驱动优化
对于高IO应用,建议:
docker run -v /path/on/host:/path/in/container:rw,Z \ --mount type=tmpfs,destination=/tmp \ <image>8. CI/CD集成方案
8.1 GitLab Runner配置
.gitlab-ci.yml示例:
stages: - build - deploy build_image: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA deploy_prod: stage: deploy environment: production script: - docker-compose -f docker-compose.prod.yml up -d8.2 镜像更新策略
使用watchtower自动更新:
docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --interval 36009. 备份与迁移方案
9.1 容器持久化数据备份
docker run --rm --volumes-from <container> \ -v $(pwd):/backup alpine \ tar cvf /backup/backup.tar /path/to/data9.2 完整环境迁移
导出镜像:
docker save -o myapp.tar myapp:latest传输后加载:
docker load -i myapp.tar10. 进阶编排技巧
10.1 多环境配置管理
使用extends语法:
# common.yml services: app: image: myapp environment: - APP_ENV=development # docker-compose.prod.yml services: app: extends: file: common.yml service: app environment: - APP_ENV=production10.2 动态环境变量
.env文件示例:
DB_HOST=mysql.prod DB_PORT=3306compose文件引用:
environment: - DB_HOST=${DB_HOST} - DB_PORT=${DB_PORT}启动时指定:
DB_HOST=mysql.test docker compose up