Docker - Container Linking
Введение в связывание контейнеров
Здравствуйте, начинающие энтузиасты Docker! Сегодня мы окунемся в захватывающий мир связывания контейнеров. Как ваш доброжелательный соседский компьютерный учитель, я здесь, чтобы провести вас через это путешествие, даже если вы никогда не писали ни строчки кода. Так что пристегнитесь и давайте отправимся в морское путешествие контейнеров!
Связывание контейнеров похоже на знакомство двух друзей на вечеринке. Оно позволяет контейнерам общаться друг с другом, делясь информацией и ресурсами. Представьте, что вы на фуршете (это наш Docker-хост), и каждому блюду (контейнеру) нужно знать, какие другие блюда доступны. Именно это мы делаем с помощью связывания контейнеров!
Why Container Linking Matters (Почему важно связывание контейнеров)
Вы можете задаться вопросом: "Зачем мне заботиться о связывании контейнеров?" Давайте расскажу вам一个小кую историю. Once upon a time, в数据中心 far, far away, приложения жили в изоляции. Они не могли общаться друг с другом, делиться данными или работать вместе. Это было одиночное существование. Но затем пришел связывание контейнеров и все изменилось!
Связывание контейнеров позволяет нам:
- Создавать сложные многоcontainer-приложения
- Делить данные между контейнерами
- Улучшать безопасность, изолируя услуги
- Легче масштабировать наши приложения
Основы связывания контейнеров
Давайте начнем с простого примера. Мы создадим два контейнера: веб-сервер и базу данных, и свяжем их вместе.
Шаг 1: Создание контейнера базы данных
Сначала мы создадим наш контейнер базы данных. Мы будем использовать MySQL для этого примера.
docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=secret mysql:latest
Разберем это:
-
-d
: Запускать контейнер в фоновом режиме -
--name mydb
: Даем нашему контейнеру имя -
-e MYSQL_ROOT_PASSWORD=secret
: Устанавливаем переменную окружения для пароля root -
mysql:latest
: Используем 最新ую версию образа MySQL
Шаг 2: Создание контейнера веб-сервера
Теперь создадим наш веб-серверный контейнер и свяжем его с базой данных.
docker run -d --name myweb --link mydb:db -p 80:80 nginx:latest
Вот что происходит:
-
--link mydb:db
: Это магия! Мы связываем нашmydb
контейнер и называем егоdb
внутри нашего веб-контейнера -
-p 80:80
: Прокидываем порт 80 на хосте на порт 80 в контейнере
Понимание связи
Когда мы используем опцию --link
, Docker делает несколько вещей для нас:
- Добавляет запись в файл
/etc/hosts
веб-контейнера - Устанавливает переменные окружения в веб-контейнере
- Позволяет веб-контейнеру подключаться к контейнеру базы данных
Давайте заглянем внутрь нашего веб-контейнера, чтобы увидеть, что происходит:
docker exec -it myweb bash
Once inside, мы можем проверить файл /etc/hosts
:
cat /etc/hosts
Вы должны увидеть запись для db
контейнера с его IP адресом.
Переменные окружения
Docker также устанавливает переменные окружения для нас. Давайте перечислим их:
env | grep DB_
Вы увидите переменные, такие как DB_PORT
, DB_NAME
, и т.д. Это упрощает нашим приложениям подключение к базе данных.
Устаревшее связывание vs. Пользовательские сети
Теперь у меня есть признание. Флаг --link
, который мы только что использовали, на самом деле считается устаревшим в Docker. Это как использовать кнопочный телефон в эпоху смартфонов - он работает, но есть лучшие варианты.
Современный способ связывания контейнеров - использовать пользовательские сети. Давайте посмотрим, как это работает:
Шаг 1: Создание сети
docker network create mynetwork
Шаг 2: Запуск контейнеров в сети
docker run -d --name mydb --network mynetwork -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker run -d --name myweb --network mynetwork -p 80:80 nginx:latest
Теперь наши контейнеры могут общаться, используя имена в качестве хостов, без какого-либо explicit linking!
Преимущества пользовательских сетей
Пользовательские сети предлагают несколько преимуществ:
- Лучшая изоляция
- Автоматическое разрешение DNS
- Возможность подключать/отключать контейнеры от сетей на лету
Практический пример: WordPress и MySQL
Давайте применим наши знания к реальному примеру: настройка WordPress с MySQL.
Шаг 1: Создание сети
docker network create wordpress-network
Шаг 2: Запуск контейнера MySQL
docker run -d --name wordpress-db --network wordpress-network -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspassword mysql:5.7
Шаг 3: Запуск контейнера WordPress
docker run -d --name wordpress-site --network wordpress-network -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress:latest
Теперь, если вы зайдете на http://localhost:8080
в вашем браузере, вы должны увидеть страницу настройки WordPress!
Заключение
Поздравляю! Вы только что сделали свои первые шаги в мир связывания контейнеров. Мы covered много информации, от базового связывания до пользовательских сетей и даже настроили реальный сайт WordPress с использованием контейнеров.
Помните, что связывание контейнеров - это о том, чтобы позволить нашим приложениям работать вместе в гармонии. Это как дирижировать оркестром - каждый контейнер - это инструмент, и когда они правильно связаны, они создают красивую музыку вместе.
Продолжая ваше путешествие с Docker, продолжайте экспериментировать с различными контейнерами и вариантами сетей. Чем больше вы практикуетесь, тем комфортнее вы будете чувствовать себя с этими концепциями.
Счастливо контейнеризируйте, и пусть ваши Docker-образы всегда успешно компилируются!
Credits: Image by storyset