🐹 Docker Compose: Установка и использование.

Содержание:

1. Что такое Docker Compose?
2. Разница между Docker и Docker Compose.
3. Подготовка хост-сервера.
4. Установка Docker-Compose.
5. Настройка Docker-Compose.
6. Запуск docker-compose.
7. Полезные команды.

7.1. Запуск контейнера.
7.2. Отладка.
7.3. Управление образами.
7.4. Docker-compose.
7.5. Другие полезности.
7.6. Чистка мусора.
7.7. Прочие команды.

8. Оригиналы источников информации.


На чем было опробовано:

  1. CentOS Linux release 7.9.2009 (Core)
  2. Docker Compose version 1.29.1, build c34c88b2.
  3. Docker-py version: 5.0.0.
  4. CPython version: 3.7.10.
  5. OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019.

1. Что такое Docker Compose?

Docker Compose — это инструментальное средство, входящее в состав Docker. Оно предназначено для решения задач, связанных с развёртыванием проектов.

Изучая основы Docker, вы могли столкнуться с созданием простейших приложений, работающих автономно, не зависящих, например, от внешних источников данных или от неких сервисов. На практике же подобные приложения — редкость. Реальные проекты обычно включают в себя целый набор совместно работающих приложений.

Как узнать, нужно ли вам, при развёртывании некоего проекта, воспользоваться Docker Compose? На самом деле — очень просто. Если для обеспечения функционирования этого проекта используется несколько сервисов, то Docker Compose может вам пригодиться.

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

Ссылка на пример: «Docker Compose: Запускаем WordPress с Nginx, PHP, MariaDB, PhpMyAdmin».

Технология Docker Compose, если описывать её упрощённо, позволяет, с помощью одной команды, запускать множество сервисов, она работает на Docker‘ах.

2. Разница между Docker и Docker Compose.

Docker – это программное обеспечение, которое может упаковать ваше приложение, его зависимости, системные инструменты, системные библиотеки и настройки в единый виртуальный контейнер. Этот комбинированный пакет, содержащий все необходимое для запуска вашего приложения, называется образом контейнера Docker.

Этот образ представляет собой автономный исполняемый программный пакет, который надежно работает на любом сервере – GNU/Linux, Windows, macOS, публичное облако или частное облако.

Также эти образы можно использовать для запуска приложения как изолированного процесса в пространстве пользователя.

Подробнее, что такое Docker и как его установить на операционную систему CentOS 7, читайте по ссылке на моем сайте.

Ссылка: «CentOS 7: Установка и использование Docker».

Docker применяется для управления отдельными контейнерами (сервисами), из которых состоит приложение.

Docker Compose используется для одновременного управления несколькими контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными приложениями.

Docker (отдельный контейнер) и Docker Compose (несколько контейнеров).

3. Подготовка хост-сервера.

3.1. Обновим операционную систему CentOS 7 до актуального состояния:

# yum -y update && yum -y upgrade

3.2. Устанавливаем файловый менеджер Midnight Commander и интернет качалку wget:

# yum -y install mc wget

3.3. Отключим SELinux.

Состояние работы SELinux:

# sestatus

Ответ:

SELinux включен. Отключим его.

Для этого достаточно выполнить замену строки в вышеописанном конфигурационном файле следующей командой:

# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

После перезагрузки:

# shutdown -r now

Проверим состояние SELinux с помощью команды sestatus, как показано ниже:

# sestatus

SELinux выключен.

3.4. Установка Docker.

Перейдите по ссылке и установите Docker компонент, затем вернитесь к данной инструкции и продолжайте установку Docker-Compose.

Ссылка на инструкцию по установке: «CentOS 7: Установка и использование Docker».

4. Установка Docker-Compose.

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

Крайнюю и актуальную версию можно посмотреть здесь по ссылке:

Ссылка на крайнюю актуальную версию Docker Compose: https://github.com/docker/compose/releases.

Скачаем крайнюю актуальную версию с GitHub по ссылке, которую вы заранее посмотрели на сайте производителя:

# sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.29.1/docker-compose-Linux-x86_64

# sudo chmod +x /usr/local/bin/docker-compose

После завершения процесса проверьте установленную версию Docker Compose:

# docker-compose version

Ответ:

Внимание! Вам придется выполнять все команды или от root или от sudo, но лучше добавить вашего пользователя в группу docker.

В целях безопасности, мы не будем работать через root, а добавим существующего пользователя в группу docker и перезагрузим службу:

# usermod -a -G docker $USER

Чтобы Docker-Compose корректно работал, перезапустим службу Docker:

# systemctl restart docker

Еще с Docker придется понять, что теперь не панель управления, а вы должны будете придумать, где разместить ваши данные из контейнера, будь то сайт или что-то еще, что может иметь свои файлы и каталоги. Теперь не будет никаких кнопочек из серии «Файловый менеджер«, которые сразу откроют вам каталог с данными ваших контейнеров. Вы должны сами придумать, где будет работать и размещаться ваш комплекс программ, которые вы запустите с помощью Docker-Compose.

К примеру это будет каталог ~/dockerfiles/somefolder.

5. Настройка Docker-Compose.

Есть Docker port, а есть Published port.

Docker port — это порт, который контейнер будет считать, что использует, а Published это порт, через который будет доступен Docker port на родительской машине. Простыми словами, это проброс портов.

Контейнер — это как виртуальная машина. Его можно удалить, остановить, возобновить, подключиться к терминалу. В общем, делать все, что и с обычным Linux сервером или виртуальной машиной

Dockerfile — это набор инструкций, как нужно создавать контейнер. docker-compose.yml — в докере один Dockerfile это один сервис.

Если вам нужен один сервис, например, торрент-качалка или генерация Let’s Encrypt сертификата, вы можете запустить его через docker run, но если у вас сервис, состоящий из нескольких сервисов (PHP + Nginx + MySQL), то запускать их все по очереди длинными командами с кучей параметров было бы, как минимум, неудобно.

Этот файл объединяет все в одном месте и управляется через команду docker-compose:

# docker-compose --help

Ответ:

6. Запуск docker-compose.

Начнем создание новых контейнеров с docker-compose.

На моём сайте есть пример, как развернуть WordPress с Nginx, php-fpm и MariaDB и PhpMyAdmin с помощью Docker Compose на сервере с CentOS 7.

Ссылка на пример: «Docker Compose: Запускаем WordPress с Nginx, PHP, MariaDB, PhpMyAdmin».

Примеры команд.

Перейдите в каталог с docker-compose.yml и запустите новые контейнеры на основании созданного docker-compose.yml файла:

# cd ~/dockerfiles/somefolder

Запустите комплекс docker‘ов:

# docker-compose up -d

Проверьте состояние контейнеров:

# docker-compose ps

7. Полезные команды.

Рассмотрим некоторые команды, которые могут вам пригодиться при работе с Docker Compose.

7.1. Запуск контейнера.

  • Фоновый — запустили и отключились detach.

# docker run -d mysql

  • Со своим названием.

# docker run --name database mysql

  • Этот удалится после отключения от него или выполнения задачи.

# docker run -rm ubuntu pwd

  • Проброс порта с контейнера на хост. Слева порт на хосте (Published).

docker run -p 8080:80 -d nginx

  • Остановка работающего. Данные внутри сохраняются. Запуск через start.

# docker stop NAME

  • Удаление контейнера. Проброшенные в него файлы сохраняются.

# docker rm NAME (-f удаляет даже если контейнер запущен).

7. 2. Отладка.

  • Подключение к терминалу контейнера.

# docker exec -it NAME bash

  • Посмотреть лог-файлы внутри контейнера (STDOUT, STDERR).

# docker logs -f NAME

7.3. Управление образами.

  • Сборка образа контейнера на базе Dockerfile (точка в конце нужна).

# docker build --tag image-name

  • Список.

# docker images -a

  • Удаление.

# docker image rm NAME (-f force)

  • Переименование.

# docker image tag SOURCE[:TAG] TARGET[:TAG]

7.4. Docker-compose.

  • Создание/обновление контейнеров приложения в фоне (-d).

# docker-compose up -d APP_NAME

  • Остановка.

# docker-compose stop

  • Запуск остановленного приложения.

# docker-compose start

  • Остановка и удаление. Эта команда позволяет останавливать и удалять контейнеры и другие ресурсы, созданные командой docker-compose up.

# docker-compose down

Ответ:

  • Лог-файлы всех сервисов приложения.

# docker-compose logs -f

7.5. Другие полезности.

  • Работающие и остановленные контейнеры.

# docker ps -a (без -a только работающие).

Ответ:

  • Показать данные контейнера. Тут можно найти его IP, пути к volumes и кучу другого.

# docker inspect NAME

Ответ:

Разверните для просмотра спойлера.
[
    {
        "Id": "sha256:6d5c5ed114adac216fb8d7268ded8ae498b804ee04ac9b29b59d2abc6027d650",
        "RepoTags": [
            "mariadb:latest"
        ],
        "RepoDigests": [
            "mariadb@sha256:0c72b63198ac53df4e84db821876c73794b00509b2d8a77100d186a13e49ac31"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-06-24T08:44:58.732280192Z",
        "Container": "d147bd05939213c055a2f6919c343a77043592397293ec4d6b354431a93418c6",
        "ContainerConfig": {
            "Hostname": "d147bd059392",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8",
                "MARIADB_MAJOR=10.5",
                "MARIADB_VERSION=1:10.5.11+maria~focal"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"mysqld\"]"
            ],
            "Image": "sha256:6ec8141c076565bfe242c0b5c8f138c41996803b38598d58f3fc4059ee8cd7a2",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8",
                "MARIADB_MAJOR=10.5",
                "MARIADB_VERSION=1:10.5.11+maria~focal"
            ],
            "Cmd": [
                "mysqld"
            ],
            "Image": "sha256:6ec8141c076565bfe242c0b5c8f138c41996803b38598d58f3fc4059ee8cd7a2",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 407636794,
        "VirtualSize": 407636794,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/d33341ef02a6233e5ea252a2cb330c945d7b93c948cd809b5872411fb17c8ec3/diff:/var/lib/docker/overlay2/66a8d517ae88576141bebedd3fa8212c3bfc094ff18a44d3afc6be4d1c8ecb63/diff:/var/lib/docker/overlay2/f99173c767c7bfee480683a4fc0fbef3d5571c6f29ee7f8c5a0e67df77471fce/diff:/var/lib/docker/overlay2/8017bcc38ca71c9be729718f2209e14471fd5917abfb2e74bfb160c0c0cbd9be/diff:/var/lib/docker/overlay2/2971b98e507cba37f8cda442ec16cc657350bf77ed2541557bc1fa29af5055ed/diff:/var/lib/docker/overlay2/ae21c602e34a21bbe30369e794c7fbe16c8ec484a80aa05a773ef9ed5e68ef4e/diff:/var/lib/docker/overlay2/c8ce4d691d7c7d63db7227c5ec153512fbc7b58ce1b9be4a7919ee123949d118/diff:/var/lib/docker/overlay2/66d9380ac32830075bd3ed0e57bcfdb0bb129f51bda38b0acde5b741457027a2/diff:/var/lib/docker/overlay2/89a67cfce03b87fde6d7f29e6f381ec0306b85150836eb10d3543f6bd728d3c7/diff",
                "MergedDir": "/var/lib/docker/overlay2/f989d80c0a91eed0533f4eaf1064747694594b011a23b170ae4e145b267f2a74/merged",
                "UpperDir": "/var/lib/docker/overlay2/f989d80c0a91eed0533f4eaf1064747694594b011a23b170ae4e145b267f2a74/diff",
                "WorkDir": "/var/lib/docker/overlay2/f989d80c0a91eed0533f4eaf1064747694594b011a23b170ae4e145b267f2a74/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:feef05f055c989eea0367f5d3a2cba79896dd6d8a8b72bea2c729548a4ca5aef",
                "sha256:94478388a6f074b6c5eede5d647f583cf4679c65817f88b6ae63c02fba28c0f6",
                "sha256:fac86ed223e80e59b0ff82e444825c05caa06364dda4aae289adc2c1ec9deb3f",
                "sha256:b56be19e2b1840137fb4e0e5f2023346d74b4efea6e68f82d4427bc1ebe27520",
                "sha256:cb8ffd04f82a33f3e40f95cbe8e849ebb7f6601cf7fae2fdec464357c6d183fb",
                "sha256:a29b933b260723202570276dc30f453f93c026484bf8d090d79070eac285e015",
                "sha256:09da20edc134641b58b1f005673c51c530a0fc8b1d11adbe94dc031a777c5724",
                "sha256:31d2558aceb139f9c9e1c7a1095d319afb2d76868cca93c1dede24c9dc3d632f",
                "sha256:66bfdb0bd555fa7f379c1651d112e496705c945f436d95c52a40dcde58519ed7",
                "sha256:d3710ba7c6c2484798bca067b5ec307ee090df84729317a298eaa2cd502ca4ee"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

7.6. Чистка мусора.

  • Удалить все остановленные контейнеры.

# docker rm $(docker ps -a -q)

  • Удалить незакрепленные ни за каким контейнером volumes.

# docker volume rm $(docker volume ls -f dangling=true -q)

Ответ:

  • Удалить неиспользуемые сети.

# docker network prune

Ответ:

  • Удалить все неиспользуемые данные.

# docker system prune -a

Ответ:

  • Удалить контейнеры, что остановлены больше часа назад + образы, с которыми не работает ни один контейнер:

# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro spotify/docker-gc

Ответ:

7.7. Прочие команды.

  • Эта команда выводит журналы сервисов:

# docker-compose logs -f [service name]

  • Например, в нашем проекте её можно использовать в таком виде:

# docker-compose logs -f [service name].

  • С помощью такой команды можно вывести список контейнеров:

# docker-compose ps

Ответ:

  • Данная команда позволяет выполнить команду в выполняющемся контейнере:

# docker-compose exec [service name] [command]

  • Например, она может выглядеть так:

# docker-compose exec wordpress ls

  • Такая команда позволяет вывести список образов:

# docker-compose images

Ответ:

8. Оригиналы источников информации.

  1. habr.com «Руководство по Docker Compose для начинающих».
  2. digitalocean.com «Установка WordPress с помощью Docker Compose».
  3. admin812.ru «Развертывание WordPress с NGINX, PHP-FPM и MariaDB с помощью Docker ComposeРазвертывание WordPress с NGINX, PHP-FPM и MariaDB с помощью Docker Compose».
  4. blog.amd-nick.me «Просто о сложном — Docker».

Читайте также: