Вступление
Docker - отличный инструмент для автоматизации развертывания приложений Linux внутри программных контейнеров, но для полного использования его потенциала лучше всего, если каждый компонент вашего приложения будет работать в собственном контейнере. Для сложных приложений с большим количеством компонентов организация всех контейнеров для запуска и выключения вместе (не говоря уже о том, чтобы общаться друг с другом) может быстро стать громоздкой.
Сообщество Docker разработало популярное решение под названиемFig, которое позволяет использовать один файл YAML для оркестровки всех ваших контейнеров и конфигураций Docker. Это стало настолько популярным, что команда Docker решила создатьDocker Compose на основе исходного кода Fig, который теперь устарел. Docker Compose облегчает пользователям управление процессами контейнеров Docker, включая запуск, завершение работы и настройку внутриконтейнерного связывания и томов.
В этом руководстве вы установите последнюю версию Docker Compose, которая поможет вам управлять многоконтейнерными приложениями, и изучите основные команды программного обеспечения.
Docker и Docker составляют концепции
Использование Docker Compose требует сочетания нескольких различных концепций Docker в одном, поэтому прежде чем мы начнем, давайте уделим минуту, чтобы рассмотреть различные используемые концепции. Если вы уже знакомы с такими понятиями Docker, как тома, ссылки и переадресация портов, то вы можете перейти к следующему разделу.
Docker Images
Каждый контейнер Docker является локальным экземпляром образа Docker. Вы можете думать об образе Docker как о полной установке Linux. Обычно минимальная установка содержит только минимум пакетов, необходимых для запуска образа. Эти образы используют ядро хост-системы, но поскольку они работают внутри контейнера Docker и видят только свою собственную файловую систему, вполне возможно запустить дистрибутив, такой как CentOS, на хосте Ubuntu (или наоборот).
Большинство образов Docker распространяется черезDocker Hub, который поддерживается командой Docker. В большинстве популярных проектов с открытым исходным кодом соответствующее изображение загружено в реестр Docker, который можно использовать для развертывания программного обеспечения. Когда это возможно, лучше всего брать «официальные» изображения, так как команда Docker гарантирует, что они будут следовать рекомендациям Docker.
Связь между изображениями Docker
Контейнеры Docker изолированы от хост-компьютера, что означает, что по умолчанию хост-компьютер не имеет доступа ни к файловой системе внутри контейнера Docker, ни к каким-либо средствам связи с ним через сеть. Это может затруднить настройку и работу с образом, работающим внутри контейнера Docker.
У Docker есть три основных способа обойти это. Первым и наиболее распространенным является то, что Docker задает переменные среды, которые будут установлены внутри контейнера Docker. Код, выполняющийся внутри контейнера Docker, затем при запуске проверяет значения этих переменных среды и использует их для правильной настройки.
Другой часто используемый метод - этоDocker data volume. Тома Docker бывают двух видов - внутренний и общий.
Указание внутреннего тома просто означает, что для папки, которую вы указываете для определенного контейнера Docker, данные будут сохраняться при удалении контейнера. Например, если вы хотите убедиться, что ваши файлы журналов сохраняются, вы можете указать внутренний том/var/log
.
Общий том сопоставляет папку внутри контейнера Docker с папкой на хост-компьютере. Это позволяет вам легкоshare files между контейнером Docker и хост-машиной.
Третий способ связи с контейнером Docker - через сеть. Docker обеспечивает связь между различными контейнерами Docker черезlinks
, а также перенаправление портов, что позволяет перенаправлять порты из контейнера Docker на порты на хост-сервере. Например, вы можете создать ссылку, чтобы ваши контейнеры WordPress и MariaDB Docker могли общаться друг с другом и использовать переадресацию портов, чтобы выставить WordPress для внешнего мира, чтобы пользователи могли к нему подключаться.
Предпосылки
Чтобы следовать этой статье, вам понадобится следующее:
-
Сервер CentOS 7, настроенный пользователем без полномочий root с привилегиями sudo (подробности см. ВInitial Server Setup on CentOS 7)
-
Докер устанавливается в соответствии с инструкциями из Шага 1 и Шага 2How To Install and Use Docker on CentOS 7
Как только они будут на месте, вы будете готовы следовать.
[[step-1 -—- install-docker-compose]] == Шаг 1. Установка Docker Compose
Чтобы получить последний выпуск, возглавьтеDocker docs и установите Docker Compose из двоичного файла в репозитории Docker на GitHub.
Проверьтеcurrent release и, при необходимости, обновите его с помощью команды ниже:
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».
[[step-2 -—- running-a-container-with-docker-compose]] == Шаг 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
, затем поместите в файл следующее содержимое:
docker-compose.yml
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.
[[step-3-— learning-docker-compose-commands]] == Шаг 3. Изучение команд создания Docker
Чтобы начать работу с 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
[.note] #Note: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 и работать из командной строки внутри вашего контейнера, процесс, который описан в следующем разделе.
[[step-4-— accessing-the-docker-container-filesystem]] == Шаг 4. Доступ к файловой системе контейнера Docker
Для работы в командной строке внутри контейнера и доступа к его файловой системе вы можете использовать командуdocker exec
.
Пример «Hello World» завершается после запуска, поэтому для проверкиdocker exec
запустите контейнер, который будет продолжать работать. Для целей этого руководства используйтеNginx image из Docker Hub.
Создайте новый каталог с именемnginx
и перейдите в него:
mkdir ~/nginx
cd ~/nginx
Затем создайте файлdocker-compose.yml
в своем новом каталоге и откройте его в текстовом редакторе:
vi docker-compose.yml
Затем добавьте следующие строки в файл:
~/nginx/docker-compose.yml
nginx:
image: nginx
Сохраните файл и выйдите. Запустите контейнер Nginx как фоновый процесс с помощью следующей команды:
docker-compose up -d
Docker Compose загрузит образ Nginx, и контейнер запустится в фоновом режиме.
Теперь вам понадобитсяCONTAINER ID
для контейнера. Перечислите все контейнеры, которые работают с помощью следующей команды:
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 в действии, ознакомьтесь сHow To Secure a Containerized Node.js Application with Nginx, Let’s Encrypt, and Docker Compose иHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04. Хотя эти руководства ориентированы на Ubuntu 16.04 и 18.04, шаги могут быть адаптированы для CentOS 7.