Введение
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.
Требования
- Вам понадобятся два контейнера Docker: один с запущенным Apache, другой с MySQL.
- На вашей машине должен быть установлен Docker.
Подсказка
- Не забудьте открыть новый терминал для выполнения этого шага, чтобы он не конфликтовал с предыдущим контейнером.
Пример результата
Доступ к MySQL из контейнера Apache:
Запустите контейнер 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Свяжите контейнер Apache с контейнером MySQL. Примечание: На этом этапе прямой вывод команды не ожидается, но связь будет видна в переменных окружения контейнера. Вы можете проверить контейнер с помощью команды
docker inspect my_apache.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(вам нужно будет адаптировать команду, если вы настроили связи иначе).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. - Установите
curlвнутриmy_app2перед тестированием соединения с Apache, так как образmy-appпо умолчанию его не содержит. - На вашей машине должен быть установлен Docker.
Пример результата
Запустите контейнеры 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 для обеспечения взаимодействия между различными сервисами, что позволит вам создавать более сложные приложения. Продолжайте экспериментировать и получайте удовольствие!



