Понимание изоляции сети Docker - PullRequest
0 голосов
/ 01 марта 2019

Я создал следующий файл docker-compose ...

version: '3'

services:
  db-service:
    image: postgres:11
    volumes:
      - ./db:/var/lib/postgresql/data
    expose: 
      - 5432
    environment:
      - POSTGRES_PASSWORD=mypgpassword
    networks:
      - net1
  pgadmin:
    image: dpage/pgadmin4
    volumes:
      - ./pgadmin:/var/lib/pgadmin
    ports:
      - 5000:80
    environment:
      - PGADMIN_DEFAULT_EMAIL=me@gmail.com
      - PGADMIN_DEFAULT_PASSWORD=mypass
    networks:
      - net1
networks:
  net1:
    external: false

После прочтения различных документов на сайте докера я ожидал, что контейнер pgadmin сможет получить доступ к контейнеру postgres через порт5432, но я не могу получить доступ к postgres напрямую с хоста.Тем не менее, я могу использовать psql для доступа к базе данных с хост-машины.

На самом деле, если я закомментирую строки expose и ports, я все равно смогу получить доступ к обоим контейнерам с хоста.

Что мне не хватает в этом?

EDIT - IЯ получаю доступ к контейнеру, выполнив сначала docker container inspect..., чтобы получить IP-адрес.Для контейнера postgres, который я использую

psql -h xxx.xxx.xxx.xxx -U postgres

Он запрашивает у меня пароль, а затем позволяет мне делать все, что вы ожидаете.

В случае контейнера pgadminЯ указываю своему браузеру на IP-адрес и получаю интерфейс pgadmin.

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

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Контейнеры соединяются друг с другом по мостовой сети net1.

Когда вы выставляете порт, вы создаете переадресацию портов в ваших IPTABLES для соединения с хост-сетью и net1.

Прекращаете выставлять порт 5432 вваш db-сервис, и вы видите, что не можете подключиться с вашего хоста к db-сервису.

0 голосов
/ 01 марта 2019

Docker назначает внутренний IP-адрес каждому контейнеру.Если у вас есть этот адрес и он доступен, то Docker не предпринимает никаких действий, чтобы отключить его.В частности, на хосте Linux, если конкретная сеть Docker находится на 172.17.0.0/24, хост может иметь адрес 172.17.0.1, а конкретный контейнер может быть 172.17.0.2, и они могут общаться друг с другом таким образом.

Использование внутренних IP-адресов Docker не рекомендуется. Если вы когда-либо удаляете и воссоздаете контейнер, его IP-адрес изменится;на некоторых платформах хоста вы не можете получить прямой доступ к частным IP-адресам даже с одного хоста;частные IP-адреса никогда не будут доступны с других хостов.При обычном использовании никогда не требуется docker inspect контейнер.

Важный уровень изоляции, который вы здесь получаете, заключается в том, что контейнер недоступен для других хостов, если вы явно не опубликуетепорт (опция docker run -p, опция Docker Compose ports:).Настройки здесь гораздо более единообразны, чем для стандартных приложений: настройте приложение внутри контейнера на прослушивание 0.0.0.0 («все интерфейсы хоста», обычно по умолчанию), а затем опубликуйте порт или нет, как того требуют ваши потребности.Если хост имеет несколько интерфейсов, вы можете опубликовать порт только на одном из них (даже если приложение изначально не поддерживает это).

0 голосов
/ 01 марта 2019

docker-compose создает сеть для этих двух контейнеров, чтобы иметь возможность общаться друг с другом при запуске через службу DNS, которая будет содержать указатели на каждую службу по имени.

Таким образом, изС точки зрения контейнера pgadmin, сервер базы данных может быть доступен под именем хоста db-service (потому что именно так вы назвали свою службу в файле docker-compose.yml).

Таким образом, трафик не идетчерез хост, как вы предполагали, но через вышеупомянутую сеть.

Для доказательства, docker exec -it [name-of-pg-admin-container] /bin/sh и введите: ping db-service.Вы увидите, что докер обеспечивает разрешение DNS и что вы даже можете открыть соединение с обычным портом postgres.

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