Как установить и использовать 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.
Проверьте текущий выпуск и при необходимости обновите его с помощью команды ниже:
- 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
Затем установите разрешения, чтобы сделать бинарный исполняемый файл:
- sudo chmod +x /usr/local/bin/docker-compose
Затем убедитесь, что установка прошла успешно, проверив версию:
- docker-compose --version
Это распечатает версию, которую вы установили:
Outputdocker-compose version 1.23.2, build 1110ad01
Теперь, когда у вас установлен Docker Compose, вы готовы запустить пример «Hello World».
Шаг 2 — Запуск контейнера с помощью Docker Compose
Общедоступный реестр Docker, Docker Hub, включает простой образ «Hello World» для демонстрации и тестирования. Он иллюстрирует минимальную конфигурацию, необходимую для запуска контейнера с помощью Docker Compose: файл YAML, который вызывает один образ.
Сначала создайте каталог для нашего файла YAML:
- mkdir hello-world
Затем перейдите в каталог:
- cd hello-world
Теперь создайте файл YAML с помощью вашего любимого текстового редактора. В этом руководстве будет использоваться Vi:
- vi docker-compose.yml
Войдите в режим вставки, нажав i
, затем поместите в файл следующее содержимое:
my-test:
image: hello-world
Первая строка будет частью имени контейнера. Вторая строка указывает, какой образ использовать для создания контейнера. Когда вы запускаете команду docker-compose up
, она будет искать локальный образ по указанному имени, hello-world
.
После этого нажмите ESC
, чтобы выйти из режима вставки. Введите :x
, затем ENTER
, чтобы сохранить и выйти из файла.
Чтобы вручную просмотреть изображения в вашей системе, используйте команду docker images
:
- docker images
Когда локальных изображений нет вообще, отображаются только заголовки столбцов:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
Теперь, находясь в каталоге ~/hello-world
, выполните следующую команду, чтобы создать контейнер:
- docker-compose up
При первом запуске команды, если нет локального образа с именем hello-world
, Docker Compose извлечет его из общедоступного репозитория Docker Hub:
OutputPulling 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
не будет указан, поскольку он не запущен:
- docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Используйте флаг -a
, чтобы показать все контейнеры, а не только активные:
- docker ps -a
OutputCONTAINER 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
, будет возвращена ошибка:
OutputERROR:
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
и перейдите в него:
- mkdir ~/nginx
- cd ~/nginx
Затем создайте файл docker-compose.yml
в новом каталоге и откройте его в текстовом редакторе:
- vi docker-compose.yml
Далее добавьте в файл следующие строки:
nginx:
image: nginx
Сохраните файл и выйдите. Запустите контейнер Nginx как фоновый процесс с помощью следующей команды:
- docker-compose up -d
Docker Compose загрузит образ Nginx, и контейнер запустится в фоновом режиме.
Теперь вам понадобится ИДЕНТИФИКАТОР КОНТЕЙНЕРА
для контейнера. Перечислите все запущенные контейнеры с помощью следующей команды:
- 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
для запуска оболочки внутри контейнера. контейнер:
- 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.