Свяжите контейнеры с помощью ссылки

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/start -.-> lab-49351{{"Свяжите контейнеры с помощью ссылки"}} docker/exec -.-> lab-49351{{"Свяжите контейнеры с помощью ссылки"}} docker/images -.-> lab-49351{{"Свяжите контейнеры с помощью ссылки"}} docker/network -.-> lab-49351{{"Свяжите контейнеры с помощью ссылки"}} docker/build -.-> lab-49351{{"Свяжите контейнеры с помощью ссылки"}} end

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

Web app running in browser
✨ Проверить решение и практиковаться

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

    Добро пожаловать в монитор MariaDB. Команды заканчиваются ; или \g.
    Ваш идентификатор соединения MySQL - 8
    Версия сервера: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab и другие.
    
    Введите 'help;' или '\h', чтобы получить справку. Введите '\c', чтобы очистить текущее вводимое выражение.
    
    MySQL [(none)]>
✨ Проверить решение и практиковаться

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

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

Задача

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

Требования

  • Вам понадобятся три контейнера Docker: 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 для создания многоконтейнерных приложений. Мы начали с одного контейнера, перешли к связанным парам и, наконец, до трехконтейнерной конфигурации. Теперь вы понимаете, как использовать связи между контейнерами и команду docker exec, чтобы обеспечить взаимодействие между различными сервисами, что позволяет вам создавать более сложные приложения. Продолжайте экспериментировать и веселиться!