Знаете ли вы, что вы можете использовать имя сервиса контейнера или идентификатора для подключения к нему на Docker?
Если вы использовали --Линк
Опция при запуске контейнера или Docker составляется, вы можете вызвать контейнер по его названию или идентификатору от других контейнеров. Но как эта работа?
Ответ прост: DNS.
Всякий раз, когда вы запускаете контейнер, Docker предоставляет вам сеть для вас и использует службу DNS, предоставляемой Docker Daemon.
Вы можете переопределить сеть докеров по умолчанию и настройки DNS Проверьте документы здесь
Предположим, что у вас есть 3-х уровневое применение: Frontend, Backend и база данных.
Ваша бэкэнда должна быть в состоянии подключиться к базе данных. Самый безопасный способ сделать это — сохранить вашу базу данных в частной сети для подключения к ней.
С докером вы можете использовать наименование услуги или Контейнер ID Как имя сервера в вашем файле конфигурации.
Бывший.:
cn = mysql.connect(user='produser', password='secretvalue', host='svc_database', # this is the service name in the incoming example database='mysuperapp')
Клонировать следующий репозиторий, используя команду ниже:
Git Clone Git@github.com: GDI3D/Docker-DNS.GIT.
Теперь посмотрите на файл Docker-Compose.yml
В репозитории вы только что клонировали.
version: "3.9" # optional since v1.27.0 services: svc_frontend: image: busybox:latest command: top svc_database: image: busybox:latest command: top svc_backend: image: busybox:latest command: top
Вы можете увидеть три Услуги, определенные:
- svc_frontend : Приложение внешний интерфейс
- svc_database : База данных приложений
- svc_backend : Backend приложение
Чтобы облегчить все возможное, мы используем Anybox Image для имитации услуг.
Запустите контейнеры, используя Docker-Compose Up -D
Отказ
Вы можете проверить, что контейнеры используют докер PS.
Мы собираемся проверить следующее:
- Где работает сервис Docker DNS (IP-адрес)
- Попробуйте пинговать контейнер по имени и идентификатору службы.
- Разрешены ли запросы Docker DNS Service?
Это наши контейнеры с их именем и идентификаторами обслуживания:
1ee9c76938ee | svc_frontend |
fe0228bd99a5. | svc_database. |
A96E0CB74351. | svc_backend. |
Где находится сервис DNS DNS?
Давайте доступ к svc_backend Контейнер и тип Cat/etc/resolv.conf.
Здесь вы можете увидеть, что Imserver был указан на 127.0.0.11 Отказ Это сервис Docker DNS, предоставленный Docker Daemon.
Pro Tip: вам не нужно вводить весь идентификатор контейнера для выполнения операции, просто используйте первые два или три символа
Попробуйте пинговать контейнер по имени сервиса и идентификатор
Вы можете проверить подключение к svc_database Использование команды Ping:
Как вы можете видеть, мы получаем тот же ответ при вызове его именем его обслуживания svc_database или Docker ID FE0228BD99A5 Отказ
Они оба решают к тому же IP 172.19.0.3 как и ожидалось.
Разрешены ли запросы от Docker DNS Service?
Давайте использовать Nslookup Чтобы получить подробный отчет о том, что происходит, когда мы пытаемся вызвать контейнер по имени или идентификатору или идентификатором.
Запуск этих двух команд даст нам лучшее понимание того, что происходит: nslookup svc_database
и nslookup fe0228bd99a5.
Server: 127.0.0.11 Address: 127.0.0.11:53 Non-authoritative answer: Name: svc_database Address: 172.23.0.2 -------------------------- Server: 127.0.0.11 Address: 127.0.0.11:53 Non-authoritative answer: Name: fe0228bd99a5 Address: 172.19.0.3
Из результатов Nslookups мы можем видеть, что запрос сделан с использованием службы Docker DNS в 127.0.0.11, и что, опять же, используя имя обслуживания svc_database или контейнер ID FE0228BD99A5 Место назначения одинаковый IP 172.19.0.3
Если вы хотите узнать больше о том, как работает Docker Networking, вы можете проверить Официальная документация
Оригинал: «https://dev.to/gdi3d/how-to-connect-docker-containers-4hai»