Сопоставление портов Docker и имена хостов - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть вопрос, или, лучше сказать, есть два. И то, и другое зависит от Docker и связано с пониманием того, как docker работает с именами хостов и портами контейнеров.

Допустим, у меня есть две службы, которые работают в другом контейнере Docker и открывают порт 80 от контейнера до порта 8081 (service1) и порта 8082 (service2):

service1: 8081: 80 сервис2: 8082: 80

Теперь мне ясно, что с точки зрения хоста я могу получить доступ к этим службам с помощью открытых портов (http://localhost:8081 и http://localhost:8082). Но что, если я хочу получить доступ к своим службам с помощью контейнеры типа http://container1 и http://container2? Что мне нужно сделать, чтобы понять смысл этого сценария:

  • как может быть переадресация порта
  • и как мне узнать точное имя хоста, чтобы я мог разрешить имена хостов контейнеров с хост-машины докера?

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 ноября 2018

Как сказал Иджаз Ахмад Хан. Вы должны использовать другой контейнер внутри этой сети в качестве прокси, например, nginx.

Если вы выставляете порты с docker-compose на хост-компьютер (ваш компьютер), он виден только как локальный домен с указанным портом. Если вы запустите docker-compose.yml так:

version: "3"
services:
  service1:
    image: something
    name: service1_name
    ports:
      - "8081:80"
  service2:
    image: something
    name: service2_name
    ports:
      - "8082:80"

Docker-compose создаст сеть по умолчанию, названную папкой в ​​docker-compose.yml с суффиксом _default. В этой сети все контейнеры могут видеть друг друга. Команда expose используется для контейнеров внутри этой сети (чтобы они могли видеть друг друга и общаться), port используется для публикации на хост-машине (вашем компьютере). Это значит:

service1 отображается на вашем компьютере как http://localhost:8081 для других контейнеров в сети как service1:80.

service2 отображается на вашем компьютере как http://localhost:8082 для других контейнеров в сети как service2:80.

Обратите внимание, что указанное имя контейнера не влияет на сетевой адрес службы. Чтобы проверить, что контейнеры видны только внутри сети, попробуйте пропинговать их из другого контейнера

docker run --rm --network=your_folder_name_default debian ping service1

Чтобы проверить, в какой сети работают ваши контейнеры, вы можете использовать inspect

docker inspect service1_name

Теперь вы должны использовать имя контейнера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...