仅使用Traefik在内部网络上公开Docker数据库服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅使用Traefik在内部网络上公开Docker数据库服务相关的知识,希望对你有一定的参考价值。

假设我在我的docker-compose.yml中定义了两个服务“frontend”和“db”,它们部署到Docker swarm,即它们也可以在不同的堆栈中运行。有了这个设置,Traefik会自动生成每个堆栈的前端和后端,这很好。

现在我在Jenkins管道中暂时运行另一个Docker容器,该容器应该能够访问特定堆栈中的db服务。我的第一个想法是通过将db服务添加到cluster-global-net网络来公开它,以便Traefik可以生成到bakend的前端路径。这基本上有效。

但我想隐藏数据库服务“公共”,同时仍然可以使用内部“默认”网络通过其堆栈或服务名称将另一个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
答案

您需要的是一个部署了这两个网络的网络,但是其他任何人都看不到它。

为此,请创建一个网络,将其添加到您的数据库服务和前端,以及临时服务。事实上,删除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>

然后,temporaryService和前端可以通过db:3306到达db

顺便说一句:你不需要为前端打开端口,因为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>

以上是关于仅使用Traefik在内部网络上公开Docker数据库服务的主要内容,如果未能解决你的问题,请参考以下文章

Traefik:无法使用摘要身份验证登录服务

traefik 代理后面的 docker 中的 gitlab 失败(通常)

云原生之Docker实战使用Docker部署Traefik开源边缘路由器

traefik 2.1 for docker

XAMPP Apache 服务器无法在内部网络上运行

使用 docker-compose 和 traefik 实现微服务之间的通信