Соединение контейнеров с помощью 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, затем запустите контейнер my_app, связанный с обеими службами, чтобы проверить подключение к MySQL изнутри my_app.

Требования

  • Вам понадобятся два контейнера Docker: один с Apache и один с MySQL.
  • Запустите дополнительный контейнер my_app, связанный с контейнерами Apache и MySQL.
  • Перед проверкой подключения к базе данных установите клиент MySQL внутри my_app.
  • Docker должен быть установлен на вашем компьютере.

Подсказки

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

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

Получите доступ к MySQL из контейнера my_app после связывания его с обеими службами:

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

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

  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, чтобы обеспечить взаимодействие разных служб и создавать более сложные приложения. Продолжайте экспериментировать и получайте удовольствие!

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