Поиск по сайту:

Как установить и использовать Docker Compose на CentOS 7


Введение

Docker — отличный инструмент для автоматизации развертывания приложений Linux внутри программных контейнеров, но для полного использования его потенциала лучше всего, если каждый компонент вашего приложения будет работать в своем собственном контейнере. Для сложных приложений с большим количеством компонентов организация одновременного запуска и закрытия всех контейнеров (не говоря уже о взаимодействии друг с другом) может быстро стать громоздкой.

Сообщество Docker придумало популярное решение под названием Fig, которое позволяло вам использовать один файл YAML для организации всех ваших контейнеров и конфигураций Docker. Это стало настолько популярным, что команда Docker решила создать Docker Compose на основе исходного кода Fig, который сейчас устарел. Docker Compose упрощает пользователям управление процессами контейнеров Docker, включая запуск, завершение работы и настройку внутриконтейнерных связей и томов.

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

Концепции Docker и Docker Compose

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

Докер-образы

Каждый контейнер Docker — это локальный экземпляр образа Docker. Вы можете думать об образе Docker как о полной установке Linux. Обычно минимальная установка содержит только самый минимум пакетов, необходимых для запуска образа. Эти образы используют ядро хост-системы, но, поскольку они работают внутри контейнера Docker и видят только свою собственную файловую систему, вполне возможно запустить дистрибутив, такой как CentOS, на хосте Ubuntu (или наоборот).

Большинство образов Docker распространяются через Docker Hub, который поддерживается командой Docker. Для большинства популярных проектов с открытым исходным кодом в реестр Docker загружен соответствующий образ, который можно использовать для развертывания программного обеспечения. Когда это возможно, лучше брать «официальные» образы, поскольку команда Docker гарантирует, что они будут следовать передовым практикам Docker.

Связь между образами Docker

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

У Docker есть три основных способа обойти это. Первый и наиболее распространенный способ — указать в Docker переменные среды, которые будут установлены внутри контейнера Docker. Затем код, работающий внутри контейнера Docker, будет проверять значения этих переменных среды при запуске и использовать их для правильной настройки.

Другим часто используемым методом является том данных Docker. Тома Docker бывают двух видов — внутренние и общие.

Указание внутреннего тома просто означает, что для папки, которую вы указываете для определенного контейнера Docker, данные будут сохраняться при удалении контейнера. Например, если вы хотите, чтобы файлы журналов сохранялись, вы можете указать внутренний том /var/log.

Общий том сопоставляет папку внутри контейнера Docker с папкой на хост-компьютере. Это позволяет легко обмениваться файлами между контейнером Docker и хост-компьютером.

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

Предпосылки

Чтобы следовать этой статье, вам понадобится следующее:

  • Сервер CentOS 7, настроенный пользователем без полномочий root с привилегиями sudo (подробности см. в разделе Начальная настройка сервера в CentOS 7)
  • Docker установлен с помощью инструкций из Шага 1 и Шага 2 Как установить и использовать Docker в CentOS 7

Как только они будут на месте, вы будете готовы следовать за ними.

Шаг 1 — Установка Docker Compose

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

Проверьте текущий выпуск и при необходимости обновите его с помощью команды ниже:

  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Затем установите разрешения, чтобы сделать бинарный исполняемый файл:

  1. sudo chmod +x /usr/local/bin/docker-compose

Затем убедитесь, что установка прошла успешно, проверив версию:

  1. docker-compose --version

Это распечатает версию, которую вы установили:

Output
docker-compose version 1.23.2, build 1110ad01

Теперь, когда у вас установлен Docker Compose, вы готовы запустить пример «Hello World».

Шаг 2 — Запуск контейнера с помощью Docker Compose

Общедоступный реестр Docker, Docker Hub, включает простой образ «Hello World» для демонстрации и тестирования. Он иллюстрирует минимальную конфигурацию, необходимую для запуска контейнера с помощью Docker Compose: файл YAML, который вызывает один образ.

Сначала создайте каталог для нашего файла YAML:

  1. mkdir hello-world

Затем перейдите в каталог:

  1. cd hello-world

Теперь создайте файл YAML с помощью вашего любимого текстового редактора. В этом руководстве будет использоваться Vi:

  1. vi docker-compose.yml

Войдите в режим вставки, нажав i, затем поместите в файл следующее содержимое:

my-test:
  image: hello-world

Первая строка будет частью имени контейнера. Вторая строка указывает, какой образ использовать для создания контейнера. Когда вы запускаете команду docker-compose up, она будет искать локальный образ по указанному имени, hello-world.

После этого нажмите ESC, чтобы выйти из режима вставки. Введите :x, затем ENTER, чтобы сохранить и выйти из файла.

Чтобы вручную просмотреть изображения в вашей системе, используйте команду docker images:

  1. docker images

Когда локальных изображений нет вообще, отображаются только заголовки столбцов:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE

Теперь, находясь в каталоге ~/hello-world, выполните следующую команду, чтобы создать контейнер:

  1. docker-compose up

При первом запуске команды, если нет локального образа с именем hello-world, Docker Compose извлечет его из общедоступного репозитория Docker Hub:

Output
Pulling my-test (hello-world:)... latest: Pulling from library/hello-world 1b930d010525: Pull complete . . .

После извлечения образа docker-compose создает контейнер, прикрепляет его и запускает программу hello, которая, в свою очередь, подтверждает, что установка работает:

Output
. . . Creating helloworld_my-test_1... Attaching to helloworld_my-test_1 my-test_1 | my-test_1 | Hello from Docker. my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 | . . .

Затем он напечатает объяснение того, что он сделал:

Output
. . . my-test_1 | To generate this message, Docker took the following steps: my-test_1 | 1. The Docker client contacted the Docker daemon. my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. my-test_1 | (amd64) my-test_1 | 3. The Docker daemon created a new container from that image which runs the my-test_1 | executable that produces the output you are currently reading. my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it my-test_1 | to your terminal. . . .

Контейнеры Docker работают только до тех пор, пока активна команда, поэтому после завершения работы hello контейнер останавливается. Следовательно, когда вы просматриваете активные процессы, отображаются заголовки столбцов, но контейнер hello-world не будет указан, поскольку он не запущен:

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Используйте флаг -a, чтобы показать все контейнеры, а не только активные:

  1. docker ps -a
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50a99a0beebd hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1

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

Шаг 3 — Изучение команд Docker Compose

Чтобы начать работу с Docker Compose, в этом разделе будут рассмотрены основные команды, которые поддерживает инструмент docker-compose.

Команда docker-compose работает для каждого каталога отдельно. У вас может быть несколько групп контейнеров Docker, работающих на одном компьютере — просто создайте один каталог для каждого контейнера и один файл docker-compose.yml для каждого каталога.

До сих пор вы запускали docker-compose up самостоятельно, из которого вы можете использовать CTRL-C, чтобы закрыть контейнер. Это позволяет отображать отладочные сообщения в окне терминала. Однако это не идеально; при работе в производственной среде более надежно использовать docker-compose как службу. Один простой способ сделать это — добавить параметр -d при up сеансе:

docker-compose up -d

docker-compose теперь будет переходить в фоновый режим.

Чтобы отобразить вашу группу контейнеров Docker (как остановленных, так и запущенных в данный момент), используйте следующую команду:

docker-compose ps -a

Если контейнер остановлен, State будет указано как Exited, как показано в следующем примере:

Output
Name Command State Ports ------------------------------------------------ hello-world_my-test_1 /hello Exit 0

Запущенный контейнер покажет Up:

Output
Name Command State Ports --------------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp

Чтобы остановить все запущенные контейнеры Docker для группы приложений, введите следующую команду в том же каталоге, где находится файл docker-compose.yml, который вы использовали для запуска группы Docker:

docker-compose stop

Примечание. docker-compose kill также доступен, если вам нужно завершить работу более принудительно.

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

docker-compose rm 

Если вы попробуете любую из этих команд из каталога, отличного от каталога, содержащего контейнер Docker и файл .yml, будет возвращена ошибка:

Output
ERROR: Can't find a suitable configuration file in this directory or any parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml

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

Шаг 4. Доступ к файловой системе контейнера Docker

Чтобы работать с командной строкой внутри контейнера и получить доступ к его файловой системе, вы можете использовать команду docker exec.

Пример «Hello World» завершает работу после запуска, поэтому, чтобы протестировать docker exec, запустите контейнер, который будет продолжать работать. Для целей этого руководства используйте образ Nginx из Docker Hub.

Создайте новый каталог с именем nginx и перейдите в него:

  1. mkdir ~/nginx
  2. cd ~/nginx

Затем создайте файл docker-compose.yml в новом каталоге и откройте его в текстовом редакторе:

  1. vi docker-compose.yml

Далее добавьте в файл следующие строки:

nginx:
  image: nginx

Сохраните файл и выйдите. Запустите контейнер Nginx как фоновый процесс с помощью следующей команды:

  1. docker-compose up -d

Docker Compose загрузит образ Nginx, и контейнер запустится в фоновом режиме.

Теперь вам понадобится ИДЕНТИФИКАТОР КОНТЕЙНЕРА для контейнера. Перечислите все запущенные контейнеры с помощью следующей команды:

  1. docker ps

Вы увидите что-то похожее на следующее:

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b86b6699714c nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 80/tcp nginx_nginx_1

Если вы хотите внести изменения в файловую систему внутри этого контейнера, вы должны взять его идентификатор (в этом примере b86b6699714c) и использовать docker exec для запуска оболочки внутри контейнера. контейнер:

  1. docker exec -it b86b6699714c /bin/bash

Параметр -t открывает терминал, а параметр -i делает его интерактивным. /bin/bash открывает оболочку bash для работающего контейнера.

Затем вы увидите приглашение bash для контейнера, похожее на:

root@b86b6699714c:/#

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

Заключение

Вы установили Docker Compose, протестировали установку, запустив пример «Hello World», и изучили некоторые основные команды.

В то время как пример «Hello World» подтвердил вашу установку, простая конфигурация не демонстрирует одно из основных преимуществ Docker Compose — возможность одновременно запускать и отключать группу контейнеров Docker. Docker Compose в действии, ознакомьтесь с Как настроить среду тестирования непрерывной интеграции с помощью Docker и Docker Compose в Ubuntu 16.04, Хотя эти руководства ориентированы на Ubuntu 16.04 и 18.04, шаги можно адаптировать для CentOS 7.