在现代运维和 DevOps 实践中,自动化是提高效率和降低人为错误的核心。A5数据聚焦于如何在 Ubuntu 22.04 LTS 服务器上,使用 Ansible 自动化管理 Docker 容器 的部署和更新流程。我们将从环境准备、Ansible 设计理念、Playbook 编写,到性能评估与实战案例进行全方位讲解,结合具体的产品版本、参数配置、架构建议和评测数据。
一、场景与目标
背景
一家跨境电商平台需要在多个 Ubuntu 22.04 服务器上运行微服务容器,这些容器负责订单处理、库存同步、日志收集等业务。当前采用手动 SSH 部署方式,存在以下痛点:
- 部署更新过程重复、耗时
- 难以追踪变更记录
- 规模扩展时容易出现版本不一致
目标
使用 Ansible 实现:
- Docker 引擎的自动化安装与配置
- 容器部署与更新自动化(包括镜像拉取、容器重建)
- 基本状态检测与告警提示
- 支持多环境(开发/测试/生产)切换
二、环境准备与方案选型
香港服务器www.a5idc.com硬件配置建议(示例)
| 配置项 | 建议配置 | 说明 |
|---|---|---|
| CPU | 8 核 | 中等业务负载推荐 |
| 内存 | 16 GB | 容器数量较多时更高 |
| 存储 | 500 GB NVMe | 写入密集型推荐 |
| 网络 | 1 Gbps | 生产环境至少 1 Gbps |
| 操作系统 | Ubuntu 22.04 LTS | 长期支持版本 |
A5IDC说明:以上配置适用于中等容器数量(10~30 个)的企业级生产环境,若容器数量较多或单容器资源密集型,建议升级至 32 GB 内存以上。
软件版本选型
| 组件 | 推荐版本 | 理由 |
|---|---|---|
| Ubuntu | 22.04 LTS | 官方长期支持 |
| Ansible | 2.13 及以上 | 更好支持 Docker 模块 |
| Docker Engine | 24.x | 稳定、安全 |
| Python | 3.10+ | 与 Ansible 最佳兼容 |
| SSH | OpenSSH 8.9p1 | 默认系统版本 |
三、方案架构设计
整个自动化管理主要分为:
- 控制端:Ansible 运行节点(通常为管理工作站或 CI/CD 管道)
- 被管理端:一组 Ubuntu 22.04 服务器
- 通信方式:SSH(基于密钥)
- 配置存放:Git 仓库(用于版本控制 Playbook/变量)
架构示意:
+----------------+ SSH +---------------------+
| Ansible 控制端 | <-----------------> | Ubuntu 22.04 节点组 |
| (Git + Playbook) | | (Docker Engine) |
+----------------+ +---------------------+
四、环境准备
1. 控制端安装 Ansible
在控制端(例如 macOS 或 Ubuntu 22.04)执行:
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install -y ansible
ansible --version
确认输出类似:
ansible [core 2.13.x]
2. 被管理端准备
在所有 Ubuntu 节点上:
- 开启 SSH 登录
- 统一设定管理员账号(如 ubuntu)
- 配置 SSH 公钥免密登录
五、Ansible Playbook 编写
1. 项目结构
ansible-docker/
├── inventory/
│ ├── production.ini
│ └── staging.ini
├── group_vars/
│ ├── all.yml
│ └── production.yml
├── roles/
│ ├── docker/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ └── app-deploy/
│ ├── tasks/
│ │ └── main.yml
│ └── vars/
│ └── main.yml
└── site.yml
2. Inventory 示例
inventory/production.ini
[webservers]
web01 ansible_host=10.0.1.10
web02 ansible_host=10.0.1.11[dbservers]
db01 ansible_host=10.0.1.20
3. 全局变量
group_vars/all.yml
ansible_user: ubuntu
ansible_ssh_private_key_file: ~/.ssh/id_rsa
docker_packages:- apt-transport-https- ca-certificates- curl- gnupg-agent- software-properties-common
docker_repo_url: https://download.docker.com/linux/ubuntu
docker_gpg_key: https://download.docker.com/linux/ubuntu/gpg
六、Role:Docker 安装
roles/docker/tasks/main.yml
- name: 安装必要基础包apt:name: "{{ docker_packages }}"state: presentupdate_cache: yes- name: 添加 Docker GPG keyapt_key:url: "{{ docker_gpg_key }}"state: present- name: 添加 Docker 源apt_repository:repo: "deb [arch=amd64] {{ docker_repo_url }} jammy stable"state: present- name: 安装 Docker Engineapt:name:- docker-ce- docker-ce-cli- containerd.iostate: latestupdate_cache: yes- name: 确保 docker 服务运行service:name: dockerstate: startedenabled: yes
七、Role:容器部署
假设需要部署一个 Nginx 服务。
roles/app-deploy/vars/main.yml
app_name: nginx_app
docker_image: nginx:1.25.0
container_ports:- "80:80"
roles/app-deploy/tasks/main.yml
- name: 拉取最新镜像community.docker.docker_image:name: "{{ docker_image }}"source: pull- name: 启动/更新容器community.docker.docker_container:name: "{{ app_name }}"image: "{{ docker_image }}"state: startedrestart_policy: alwayspublished_ports: "{{ container_ports }}"
说明:
- 我们使用
community.docker.docker_*模块,它是 Ansible 官方推荐的 Docker 管理方式。 restart_policy: always保证容器在重启后自动恢复。
八、主 Playbook
site.yml
- hosts: allbecome: trueroles:- docker- hosts: webserversbecome: trueroles:- app-deploy
九、部署执行
单次部署命令
ansible-playbook -i inventory/production.ini site.yml
多环境部署
ansible-playbook -i inventory/staging.ini site.yml
十、进阶:动态变量与配置模板
例如,我们可用 Jinja2 模板动态生成 Docker Compose 文件(如复杂微服务场景)。
templates/docker-compose.yml.j2
version: "3.9"
services:nginx:image: "{{ app_name }}"ports:- "{{ container_ports[0] }}"
Ansible Playbook task:
- name: 模板渲染 Compose 文件template:src: docker-compose.yml.j2dest: /opt/{{ app_name }}/docker-compose.yml- name: 使用 docker compose 启动command: docker compose up -dargs:chdir: /opt/{{ app_name }}
十一、状态检查与告警
我们通过 Ansible Playbook 集成基本检查任务:
- name: 检查 nginx 容器是否运行shell: docker inspect -f '{{ "{{ .State.Running }}" }}' nginx_appregister: nginx_status- name: 输出状态debug:msg: "nginx_app running: {{ nginx_status.stdout }}"
也可以结合监控系统(Prometheus/Alertmanager)执行更高级告警。
十二、实测评估与对比
1. 部署时间对比(基于 3 台节点)
| 步骤 | 手动 SSH 部署 | Ansible 自动化 |
|---|---|---|
| Docker 安装 | ~2 分钟/台 | ~1 分钟/台(并行) |
| 镜像拉取 + 启动容器 | ~1.5 分钟/台 | ~45 秒/台 |
| 总计 | ~10 分钟 | ~3 分钟 |
结论:使用 Ansible 能将部署时间降低约 70%。
2. 一致性校验
通过 Ansible Playbook,可保证每次部署:
- 使用相同版本镜像
- 相同网络与端口映射
- 统一 restart_policy
这在手工方式中难以保证。
十三、常见问题与解决
1. SSH 连接失败
确认:
- 防火墙允许 22 端口
- SSH key 配置正确
- 控制端与被控端时间同步
2. Docker 模块未安装
执行:
ansible-galaxy collection install community.docker
并在 Playbook 中声明:
collections:- community.docker
3. 版本兼容性
确保 Docker Engine 与 Ansible 的 Docker 模块兼容。推荐使用 Ansible 2.13+ 与 Docker 24.x。
十四、总结
通过 Ansible 管理 Docker 容器,能够实现:
- 一致、可复现部署流程
- 高效的批量操作能力
- 与 CI/CD 流水线自然集成
A5数据结合 Ubuntu 22.04 和中等规模服务器配置,详细展示了 Playbook 编写、Role 设计、模板集成、部署执行、性能评估等关键环节。采用 Ansible 自动化不仅提升了运维效率,也为后续微服务架构的管理和扩展打下了坚实基础。