Соединение контейнеров с помощью Link

DockerBeginner
Практиковаться сейчас

Введение

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

Создание образа с помощью Dockerfile

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

Задача

Цель этого этапа — создать Dockerfile для вашего образа my-app.

Требования

  • На вашей машине должен быть установлен Docker.
  • У вас должно быть готовое приложение my-app, которое вы хотите поместить в контейнер.

Пример результата

  1. Создайте необходимые файлы для выполнения задания:

    Создайте новый файл с именем 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.2
    
    labex: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
    
  2. Используйте команду docker build для сборки образа my-app.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Запустите новый контейнер, используя образ 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
    
  4. Откройте веб-браузер и перейдите по адресу http://localhost:8080, чтобы убедиться, что ваше приложение работает корректно.

    Веб-приложение, запущенное в браузере

Связывание двух контейнеров Docker

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

Задача

Свяжите контейнер веб-сервера Apache с контейнером базы данных MySQL.

Требования

  • Вам понадобятся два контейнера Docker: один с запущенным Apache, другой с MySQL.
  • На вашей машине должен быть установлен Docker.

Подсказка

  • Не забудьте открыть новый терминал для выполнения этого шага, чтобы он не конфликтовал с предыдущим контейнером.

Пример результата

Доступ к MySQL из контейнера Apache:

  1. Запустите контейнер 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
    
  2. Запустите контейнер 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
    
  3. Свяжите контейнер 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
    
  4. Используйте команду 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.

Пример результата

  1. Запустите контейнеры Apache и MySQL, как описано на этапе 2.

  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
    
  3. Войдите в my_app2, установите curl и выполните curl http://apache/, чтобы подтвердить, что связанный контейнер Apache доступен.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

Резюме

В этом задании вы узнали, как связывать контейнеры Docker для создания многоконтейнерных приложений. Мы прошли путь от одного контейнера к связанным парам и, наконец, к настройке из трех контейнеров. Теперь вы понимаете, как использовать связи контейнеров и команду docker exec для обеспечения взаимодействия между различными сервисами, что позволит вам создавать более сложные приложения. Продолжайте экспериментировать и получайте удовольствие!

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться