Как настроить доступ только для определенных сервисов в docker-compose в сети?

  • 31 августа 2023 г. 12:57
Ответы на вопрос 3
Для ограничения доступа между контейнерами в сети docker-compose можно использовать ограничения сети, а также настройки правил доступа на уровне контейнеров.

1. Ограничения сети:
   - Создайте отдельную сеть для ваших контейнеров в файле docker-compose.yml:

     ```yaml
     version: '3'
     services:
       app:
         ...
         networks:
           - my_network

       db:
         ...
         networks:
           - my_network

       web:
         ...
         networks:
           - my_network

       web2:
         ...
         networks:
           - my_network

     networks:
       my_network:
     ```

   - Добавьте ограничения сети для каждого сервиса в файле docker-compose.yml:

     ```yaml
     version: '3'
     services:
       app:
         ...
         networks:
           my_network:
             aliases:
               - app

       db:
         ...
         networks:
           my_network:
             labels:
               - "com.docker.network.access_policy=container:app"

       web:
         ...
         networks:
           my_network:
             labels:
               - "com.docker.network.access_policy=container:db"

       web2:
         ...
         networks:
           my_network:
             labels:
               - "com.docker.network.access_policy=container:app"

     networks:
       my_network:
     ```

   - В данном примере контейнер "web" имеет доступ к контейнеру "db" (указано в labels), а контейнер "web2" имеет доступ только к контейнеру "app" (указано в labels).

2. Настройка правил доступа на уровне контейнеров:

   - Добавьте правила доступа в конфигурацию контейнера "db" в файле docker-compose.yml:

     ```yaml
     version: '3'
     services:
       db:
         ...
         security_opt:
           - "label:com.docker.network.access_policy=container:app"

     ```

   - В данном примере контейнер "db" имеет доступ только к контейнеру "app".

Примечание: Данный подход ограничивает доступ между контейнерами только на уровне сети, что означает, что если вы запустите другие контейнеры, они могут получить доступ к другим контейнерам в сети. Если вам нужно ограничить доступ более точно, можно использовать более сложные подходы, например, настройку файервола внутри контейнера "web2".
Добавить дополнительную сеть и распределить сервисы по сетям. 
 
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    driver: custom-driver-1
  backend:
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
Похожие вопросы