Ограничить доступ к Интернету - Контейнер для докеров

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

easy for your reference

Только container4 подключается к Интернету; остальные три общаются только через container4 с внешним миром. Например, если container1 требуется поддержка smtp, он отправит запрос smtp в container4 для получения доступа.

Ни один контейнер, кроме container4, не должен иметь прямого доступа к Интернету! Это должно применяться на уровне Docker.

Я полагаю, что это будет настраиваться при создании Docker Network, кто-нибудь может объяснить, как этого добиться?

Ответ 1

Создание сети для доступа в Интернет

Сеть докеров сети --subnet = 172.19.0.0/16 internet

Создание сети для блокировки доступа в Интернет

сеть докеров сети --internal --subnet 10.1.1.0/24 no-internet

Если вы хотите подключить контейнер докеров в интернет

docker network connect internet container-name

Если вы хотите заблокировать доступ в Интернет

docker network connect no-internet container-name

Примечание

во внутренней сети мы не можем открывать порты для подключения внешнего мира, пожалуйста, обратитесь к этому вопросу для более подробной информации

Ответ 2

Как оказалось здесь, я получил это для работы с docker-compose. Сохранить как docker-compose.yml:

version: '3'

services:
  outgoing-wont-work:
    image: alpine
    networks:
      - no-internet
    command: ping -c 3 google.com # will crash

  internal-will-work:
    image: alpine
    networks:
      - no-internet
    command: ping -c 3 internal-and-external

  internal-and-external:
    image: alpine
    networks:
      - no-internet
      - internet
    command: ping -c 3 google.com

networks:
  no-internet:
    driver: bridge
    internal: true
  internet:
    driver: bridge

Затем запустите docker-compose up -d, docker-compose ps через несколько секунд покажет что-то вроде этого:

              Name                            Command               State    Ports
----------------------------------------------------------------------------------
dco_inet_internal-and-external_1   ping -c 3 google.com             Exit 0        
dco_inet_internal-will-work_1      ping -c 3 internal-and-ext ...   Exit 0        
dco_inet_outgoing-wont-work_1      ping -c 3 google.com             Exit 1      

Ответ 3

Вы слышали о Docker Compose? Это простой способ управлять несколькими контейнерами и имеет отличную поддержку сети:

https://docs.docker.com/compose/overview/

https://docs.docker.com/compose/networking/

Пример docker-compose.yml в вашем случае (непроверенный):

version: '2'

services:
  container1:
    image: ...
    container_name: container1
    networks:
      - container1

  container2:
    image: ...
    container_name: container2
    networks:
      - container2

  container3:
    image: ...
    container_name: container3
    networks:
      - container3

  container4:
    image: ...
    container_name: container4
    ports:
      - "80:80"
    networks:
      - container1
      - container2
      - container3

networks:
  container1:
  container2:
  container3:

Таким образом, имя хоста контейнеров будет похоже на определенный container_name.