Предоставление сервиса базы данных Docker только во внутренней сети с Traefik - PullRequest
0 голосов
/ 15 февраля 2019

Допустим, я определил две службы "frontend" и "db" в моем docker-compose.yml, которые развернуты в рое Docker, то есть они также могут работать в разных стеках.С этой настройкой Traefik автоматически генерирует внешний и внутренний интерфейсы для каждого стека, что нормально.

Теперь у меня есть другой контейнер Docker, временно работающий в конвейере Jenkins, который должен иметь доступ к службе db в определенном стеке.,Моей первой идеей было показать сервис db, добавив его в сеть cluster-global-net, чтобы Traefik мог сгенерировать внешний интерфейс к серверу.Это в основном работает.

Но я бы хотел скрыть службу базы данных от «общедоступной», при этом все еще имея возможность подключать к ней другой контейнер Docker через его стек или имя службы, используя внутреннюю сеть «по умолчанию».

Можно ли это как-то сделать?

version: '3.6'

networks:
  default: {}
  cluster-global-net:
    external: true

services:
  frontend:
    image: frontend_image
    ports:
    - 8080
    networks:
    - cluster-global-net
    - default
    deploy:
      labels:
        traefik.port: 8080
        traefik.docker.network: cluster-global-net
        traefik.backend.loadbalancer.swarm: 'true'
        traefik.backend.loadbalancer.stickiness: 'true'
      replicas: 1
      restart_policy:
        condition: any

  db:
    image: db_image
    environment:
    - MYSQL_ALLOW_EMPTY_PASSWORD=false
    - MYSQL_DATABASE=db_schema
    - MYSQL_USER=db_user
    - MYSQL_PASSWORD=db_pass
    ports:
    - 3306
    volumes:
    - db_volume:/var/lib/mysql
    networks: 
    - default
    restart: on-failure
    deploy:
      labels:
        traefik.port: 3306
        traefik.docker.network: default

1 Ответ

0 голосов
/ 15 февраля 2019

Вам нужна сеть, в которой они оба развернуты, но которую никто не видит.

Чтобы сделать это, создайте сеть, добавьте ее в свою службу db и веб-интерфейс, а также во временную службу.И действительно, удалите метку traefik на БД, потому что они здесь больше не нужны.

EG:

...
networks:
  default: {}
  cluster-global-net:
    external: true
  db-net:
    external: true

services:
  frontend:
    image: frontend_image
    networks:
    - cluster-global-net
    - default
    - db-net
    deploy:
        ...

  db:
    image: db_image
    ...
    networks: 
    - default
    - db-net
    restart: on-failure
    #no labels


docker network create db-net 
docker stack deploy -c <mycompose.yml> <myfront>
docker service create --network db-net <myTemporaryImage> <temporaryService>

Затем временная служба кактакже, как внешний интерфейс может достичь базы данных через db: 3306

Кстати: вам не нужно открывать порт для внешнего интерфейса, так как traefik получит к нему внутренний доступ (trafik.port),

РЕДАКТИРОВАТЬ : новый пример с сетью, созданной из файла компоновки.

...
networks:
  default: {}
  cluster-global-net:
    external: true
  db-net: {}

services:
  frontend:
    image: frontend_image
    networks:
    - cluster-global-net
    - default
    - db-net
    deploy:
        ...

  db:
    image: db_image
    ...
    networks: 
    - default
    - db-net
    restart: on-failure
    #no labels


docker stack deploy -c <mycompose.yml> someStackName
docker service create --network someStackName_db-net <myTemporaryImage> <temporaryService>
...