在 Ubuntu 上实现 Docker 多容器编排
一、方案选型与适用场景
- Docker Compose:单机开发、测试、预发布或小型生产环境;通过一份 YAML 定义多个服务、网络与数据卷,一条命令即可拉起整套应用,运维成本低、学习曲线平缓。适合快速交付与本地一致性环境搭建。
- Kubernetes:多节点集群、弹性伸缩、自动恢复、灰度发布与滚动升级、跨云与混合云场景;具备更完善的调度、网络与存储生态,但部署与运维复杂度更高。适合中大型与高可用生产环境。
二、使用 Docker Compose 编排多容器
-
安装 Docker 与 Docker Compose
- 安装 Docker(若尚未安装):
- sudo apt-get update
- sudo apt-get install -y docker-ce docker-ce-cli containerd.io
- 安装 Docker Compose(Linux 二进制方式,示例版本为 1.29.2,可按需替换为最新稳定版):
- sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
- docker-compose --version
- 可选:将当前用户加入 docker 组以避免每次使用 sudo(需重新登录生效):sudo usermod -aG docker $USER。
-
定义服务与网络(示例:Nginx + Redis)
- 在项目目录创建 docker-compose.yml:
- version: “3.8”
services:
web:
image: nginx:alpine
ports:
- “8000:80”
volumes:
- ./app:/usr/share/nginx/html
networks:
- app
redis:
image: redis:alpine
networks:
- app
networks:
app:
driver: bridge
- 启动与验证
- 启动:docker-compose up -d
- 查看状态:docker-compose ps
- 查看日志:docker-compose logs -f
- 进入容器:docker-compose exec web sh
- 停止与清理:docker-compose down(加 --volumes 一并清理卷)
-
实战扩展(示例:Nginx + PHP-FPM + MySQL + Redis 开发环境)
- 目录结构建议:
- ├── docker-compose.yml
- ├── nginx/conf.d/default.conf
- ├── www/index.php
- └── mysql/data(自动持久化)
- 关键配置要点:
- Nginx 通过 fastcgi_pass 将 .php 请求转发至 php:9000;root 指向挂载的 /www。
- PHP 使用官方 php:7.4-fpm 镜像并挂载代码目录。
- MySQL 设置环境变量(如 MYSQL_ROOT_PASSWORD、MYSQL_DATABASE)并挂载数据目录以持久化。
- Redis 作为缓存服务,可按需映射端口(如 6379:6379)。
三、使用 Kubernetes 编排多容器
- 适用场景:需要跨节点调度、自动重启、滚动升级、服务发现与自动扩缩容的生产级集群。
- 快速起步(单节点或实验环境)
- 安装 kubelet/kubeadm/kubectl(Ubuntu 示例):
- sudo apt-get update && sudo apt-get install -y apt-transport-https curl
- 添加 Kubernetes APT 源并安装组件(具体命令以官方仓库为准)
- sudo kubeadm init --pod-network-cidr=10.244.0.0/16
- mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config
- kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml(安装网络插件)
- 部署应用:将多容器应用拆分为 Deployment/Service,用 kubectl apply -f 部署与滚动更新。
四、实践建议与常见问题
- 数据持久化:数据库等状态服务务必使用 named volume 或绑定挂载,避免容器重建导致数据丢失(Compose 中使用 volumes: 声明)。
- 配置与密钥:敏感信息使用 .env 或 Secrets 管理,避免硬编码到 YAML。
- 网络与服务发现:Compose 中为服务创建共享网络,容器间通过 服务名 互通;Kubernetes 使用 Service 提供稳定 DNS 与负载均衡。
- 日志与排障:Compose 优先使用 docker-compose logs -f 跟踪问题;Kubernetes 使用 kubectl logs/describe 与事件排查。
- 版本与兼容性:Compose 文件版本(如 3.8)与 Docker 引擎版本需匹配;生产环境建议固定镜像标签,避免 latest 造成不确定性。