ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何在 Ubuntu 22.04 服务器上通过 Ansible 自动化管理 Docker 容器,简化部署与更新流程?

如何在 Ubuntu 22.04 服务器上通过 Ansible 自动化管理 Docker 容器,简化部署与更新流程?

在现代运维和 DevOps 实践中,自动化是提高效率和降低人为错误的核心。A5数据聚焦于如何在 Ubuntu 22.04 LTS 服务器上,使用 Ansible 自动化管理 Docker 容器 的部署和更新流程。我们将从环境准备、Ansible 设计理念、Playbook 编写,到性能评估与实战案例进行全方位讲解,结合具体的产品版本、参数配置、架构建议和评测数据。


一、场景与目标

背景

一家跨境电商平台需要在多个 Ubuntu 22.04 服务器上运行微服务容器,这些容器负责订单处理、库存同步、日志收集等业务。当前采用手动 SSH 部署方式,存在以下痛点:

  • 部署更新过程重复、耗时
  • 难以追踪变更记录
  • 规模扩展时容易出现版本不一致

目标

使用 Ansible 实现:

  1. Docker 引擎的自动化安装与配置
  2. 容器部署与更新自动化(包括镜像拉取、容器重建)
  3. 基本状态检测与告警提示
  4. 支持多环境(开发/测试/生产)切换

二、环境准备与方案选型

香港服务器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 自动化不仅提升了运维效率,也为后续微服务架构的管理和扩展打下了坚实基础。

返回列表