Сегодня я бы хотел рассказать, как создавать образы Docker с помощью Ansible.

Но для начала расскажу кратко что такое Docker. Docker – это софт для виртуализации и он позволяет вам упаковывать ваши приложения в контейнеры. У меня есть статья с основными командами для работы с Docker.

Что такое Ansible – это софт для управления конфигурациями, в частности управление конфигурациями операционных систем.

Для начала нам нужно установить Docker и Ansible, затем создадим Docker файл и соберем контейнер для Web-сервера. После этого мы создадим простой плейбук Ansible для создания образа Docker для другого Web-сервера.

Устанавливаем Docker

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

sudo groupadd docker

sudo usermod -aG docker $USER

Теперь вам надо перелогиниться в операционной системе и проверяем версию установленного Docker:

docker –version

Устанавливаем Ansible

sudo apt install ansible

Всё.

Установка дополнительного софта

Выше мы установили основной софт, но для полноценной работы нам надо установить дополнительные пакеты.

sudo apt install python3-pip

pip3 install docker

Теперь давайте писать код

Весь код, который будет предоставлен дальше, вы можете скачать в моем репозитории на GitHub: https://github.com/ZeroBot-Dot/Build-Docker-Images-with-Ansible

Создаем папку docker-build и в ней создаем файл Dockerfile, он будет использоваться для создания Docker image.

Содержимое файла:

FROM nginx:latest

# Default Nginx static file location

# Ideally, we would edit the nginx.conf for new configuration

WORKDIR /usr/share/nginx/html

# Add all local static files to image working directory

ADD ./ ./

# If there was a lot of ADD COPY and RUN Steps, Bash script file is common practice

# To bootstrap the image without additional layers

# RUN /bootstrap.sh

# Self explanatory

EXPOSE 8080

Команды, которые здесь используются, были описаны в статье про Docker, рекомендую ознакомиться.

Теперь создадим рядом с папкой docker-build папку ansible-build. В ней создаем файл docker-image-playbook.yaml

Содержимое файла:

–––

– name: Pull latest Nginx Image

  hosts: localhost

  tasks:

    – name: Pull Nginx Image

      docker_container:

        name: “nginx–ansible–base”

        image: “nginx:latest”

        state: started

        command: tail –f /dev/null

    – name: Add Nginx Image to Ansible Hosts

      add_host:

        name: “nginx–ansible–base”

        ansible_connection: docker

        ansible_ssh_user: root

– name: Configure Nginx Base Image for deploying Webserver

  hosts: “nginx–ansible–base”

  gather_facts: false

  tasks:

    – name: Install Python3

      raw: apt update && apt upgrade –y && apt install python3 –y

    – name: Install Rsync

      apt:

        name: rsync

    – name: Copy local configuration Files to Nginx Conf

      synchronize:

        src: ./website/

        dest: /usr/share/nginx/html/

    – name: Ensure NGINX Is enabled

      service:

        name: nginx

        enabled: yes

    – name: Clean up Python 3 and Prerequisites

      raw: apt purge python3 rsync –y

– name: Snapshot base image to create newly configured Image

  hosts: localhost

  tasks:

    – name: Commit Docker image

      command: docker commit “nginx–ansible–base” “nginx–ansible–build–demo”

– name: Clean Up Docker Containers

  hosts: localhost

  tasks:

    – name: Remove Running Base Image

      docker_container:

        name: nginx–ansible–base

        state: absent

        force_kill: yes

В этом файле описываются команды, которые будет выполнять Ansible (про саму систему Ansible будет статья, но чуть позже).

По факту в этом файле описана сборка контейнера Docker на основании нужного нам образа, установка зависимостей и копирование необходимых файлов. Не вижу смысла копировать сюда официальную документацию, она может потерять актуальность, поэтому рекомендую вам изучить ее на официальном сайте Ansible.

Чтобы собрать образ на основании только что созданного файла docker-image-playbook.yaml вводим в консоли команду ansible-playbook docker-image-playbook.yaml

В репозитории вы найдете еще файлы от двух html шаблонов сайтов. Они добавлены чтобы при запуске контейнера Docker через Dockerfile и через файл docker-image-playbook.yaml вы могли увидеть разницу (шаблоны отличаются друг от друга).

Обсудить эту заметку можно в нашем Телеграм канале: https://t.me/devops_spb_ru (@devops_spb_ru)

От DevOps

DevOps or not...