Перейти к содержимому

Как запустить docker compose

  • автор:

Запуск подмножества служб Compose

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

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

Дополнительные сведения о профилях Docker Compose см. в разделе Использование профилей с Compose.

Необходимые компоненты

  • Visual Studio 2019 версии 16.10 или более поздней.
  • Решение .NET с Согласованием контейнеров с Docker Compose.
  • Visual Studio 2022, Visual Studio 2019 версии 16.10 или более поздней.
  • Решение .NET с Согласованием контейнеров с Docker Compose.

Управление параметрами запуска

Рассмотрим следующий проект Docker Compose, в котором docker-compose.yml имеет пять служб и три профиля Compose (web, web1 и web2).

version: '3.9' services: webapplication1: image: $webapplication1 profiles: [web, web1] build: context: . dockerfile: WebApplication1/Dockerfile webapplication2: image: $webapplication2 profiles: [web, web2] build: context: . dockerfile: WebApplication2/Dockerfile webapplication3: image: $webapplication3 profiles: [web] build: context: . dockerfile: WebApplication3/Dockerfile external1: image: redis external2: image: redis 

Диалоговое окно параметров запуска Docker Compose можно открыть несколькими способами:

    В Visual Studio выберите Отладка>Управление параметрами запуска Docker Compose.

Screenshot of Debug Manage Compose Settings menu item

Screenshot of Debug Manage Compose Settings menu item

Screenshot of the context menu item

Screenshot of the context menu item

В приведенном ниже примере выбирается профиль Compose web1 , который фильтрует список Службы до трех из пяти включенных в этот профиль:

Раздел профилей Docker Compose отображается только в том случае, если в файлах docker-compose.yml определены профили.

В следующем примере показано, как выбирать отдельные службы вместо фильтрации служб в профиле создания. Здесь мы покажем, как будет выглядеть диалоговое окно, если создать новый профиль запуска с именем test2 , который запускает только две из пяти служб, webapplication1 при отладке и webapplication2 без отладки. Этот профиль запуска также запускает браузер при запуске приложения и открывает его на домашней странице webapplication1 .

Screenshot of launch settings dialog with some services deselected

Эти сведения будут сохранены в launchSettings.json, как показано ниже.

< "profiles": < "test2": < "commandName": "DockerCompose", "composeLaunchServiceName": "webapplication1", "serviceActions": < "external1": "DoNotStart", "external2": "DoNotStart", "webapplication1": "StartDebugging", "webapplication2": "StartWithoutDebugging", "webapplication3": "DoNotStart" >, "composeLaunchAction": "LaunchBrowser", "commandVersion": "1.0", "composeLaunchUrl": "://localhost:" > > > 

Создание профиля запуска, использующего профиль Docker Compose

Кроме того, можно дополнительно настроить поведение при запуске, создав профили запуска Visual Studio, которые используют профили Compose.

Чтобы создать другой профиль, который использует профиль Compose, выберите Использовать профили Docker Compose, а затем web1 . Теперь профиль запуска включает три службы: webapplication1 (которая принадлежит к профилям Compose web и web1 ) external1 и external2 . По умолчанию службы без исходного кода, такие как external1 и external2 , имеют действие по умолчанию Запуск без отладки. Приложения .NET с исходным кодом будут по умолчанию запускать отладку.

Если служба не задает профиль Compose, она будет включена во все профили Compose.

Screenshot of launch settings dialog with another profile created

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

< "profiles": < "test1": < "commandName": "DockerCompose", "composeProfile": < "includes": [ "web1" ] >, "commandVersion": "1.0" > > > 

Можно также изменить действие webapplication1 на Запуск без отладки. Параметры в launchSettings.json этом примере выглядят следующим образом:

 < "profiles": < "test1": < "commandName": "DockerCompose", "composeProfile": < "includes": [ "web1" ], "serviceActions": < "webapplication1": "StartWithoutDebugging" >>, "commandVersion": "1.0" > > > 

Свойства

Ниже приведено описание каждого свойства в launchSettings.json:

Свойство Description
Commandname Имя команды. По умолчанию используется «DockerCompose».
commandVersion Номер версии, используемый для управления схемой профиля запуска DockerCompose.
composeProfile Родительское свойство, дающее определение профиля запуска. Его дочерними свойствами являются includes и serviceActions .
composeProfile — включает Список имен профилей Compose, составляющих профиль запуска.
composeProfile — serviceActions Список выбранных профилей Compose, служб и действия запуска каждой службы.
serviceActions Выводит список выбранных служб и действие запуска.
composeLaunchAction Указывает действие запуска, выполняемое при нажатии F5 или CTRL+F5. Допустимые значения: None, LaunchBrowser и LaunchWCFTestClient.
composeLaunchUrl URL-адрес, используемый при запуске браузера. Допустимые токены замены: «», «» и «». Пример: ://:
composeLaunchServiceName Позволяет указать службу, используемую для замены токенов в composeLaunchUrl.

Следующие шаги

Дополнительные сведения о том, как работают средства контейнеров, см. в обзоре Обзор создания и отладки средств контейнеров Visual Studio.

См. также

  • Параметры запуска средств контейнеров Visual Studio
  • Параметры сборки Docker Compose

Как запустить docker-compose.yml

Всем привет. Есть vagrant, в котором установлен docker и docker-composer. Есть файл docker-compose.yml Как его запустить?

Отслеживать
задан 9 фев 2017 в 14:47
599 1 1 золотой знак 3 3 серебряных знака 18 18 бронзовых знаков
зайти в папку с docker-compose.yml и написать docker-compose up . А что делать с vagrant — не знаю
9 фев 2017 в 14:50
docker-compose.yml находится внутри vagrant box или во вне?
9 фев 2017 в 16:39

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Нужно набрать команду docker-compose up

Отслеживать
ответ дан 9 фев 2017 в 14:55
599 1 1 золотой знак 3 3 серебряных знака 18 18 бронзовых знаков

зачем используете вагрант? в линуксе всё нативно работает, а для винды и мака есть Kitematic (работает через виртуалбокс) и офф сборка через Hyper-V виртуализацию https://www.docker.com/community-edition

в хостовой машине можно будет всё запускать не заморачиваясь

# запускаем все контейнеры, видим stdout всех контейнеров, а для остановки используем Ctrl+C docker-compose up # запуск в режиме демона docker-compose up -d # для остановки используем docker-compose stop # для остановки с удалением контейнеров docker-compose down 

Руководство по Docker Compose для начинающих

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

image

Что такое Docker Compose?

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

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

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

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

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

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

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

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

Типичный сценарий использования Docker Compose

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

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

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

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

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

Разработка клиент-серверного приложения с использованием Docker Compose

Теперь, когда вы знаете о том, для чего мы собираемся использовать Docker Compose, пришло время создать ваше первое клиент-серверное приложение с использованием этого инструмента. А именно, речь идёт о разработке небольшого веб-сайта (сервера) на Python, который умеет выдавать файл с фрагментом текста. Этот файл у сервера запрашивает программа (клиент), тоже написанная на Python. После получения файла с сервера программа выводит текст, хранящийся в нём, на экран.

Обратите внимание на то, что мы рассчитываем на то, что вы владеете основами Docker, и на то, что у вас уже установлена платформа Docker.

Приступим к работе над проектом.

▍1. Создание проекта

Для того чтобы построить ваше первое клиент-серверное приложение, предлагаю начать с создания папки проекта. Она должна содержать следующие файлы и папки:

  • Файл docker-compose.yml . Это файл Docker Compose, который будет содержать инструкции, необходимые для запуска и настройки сервисов.
  • Папка server . Она будет содержать файлы, необходимые для обеспечения работы сервера.
  • Папка client . Здесь будут находиться файлы клиентского приложения.
. ├── client/ ├── docker-compose.yml └── server/ 2 directories, 1 file

▍2. Создание сервера

Тут мы, в процессе создания сервера, затронем некоторые базовые вещи, касающиеся Docker.

2a. Создание файлов

Перейдите в папку server и создайте в ней следующие файлы:

  • Файл server.py . В нём будет находиться код сервера.
  • Файл index.html . В этом файле будет находиться фрагмент текста, который должно вывести клиентское приложение.
  • Файл Dockerfile . Это — файл Docker, который будет содержать инструкции, необходимые для создания окружения сервера.
. ├── Dockerfile ├── index.html └── server.py 0 directories, 3 files
2b. Редактирование Python-файла.

Добавим в файл server.py следующий код:

#!/usr/bin/env python3 # Импорт системных библиотек python. # Эти библиотеки будут использоваться для создания веб-сервера. # Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python. import http.server import socketserver # Эта переменная нужна для обработки запросов клиента к серверу. handler = http.server.SimpleHTTPRequestHandler # Тут мы указываем, что сервер мы хотим запустить на порте 1234. # Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose. with socketserver.TCPServer(("", 1234), handler) as httpd: # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента. httpd.serve_forever()

Этот код позволяет создать простой веб-сервер. Он будет отдавать клиентам файл index.html , содержимое которого позже будет выводиться на веб-странице.

2c. Редактирование HTML-файла

В файл index.html добавим следующий текст:

Docker-Compose is magic!

Этот текст будет передаваться клиенту.

2d. Редактирование файла Dockerfile

Сейчас мы создадим простой файл Dockerfile , который будет отвечать за организацию среды выполнения для Python-сервера. В качестве основы создаваемого образа воспользуемся официальным образом, предназначенным для выполнения программ, написанных на Python. Вот содержимое Dockerfile:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа. # Для этого используется ключевое слово 'FROM'. # Здесь нам нужно импортировать образ python (с DockerHub). # В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'. FROM python:latest # Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'. # Для того чтобы это сделать, мы используем ключевое слово 'ADD'. # Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере. # Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе. # Здесь мы помещаем файл в папку образа '/server/'. ADD server.py /server/ ADD index.html /server/ # Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас. # Она позволяет изменить рабочую директорию образа. # В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'. WORKDIR /server/

Теперь займёмся работой над клиентом.

▍3. Создание клиента

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

3a. Создание файлов

Перейдите в папку вашего проекта client и создайте в ней следующие файлы:

  • Файл client.py . Тут будет находиться код клиента.
  • Файл Dockerfile . Этот файл играет ту же роль, что и аналогичный файл в папке сервера. А именно, он содержит инструкцию, описывающую создание среды для выполнения клиентского кода.
. ├── client.py └── Dockerfile 0 directories, 2 files
3b. Редактирование Python-файла

Добавим в файл client.py следующий код:

#!/usr/bin/env python3 # Импортируем системную библиотеку Python. # Она используется для загрузки файла 'index.html' с сервера. # Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python. import urllib.request # Эта переменная содержит запрос к 'http://localhost:1234/'. # Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'. # localhost указывает на то, что программа работает с локальным сервером. # 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода. fp = urllib.request.urlopen("http://localhost:1234/") # 'encodedContent' соответствует закодированному ответу сервера ('index.html'). # 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран). encodedContent = fp.read() decodedContent = encodedContent.decode("utf8") # Выводим содержимое файла, полученного с сервера ('index.html'). print(decodedContent) # Закрываем соединение с сервером. fp.close()

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

3c. Редактирование файла Dockerfile

Как и в случае с сервером, мы создаём для клиента простой Dockerfile , ответственный за формирование среды, в которой будет работать клиентское Python-приложение. Вот код клиентского Dockerfile :

# То же самое, что и в серверном Dockerfile. FROM python:latest # Импортируем 'client.py' в папку '/client/'. ADD client.py /client/ # Устанавливаем в качестве рабочей директории '/client/'. WORKDIR /client/

▍4. Docker Compose

Как вы могли заметить, мы создали два разных проекта: сервер и клиент. У каждого из них имеется собственный файл Dockerfile . До сих пор всё происходящее не выходит за рамки основ работы с Docker. Теперь же мы приступаем к работе с Docker Compose. Для этого обратимся к файлу docker-compose.yml , расположенному в корневой папке проекта.

Обратите внимание на то, что тут мы не стремимся рассмотреть абсолютно все команды, которые можно использовать в docker-compose.yml . Наша главная цель — разобрать практический пример, дающий вам базовые знания по Docker Compose.

Вот код, который нужно поместить в файл docker-compose.yml :

# Файл docker-compose должен начинаться с тега версии. # Мы используем "3" так как это - самая свежая версия на момент написания этого кода. version: "3" # Следует учитывать, что docker-composes работает с сервисами. # 1 сервис = 1 контейнер. # Сервисом может быть клиент, сервер, сервер баз данных. # Раздел, в котором будут описаны сервисы, начинается с 'services'. services: # Как уже было сказано, мы собираемся создать клиентское и серверное приложения. # Это означает, что нам нужно два сервиса. # Первый сервис (контейнер): сервер. # Назвать его можно так, как нужно разработчику. # Понятное название сервиса помогает определить его роль. # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'. server: # Ключевое слово "build" позволяет задать # путь к файлу Dockerfile, который нужно использовать для создания образа, # который позволит запустить сервис. # Здесь 'server/' соответствует пути к папке сервера, # которая содержит соответствующий Dockerfile. build: server/ # Команда, которую нужно запустить после создания образа. # Следующая команда означает запуск "python ./server.py". command: python ./server.py # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234. # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера), # мы должны организовать перенаправление этого порта на порт компьютера. # Сделать это нам поможет ключевое слово 'ports'. # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера] # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом # 1234 контейнера (так как именно на этот порт сервер # ожидает поступления запросов). ports: - 1234:1234 # Второй сервис (контейнер): клиент. # Этот сервис назван 'client'. client: # Здесь 'client/ соответствует пути к папке, которая содержит # файл Dockerfile для клиентской части системы. build: client/ # Команда, которую нужно запустить после создания образа. # Следующая команда означает запуск "python ./client.py". command: python ./client.py # Ключевое слово 'network_mode' используется для описания типа сети. # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера. network_mode: host # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис, # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы. # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'. depends_on: - server

▍5. Сборка проекта

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

$ docker-compose build

▍6. Запуск проекта

Теперь, когда проект собран, пришло время его запустить. Этот шаг нашей работы соответствует шагу, на котором, при работе с отдельными контейнерами, выполняется команда docker run :

$ docker-compose up

После выполнения этой команды в терминале должен появиться текст, загруженный клиентом с сервера: Docker-Compose is magic! .

Как уже было сказано, сервер использует порт компьютера 1234 для обслуживания запросов клиента. Поэтому, если перейти в браузере по адресу http://localhost:1234/, в нём будет отображена страница с текстом Docker-Compose is magic! .

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

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

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

$ docker-compose down

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

$ docker-compose logs -f [service name]

Например, в нашем проекте её можно использовать в таком виде: $ docker-compose logs -f [service name] .

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

$ docker-compose ps

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

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

Например, она может выглядеть так: docker-compose exec server ls .

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

$ docker-compose images

Итоги

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

Уважаемые читатели! Пользуетесь ли вы Docker Compose в своих проектах?

  • Блог компании RUVDS.com
  • Веб-разработка
  • Виртуализация

Продвинутая работа с Docker — Docker-compose

Что такое Docker-compose?

Docker-compose — это надстройка над докером, приложение написанное на Python, которое позволяет запускать множество контейнеров одновременно и маршрутизировать потоки данных между ними. Для каждого проекта (кластера контейнеров) Docker создаёт свою сеть, где контейнеры могут обращаться друг к другу по именам, которые мы укажем в docker-compose.yml. Все настройки запуска кластера контейнеров находятся в этом же файле, который располагается в корневой директории проекта. Docker-compose.yml мало чем похож на знакомые нам уже docker-файлы. В отличие от них, docker-compose.yml записан не в декларативном ini-стиле как docker-файлы, а в древовидном YAML. Если вы ещё не знакомы с YAML — рекомендуем потратить 10-15 минут и ознакомиться с нашим кратким мануалом по YAML. С ним всё нижеизложенное станет куда более понятным.

Создаем проект для запуска в Docker-compose

Создаем проект для запуска в Docker-compose

Наш проект состоит из двух связанных контейнеров: Nginx и php. Структура нашего проекта выглядит так:

Структура проекта

  • www — каталог содержит index.html, index.php, подкаталог phpinfo. Эти файлы нужны для корректной работы Nginx и php-fpm. www также скопировано в каталоги nginx и php, из которых будут собираться контейнеры;
  • nginx — директория содержит конфигурационный файл nginx custom.conf, Dockerfile, по которому будет собираться nginx-контейнер и подкаталог www (копию корневого www), который будет скопирован в контейнер для проверки работоспособности и подменен в будущем;
  • php — директория содержит Dockerfile по которому будет собираться php-контейнер и аналогичный подкаталог www.

Такая структура проекта продиктована логикой сборки проекта. Сначала собираются образы Nginx и php из docker-файлов, расположенных в одноименных директориях, затем запускаются контейнеры в соответствии с инструкциями в Docker-compose.yml

Dockerfile Nginx

FROM nginx:mainline-alpine #Берем родительский образ Nginx
EXPOSE 80 # Открываем 80 порт
COPY custom.conf /etc/nginx/conf.d #Подменяем конфиг Nginx conf.d в контейнере на custom.conf
COPY ./www /var/www #Копируем содержимое www в /var/www
CMD [«nginx», «-g», «daemon off;»] #Запускаем Nginx как процесс.

Dockerfile php

FROM php:7.4-fpm #Берем родительский образ php:7.4-fpm
EXPOSE 9000 #Открываем 9000 порт
WORKDIR /var/www/ # Устанавливаем рабочим каталогом контейнера /var/www/
COPY ./www/ /var/www/ #Копируем содержимое хостового каталога www в директорию var/www/
CMD [«php-fpm»] #Выполняем команду php-fpm

В Docker-файле Nginx есть два ключевых момента для нашего проекта, которые нужно разобрать:

  • инструкция COPY custom.conf /etc/nginx/conf.d копирует custom.conf из локальной папки nginx и подменяет им conf.d в контейнере Nginx. Без него Nginx не отработает.
  • инструкция CMD с параметром [«nginx», «-g», «daemon off;»] запускает Nginx как процесс, а не как демон.

Кстати, в составлении Docker-файлов есть свои best practice. О некоторых из них, вы можете узнать из нашего небольшого мануала по оптимизации сборки Docker-образов.

Теперь, чтобы были понятны наши следующие действия нужно обратиться к настройкам Nginx, тому самому конфигурационному файлу custom.conf, которым мы подменяли стандартный conf.d, находящийся в Nginx-контейнере.

Внутри custom.conf выглядит так:

server < listen 80;
server_name 5.101.77.54;
root /var/www;
index index.html index.php;
location ~ \.php$ try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
>
>

Нас интересуют следующие параметры:

  • server_name — имя сервера, к которому мы обращаемся. В нашем случае, это IP-адрес нашей VPS.
  • root — корневая папка, в которой Nginx будет искать файлы для исполнения. Мы её будем подменять в дальнейшем через docker-compose.yml для визуализации процесса разработки.
  • fastcgi_pass php:9000 — проброс запроса на отдачу динамического контента в контейнер php на порт 9000.

Со структурой проекта, docker-файлами и настройками Nginx разобрались. Переходим к ключевому — разбираемся с docker-compose.yml.

docker-compose.yml — центр управления полётами

docker-compose.yml

Docker-compose файл описывает процесс загрузки и настройки контейнеров. Разберём Docker-compose.yml, который мы подготовили для нашего проекта. Код нашего файла выглядит так:

version: «2.3» #Задаем версию docker-compose.yml
services: #Задаем контейнеры
nginx: #Задаем название первого контейнера — nginx и настраиваем его
build: ./nginx #Указываем откуда будет вестись сборка
ports: # Указываем какие порты нужно пробросить наружу
— «80:80»
volumes: #Подключаем рабочий каталог с кодом проекта
— ./www:/var/www
depends_on: #Устанавливаем последовательность загрузки контейнеров
php: # php-контейнер запуститься раньше Nginx
condition: service_healthy #Устанавливаем условия при котором запуститься контейнер nginx
php: #Задаем название первого контейнера — php и настраиваем его
build: ./php #Указываем откуда будет вестись сборка
volumes: #Подключаем тот же рабочий каталог с кодом проекта
— ./www:/var/www
healthcheck: #Проверка работы приложения внутри контейнера
test: [«CMD»,»php-fpm»,»-t»] #Команда теста, которую мы хотим выполнить
interval: 3s #Интервал попыток запуска теста
timeout: 5s #Отложенность запуска команды
retries: 5 #Количество повторений
start_period: 1s #Через сколько стартовать тест после запуска контейнера

Наш Docker-compose.yml невелик, однако он может быть огромным и иметь сложную структуру из разных типов организации данных: строк, списков, словарей. По началу даже в не очень сложном Docker-compose.yml можно наделать ошибок, которые на глаз не видны, поэтому перед запуском сборки проекта — проверьте код, каким-нибудь YAML-валидатором, например, yamllint.

В начале файла мы задали инструкцию version со значением 2.3 — это сделано специально, так как разные версии Docker-compose.yml содержат разный набор инструкций. Так в версии 3 нет инструкции healthcheck, а она критически важна для нас в этом проекте.

Инструкция healthcheck (блок php-контейнера) позволяет нам проверить работоспособность приложения в контейнере, указав с помощью другой инструкции test команду для тестирования. Смежные инструкции interval, timeout, retries, start_period устанавливают временные условия выполнения инструкции test.

Следующая логически связанная с healthcheck инструкция — depends_on (блок nginx-контейнера) — контроль порядка запуска. Логика работы depends_on такова: пока успешно не закончатся все действия указанные в блоке condition над контейнером заданным выше строчкой, контейнер, в котором расположена инструкция depends_on не запустится.

В нашем случае пока успешно не выполнится тест php-контейнера, Nginx-контейнер не запустится. Это сделано для правильной очередности загрузки инфраструктурных элементов нашего проекта.

depends_on: #Устанавливаем последовательность загрузки контейнеров
php: # php-контейнер запуститься раньше Nginx
condition: service_healthy #Устанавливаем условия при котором запуститься контейнер nginx

Скажем еще несколько слов об инструкциях build и volumes:

  • build — указывает на директорию из которой будет собран контейнер, в ней должен быть dockerfile;
  • volumes — прокидывает локальную папку в контейнер. В нашем случае все изменения внесенные в файлы директории www будут автоматически доступны в контейнерах по пути /var/www.

Обратимся к логической блок-схеме для полного понимания процесса сборки и запуска нашего проекта, а потом перейдём непосредственно к сборке проекта.

Схема взаимодействия структурных элементов проекта и их свойств

Схема взаимодействия структурных элементов проекта и их свойств

Теперь, когда мы понимаем внутренние взаимосвязи внутри проекта — настало время его собрать. Для запуска контейнеров через docker-compose используются следующие команды:

  • docker-compose build — собрать проект
  • docker-compose up -d — запустить проект
  • docker-compose down — остановить проект
  • docker-compose logs -f [service name] — посмотреть логи сервиса
  • docker-compose ps — вывести список контейнеров
  • docker-compose exec [service name] [command» — выполнить команду в контейнере
  • docker-compose images — список образов

Находясь в корневом каталоге проекта вызовем команду docker-compose up -d. Вот какие действия будут выполнены docker-compose: 1) Сборка образа php; 2) Сборка образа Nginx; 3) Запуск контейнера php; 4) Тест php; 5) Запуск контейнера Nginx. Проверим, запустились контейнеры командой docker ps. В ответ команда вернет сообщение следующего вида:

Вывод docker ps

Если запустились не все контейнеры — введите docker ps -a и docker logs . Вывод будет содержать коды и наименования ошибок. В нашем случае оба контейнера запустились и работают на нужных портах.

Проверим работу Nginx и php с помощью команды curl:

curl -I http://5.101.77.54/ 2>/dev/null | head -n 1 | cut -d$’ ‘ -f2
curl -I http://5.101.77.54/phpinfo/ 2>/dev/null | head -n 1 | cut -d$’ ‘ -f2

В обоих случаях curl нам вернул код ответа 200. Это значит, что Nginx нашёл нужную страницу и отдал ее нам.

На этом сборка и тестирование проекта завершена, можно подводить итоги.

Что получается в итоге

Итог

Docker-compose — это система сборки, запуска и управления множеством контейнеров. Docker-compose не входит в единый пакет поставки Docker и устанавливается отдельно. Для сборки кластера контейнеров используется docker-compose.yml.

Docker-compose.yml — конфигурационный файл в YAML-формате, описывающий логику запуска и взаимодействия контейнеров между собой и внешним миром. В сущности инструкции заложенные в docker-compose.yml по логике работы идентичны ключам команды docker run.

На первое место при работе с Docker-compose выходит структура проекта. Она должна следовать правилам работы Docker-контейнеров — в одном контейнере должен быть только один процесс. Хорошей практикой является составление процессной карты взаимодействия элементов вашего проекта между собой и её перенос на логику работы Docker-compose.

В статье мы показали базовые возможности и основные взаимодействия с docker-compose, которых вполне будет достаточно для самостоятельной практики и экспериментов. Лучше всего для этого использовать заранее подготовленные виртуальные серверы.

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

Введение в Docker

Введение в Docker

Разбираемся в том, что такое Docker, из каких компонентов состоит и какие технологии контейнеризации использует.

История контейнеризации

История контейнеризации

Краткая история контейнеризации и разбор конкретных технологий: chroot, jail, namespaces и cgroups.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *