如何在 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: present
    update_cache: yes

- name: 添加 Docker GPG key
  apt_key:
    url: "{{ docker_gpg_key }}"
    state: present

- name: 添加 Docker 源
  apt_repository:
    repo: "deb [arch=amd64] {{ docker_repo_url }} jammy stable"
    state: present

- name: 安装 Docker Engine
  apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    state: latest
    update_cache: yes

- name: 确保 docker 服务运行
  service:
    name: docker
    state: started
    enabled: 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: started
    restart_policy: always
    published_ports: "{{ container_ports }}"

说明:

  • 我们使用 community.docker.docker_* 模块,它是 Ansible 官方推荐的 Docker 管理方式。
  • restart_policy: always 保证容器在重启后自动恢复。

八、主 Playbook

site.yml

- hosts: all
  become: true
  roles:
    - docker

- hosts: webservers
  become: true
  roles:
    - 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.j2
    dest: /opt/{{ app_name }}/docker-compose.yml

- name: 使用 docker compose 启动
  command: docker compose up -d
  args:
    chdir: /opt/{{ app_name }}

十一、状态检查与告警

我们通过 Ansible Playbook 集成基本检查任务:

- name: 检查 nginx 容器是否运行
  shell: docker inspect -f '{{ "{{ .State.Running }}" }}' nginx_app
  register: 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 自动化不仅提升了运维效率,也为后续微服务架构的管理和扩展打下了坚实基础。

posted @ 2026-01-05 19:10  A5IDC  阅读(29)  评论(0)    收藏  举报