Привязка сервиса / процесса к интерфейсу в случае выставления его в докере - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы понять, как внутренний порт в Docker работает, а именно я хотел бы знать, какие интерфейсы на хосте используются. Давайте рассмотрим три случая:

(1)

docker run -p 80:80 nginx

(2) dokcer-compose: для Docker Swarm

....
services:
    ports:
        published: 80
        target: 80       
....

Обратите внимание, что в этом случае мы используем overlay сеть. (3) dokcer-compose: для Рой Docker

....
services:
    ports:
        published: 80
        target: 80       
        mode: host
....

Прежде всего, давайте выделим тот факт, что это зависит от процесса в контейнере, какой интерфейс он выберет связывать. Однако, где это связано в хосте? Я имею в виду, какой интерфейс (lo, eth0 ..) выбран в качестве интерфейса для привязки?

В частности, в чем разница между подходом (2) и (3)?

Редактировать
Давайте рассмотрим четвертый случай:
(4)

`dokcer-compose:` for *docker swarm*

....
services:
  s1:
    ports:
        published: 1234
        target: 1234       
        mode: host
    networks:
        n1
  s2:
    ports:
        published: 1234
        target: 1234       
        mode: host
    networks:
        n1
networks:
  n1:
    driver: overlay

, где s1 и s2 вынуждены развертываться на разных узлах (с использованием ограничений). Теперь давайте предположим, что s1 говорит с s2 и s2 говорит с s1, используя порт 1234 и:
(1) IP-адрес службы (или название службы) (2) IP-адрес хоста (физический адрес).

Скажите пожалуйста, если в случае (1) или (2) используется оверлейная сеть n1. Обратите внимание, что обе службы подключены к этой сети.

1 Ответ

0 голосов
/ 28 июня 2018

Вы должны четко получить свои ответы в документации

https://docs.docker.com/engine/swarm/services/#publish-a-services-ports-directly-on-the-swarm-node

В вашем случае (2)

services:
    ports:
        published: 80
        target: 80  

Если у вас есть 3 узла N1,N2,N3, то нажатие 80 на любом из 3 узлов приведет вас к приложению, даже если оно только развернуто на одном узле N3, допустим.

В Case (3)

services:
    ports:
        published: 80
        target: 80       
        mode: host

Поскольку служба развернута только на N3, вы получите доступ к 80 только на N3, N1 и N2 не будут отвечать на порт 80

...