внутренняя и внешняя сеть с docker-compose? - PullRequest
0 голосов
/ 19 мая 2019

Предположим, у меня есть 2 контейнера докеров: (A) shinyapptest - это интерфейс, который должен взаимодействовать с (B) testapi и быть доступным для внешнего мира.

Для этого я создал сеть backend, выполнив следующую команду:

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 backend

Затем shinyapptest делает свои вызовы API для "http://192.168.0.1:3098.

Чтобы все заработало, я написал следующее docker-compose:

version: '3.7'
services:
    shinyapptest:
      container_name: testshiny
      image: testshiny
      restart: unless-stopped
      networks:
            - frontend
            - backend
      ports:
          - 80:3838
    testapi:
      container_name: testapi
      image: testapi
      restart: unless-stopped
      networks:
            - backend
      ports:
          - 3098:3098
networks:
  backend:
    external:
      name: backend
  frontend:
    external:
      name: frontend

Это правильно?По сути, я хочу, чтобы (A) имел доступ к (B), а внешний мир имел доступ к (A), но не (B).Если это правильно, как мне создать сеть frontend?Прямо сейчас, если я пытаюсь запустить docker-compose up, я получаю эту ошибку, потому что сеть не существует:

$ docker-compose up
ERROR: Network frontend declared as external, but could not be found. Please create the network manually using `docker network create frontend` and try again.

1 Ответ

1 голос
/ 19 мая 2019

На самом деле вам даже не нужна сеть frontend.Если вы подключите сеть backend к обоим контейнерам, они смогут взаимодействовать друг с другом.Так же, как 2 компьютера в одной сети.

Если вы не хотите, чтобы контейнер был доступен извне, просто не отображайте соответствующий порт обратно в хост-систему.Это будет держать их изолированными.

В настоящее время ваш API имеет открытый порт 3098.Если вы удалите это, но подключите сеть к обоим контейнерам, вы сможете вызывать порт 3098 внутри вашего контейнера frontend, но не извне.

Вы можете даже использовать назначенное имя контейнерадля внутренней связи, вот так:

http://testapi:3098/...

Надеюсь, это поможет.

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