Docker - Container Linking

Введение в связывание контейнеров

Здравствуйте, начинающие энтузиасты Docker! Сегодня мы окунемся в захватывающий мир связывания контейнеров. Как ваш доброжелательный соседский компьютерный учитель, я здесь, чтобы провести вас через это путешествие, даже если вы никогда не писали ни строчки кода. Так что пристегнитесь и давайте отправимся в морское путешествие контейнеров!

Docker - Container Linking

Связывание контейнеров похоже на знакомство двух друзей на вечеринке. Оно позволяет контейнерам общаться друг с другом, делясь информацией и ресурсами. Представьте, что вы на фуршете (это наш Docker-хост), и каждому блюду (контейнеру) нужно знать, какие другие блюда доступны. Именно это мы делаем с помощью связывания контейнеров!

Why Container Linking Matters (Почему важно связывание контейнеров)

Вы можете задаться вопросом: "Зачем мне заботиться о связывании контейнеров?" Давайте расскажу вам一个小кую историю. Once upon a time, в数据中心 far, far away, приложения жили в изоляции. Они не могли общаться друг с другом, делиться данными или работать вместе. Это было одиночное существование. Но затем пришел связывание контейнеров и все изменилось!

Связывание контейнеров позволяет нам:

  1. Создавать сложные многоcontainer-приложения
  2. Делить данные между контейнерами
  3. Улучшать безопасность, изолируя услуги
  4. Легче масштабировать наши приложения

Основы связывания контейнеров

Давайте начнем с простого примера. Мы создадим два контейнера: веб-сервер и базу данных, и свяжем их вместе.

Шаг 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 делает несколько вещей для нас:

  1. Добавляет запись в файл /etc/hosts веб-контейнера
  2. Устанавливает переменные окружения в веб-контейнере
  3. Позволяет веб-контейнеру подключаться к контейнеру базы данных

Давайте заглянем внутрь нашего веб-контейнера, чтобы увидеть, что происходит:

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!

Преимущества пользовательских сетей

Пользовательские сети предлагают несколько преимуществ:

  1. Лучшая изоляция
  2. Автоматическое разрешение DNS
  3. Возможность подключать/отключать контейнеры от сетей на лету

Практический пример: 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