docker-compose配置以通过域url从不同项目/网络访问容器

时间:2020-03-22 20:00:39

标签: docker docker-compose

这是一个困难的问题,但是解决它会很棒,而且我的配置也很棒!

我有两个docker-compose项目:否1.包含traefik的配置,否2.包含以my-service作为参数的http://my-domain.tld

目标是从http://my-domain.tld呼叫(例如ping)my-service并接通traefik。两种服务现在都在同一个网络中,但是我需要以某种方式传递http://my-domain.tld指向traefik的配置。

# Project no 1. configuration for traefik that I want to access from no 2. project
version: '3.7'
services:
  traefik:
    container_name: traefik
    networks:
      - default
networks:
  default:
    name: traefik
# Project no 2.
version: '3.7'
services:
  my-service:
    environment:
      - URL=http://my-domain.tld
    networks:
      - traefik
networks:
  traefik:
    external:
      name: traefik

尝试过的解决方案:

变体a)

不起作用。当我呼叫http://my-domain.tld时,它被定向到traefik网络中的第一个节点(在我的情况下,它是my-service本身)。与原始版本不同:“ aliases”位于“网络”部分。

# Project no 2.
version: '3.7'
services:
  my-service:
    environment:
      - URL=http://my-domain.tld
    networks:
      traefik:
        aliases:
          - ${MERCURE_DOMAIN}
networks:
  traefik:
    external:
      name: traefik

变体b)

失败,因为该服务所依赖的traefik不在项目/网络中:Service 'my-service' depends on service 'traefik' which is undefined.与原始项目不同:depends_onextra_hosts

# Project no 2.
version: '3.7'
services:
  my-service:
    environment:
      - URL=http://my-domain.tld
    networks:
      - traefik
    depends_on:
      - traefik
    extra_hosts:
      - http://my-domain.tld:traefik
networks:
  traefik:
    external:
      name: traefik

变体c)

行!但是请记住,我必须对traefik服务的IP地址进行硬编码。这不是最坏的情况,但这会使项目的可移植性降低,我想避免这种情况。与原始版本的区别:1号项目的网络配置,traefik服务的静态IP和2号项目的extra_hosts

# Project no 1. configuration for traefik that I want to access from next project
version: '3.7'
services:
  traefik:
    container_name: traefik
    networks:
      default:
        ipv4_address: 172.133.239.10
networks:
  default:
    name: traefik
    driver: bridge
      ipam:
        driver: default
        config:
          - subnet: 172.133.239.0/24
# Project no 2.
version: '3.7'
services:
  my-service:
    environment:
      - URL=http://my-domain.tld
    networks:
      - traefik
    extra_hosts:
          - http://my-domain.tld:172.133.239.10
networks:
  traefik:
    external:
      name: traefik

变体d)

正在等待您的建议,以使它变得完美!

编辑:重写docker-compose配置以分隔不同的案例,以显示我已尝试并完成的工作,因为对此有些困惑。

1 个答案:

答案 0 :(得分:0)

如果您知道my-service的主机名(或容器名)将是静态的,则可以通过其主机名(如果未指定主机名,则通过容器名来调用它;默认情况下,将其用作容器名)这是主机名)。

即如果my-service的主机名为container1,则可以从其他容器中对其进行ping操作(只要它们位于同一Docker网络中):ping container1