Введение
Docker — мощный инструмент для развёртывания приложений, но поначалу он может показаться сложным. В этом задании вы научитесь связывать контейнеры Docker и создавать многоконтейнерное приложение. Сначала мы рассмотрим простые примеры, а затем постепенно перейдём к более сложному приложению. Даже если вы только начинаете работать с Docker, вам будет легко следовать этим инструкциям. Вы узнаете, как организовать взаимодействие контейнеров друг с другом — это основа создания надёжных приложений с помощью Docker.
Создание образа с помощью Dockerfile
Прежде чем связывать контейнеры, необходимо иметь хотя бы одно контейнеризированное приложение. На этом шаге вы создадите Dockerfile для образа my-app. Этот Dockerfile задаст окружение и приложение, которое будет запускаться внутри контейнера.
Задания
Цель этого шага — создать Dockerfile для образа my-app.
Требования
- Docker должен быть установлен на вашем компьютере.
- У вас должно быть готовое приложение
my-app, которое вы хотите поместить в контейнер.
Подсказки
- Перед сборкой образа и запуском контейнера задайте входные данные образа.
Пример результата
Создайте необходимые для задания файлы:
Создайте новый файл
Dockerfileпо пути/home/labex/project/со следующим содержимым:- Используйте
python:3.7-slimв качестве базового образа. - Установите рабочий каталог
/app. - Скопируйте содержимое текущего каталога в контейнер, в
/app. - Установите необходимые пакеты.
- Откройте порт
80для внешнего доступа. - Задайте переменную окружения (в этом примере она не используется, но эту инструкцию нужно сохранить).
- Запускайте
app.pyпри старте контейнера.
Создайте файл
app.pyв каталоге проекта/home/labex/project/со следующим содержимым:import os os.system("wssh --address='0.0.0.0' --port=80")Создайте файл
requirements.txtв каталоге проекта/home/labex/project/со следующим содержимым:webssh==1.6.2labex:project/ $ pwd /home/labex/project labex:project/ $ ll total 12K -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt- Используйте
Используйте команду
docker build, чтобы собрать образmy-app.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBЗапустите новый контейнер на основе образа
my-appи обратите внимание на сопоставление портов.labex:project/ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcpОткройте веб-браузер и перейдите по адресу
http://localhost:8080, чтобы убедиться, что приложение работает правильно.
Связывание двух контейнеров Docker
Теперь, когда у нас есть контейнеризированное приложение, перейдём к связыванию контейнеров. На этом шаге вы узнаете, как связать два контейнера Docker, чтобы они могли обмениваться данными. Это важный этап при создании многосервисных приложений в Docker.
Задания
Запустите контейнеры служб Apache и MySQL, затем запустите контейнер my_app, связанный с обеими службами, чтобы проверить подключение к MySQL изнутри my_app.
Требования
- Вам понадобятся два контейнера Docker: один с Apache и один с MySQL.
- Запустите дополнительный контейнер
my_app, связанный с контейнерами Apache и MySQL. - Перед проверкой подключения к базе данных установите клиент MySQL внутри
my_app. - Docker должен быть установлен на вашем компьютере.
Подсказки
- Откройте новый терминал для выполнения этого шага, чтобы он не конфликтовал с предыдущим контейнером.
Пример результата
Получите доступ к MySQL из контейнера my_app после связывания его с обеими службами:
Запустите контейнер Apache с именем
my_apacheна основе образаhttpd, сопоставив порт80хоста с портом80контейнера.labex:project/ $ docker ps | grep my_apache a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcpЗапустите контейнер MySQL с именем
my_mysql, задав для переменной окруженияMYSQL_ROOT_PASSWORDзначениеpasswordи используя образmysql.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlЗапустите контейнер
my_app, связанный с контейнерами MySQL и Apache. Примечание: связь отображается в конфигурации контейнера. Проверить её можно с помощьюdocker inspect my_app.labex:project/ $ docker ps | grep my_app 859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_appИспользуйте команду
docker exec, чтобы открыть интерфейс командной строки MySQL из контейнераmy_app(если связь настроена иначе, команду потребуется изменить).Установите клиент MySQL внутри
my_app, затем подключитесь к связанной службе MySQL:labex:project/ $ docker exec -it my_app bash root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client root@859c201b7267:/app## mysql -h mysql -uroot -ppassword Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.3.0 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
Связывание нескольких контейнеров Docker и использование переменных окружения
Продолжая предыдущий шаг, добавим две новые идеи: один контейнер приложения будет связан с обеими службами, а параметры подключения будут передаваться в контейнер через переменные окружения. На шаге 2 вы только доказали, что связанные контейнеры могут обращаться друг к другу. На этом шаге необходимо запустить my_app2 с обоими параметрами --link и переменными окружения, описывающими узлы MySQL и Apache.
Задания
Запустите три контейнера: один с Apache, один с MySQL и один с пользовательским приложением. Пользовательское приложение должно иметь доступ и к MySQL, и к Apache.
Требования
- Вам понадобятся три контейнера Docker: Apache, MySQL и пользовательское приложение.
- Запустите
my_app2с обеими связями и следующими переменными окружения:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordиAPACHE_HOST=apache. - Перед проверкой подключения к Apache установите
curlвнутриmy_app2, поскольку образmy-appпо умолчанию его не содержит. - Docker должен быть установлен на вашем компьютере.
Подсказки
- Повторно используйте контейнеры служб из шага 2. Если нужно проверить связи или переменные окружения, изучите новый контейнер приложения.
Пример результата
Запустите контейнеры Apache и MySQL, как описано на шаге 2.
Запустите пользовательский контейнер приложения с именем
my_app2, который сможет обращаться и к MySQL, и к Apache.labex:project/ $ docker ps | grep app2 8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2Войдите в
my_app2, установитеcurlи выполнитеcurl http://apache/, чтобы убедиться, что связанный контейнер Apache доступен.<html> <body> <h1>It works!</h1> </body> </html>
Итоги
В этом задании вы научились связывать контейнеры Docker для создания многоконтейнерных приложений. Мы перешли от одного контейнера к связанным парам, а затем к конфигурации из трёх контейнеров. Теперь вы понимаете, как использовать связи контейнеров и команду docker exec, чтобы обеспечить взаимодействие разных служб и создавать более сложные приложения. Продолжайте экспериментировать и получайте удовольствие!



