Связывание контейнеров с помощью Link

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

Введение

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

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

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

Задача

Ваша цель — подготовить 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, чтобы они могли обмениваться данными. Этот механизм является ключевым для создания многокомпонентных систем.

Задача

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

Требования

  • Вам понадобятся два контейнера: один с 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)]>
✨ Проверить решение и практиковаться

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

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

Задача

Запустите три контейнера: Apache, MySQL и кастомное приложение. Приложение должно иметь доступ как к базе данных MySQL, так и к веб-серверу Apache.

Требования

  • Три контейнера: Apache, MySQL и ваше приложение.
  • Установленный 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. Используйте curl для проверки доступа к Apache изнутри контейнера приложения.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
✨ Проверить решение и практиковаться

Резюме

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