【问题标题】:How to use internal networks with Traefik 2.x?如何在 Traefik 2.x 中使用内部网络?
【发布时间】:2020-02-20 12:55:44
【问题描述】:

我正在尝试使用 docker-compose 和 Traefik 设置一个简单的 Nextcloud Stack。

这是我的 docker-compose.yml

version: '3.7'
services:
  nextcloud-database:
    image: mariadb
    container_name: nextcloud-database
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - $PWD/db:/var/lib/mysql
    env_file:
      - db.env
    networks:
      - backend
    logging:
      options:
        max-size: '12m'
        max-file: '5'
      driver: json-file

  nextcloud-redis:
    image: redis:alpine
    container_name: nextcloud-redis
    restart: always
    networks:
      - backend

  nextcloud-cron:
    image: nextcloud:latest
    container_name: nextcloud-cron
    restart: always
    volumes:
      - $PWD/cloud:/var/www/html
    entrypoint: /cron.sh
    networks:
      - backend

  nextcloud-app:
    image: nextcloud:latest
    container_name: nextcloud-app
    restart: always
    volumes:
      - $PWD/config:/var/www/html/config
      - $PWD/cloud:/var/www/html
      - $PWD/apps:/var/www/html/apps
      - $PWD/data:/var/www/html/data
    environment:
      - NEXTCLOUD_DATA_DIR=/var/www/html/data
      - MYSQL_HOST=nextcloud-database
    env_file:
      - db.env
    depends_on:
      - nextcloud-database
      - nextcloud-redis
      - nextcloud-cron
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.entrypoints=http"
      - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.blablubb.de`)"
      - "traefik.http.middlewares.nextcloud-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.nextcloud.middlewares=nextcloud-https-redirect"
      - "traefik.http.routers.nextcloud-secure.entrypoints=https"
      - "traefik.http.routers.nextcloud-secure.rule=Host(`nextcloud.blablubb.de`)"
      - "traefik.http.routers.nextcloud-secure.tls=true"
      - "traefik.http.routers.nextcloud-secure.tls.certresolver=http"
      - "traefik.http.routers.nextcloud-secure.service=nextcloud"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
    networks:
      - proxy
      - backend
    logging:
      options:
        max-size: '12m'
        max-file: '5'
      driver: json-file

networks:
  proxy: # this is the network provided by traefik
    external: true
  backend:
    external: false

和 db.env

MYSQL_PASSWORD="waff"
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
MYSQL_ROOT_PASSWORD="waff"

可以通过域 nextcloud.blablbb.de 访问 Nextcloud 实例。 所以我的问题: 我的 nextcloud-docker 容器需要什么才能相互通信? 我认为它是通过后端网络处理的,但我总是错误消息,f.e. nextcloud-mysql 无法访问。

没有 Treafik,此设置工作正常。

谢谢你们。

【问题讨论】:

  • 为什么您的后端网络被标记为非外部网络?
  • 为什么要在外部进行内部沟通?
  • 我知道——但是你的后端网络是在哪里定义的?
  • 在docker compose yml的最后
  • 我用我的 docker-compose 尝试过,它抛出了一个关于未定义网络的错误。如果您简单地将后端重命名为默认值怎么办?

标签: docker networking docker-compose traefik


【解决方案1】:

如果您希望两个容器能够相互通信,您需要有一个覆盖网络并将两个容器添加到同一个网络中,例如

docker network create --driver=overlay --subnet=10.0.15.0/24  --attachable traefik
    networks:
      - backend

在你的 docker-compose 文件中就是这种情况,这里是一个例子

version: '3.7'

networks:
  traefik:
    external: true

volumes:
  db_data:

services:

  proxy:
    image: traefik:v2.1
    command:
      - '--providers.docker=true'
      - '--entryPoints.web.address=:80'
      - '--providers.providersThrottleDuration=2s'
      - '--providers.docker.watch=true'
      - '--providers.docker.swarmMode=true'
      - '--providers.docker.swarmModeRefreshSeconds=15s'
      - '--providers.docker.exposedbydefault=false'
      - '--providers.docker.defaultRule=Host("local.me")'
      - '--accessLog.bufferingSize=0'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    ports:
      - '80:80'
    deploy:
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        delay: 10s
        order: start-first
        parallelism: 1
      rollback_config:
        parallelism: 0
        order: stop-first
    logging:
      driver: json-file
      options:
        'max-size': '10m'
        'max-file': '5'
    networks:
      - traefik

  mysql:
    image: mysql:5.7
    command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log
    deploy:
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        delay: 10s
        order: start-first
        parallelism: 1
      rollback_config:
        parallelism: 0
        order: stop-first
    logging:
      driver: json-file
      options:
        'max-size': '10m'
        'max-file': '5'
    networks:
      - traefik
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: dummy
      MYSQL_DATABASE: rails_blog_production

  rails_blog_web:
    image: wshihadeh/rails_blog:demo-v1
    command: 'web'
    deploy:
      labels:
        - traefik.enable=true
        - traefik.http.services.blog.loadbalancer.server.port=8080
        - traefik.http.routers.blog.rule=Host(`blog.local.me`)
        - traefik.http.routers.blog.service=blog
        - traefik.http.routers.blog.entrypoints=web
        - traefik.docker.network=traefik
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        delay: 10s
        order: start-first
        parallelism: 1
      rollback_config:
        parallelism: 0
        order: stop-first
    logging:
      driver: json-file
      options:
        'max-size': '10m'
        'max-file': '5'
    networks:
      - traefik
    depends_on:
      - mysql
    environment:
      DATABASE_URL: mysql2://root:dummy@mysql/rails_blog_production
      RAILS_SERVE_STATIC_FILES: 'true'

您的配置中缺少的一件事是服务之间的链接。例如,您在应用程序服务器中提供 MySQL 主机,但缺少端口。

【讨论】:

  • 您好,Al,感谢您的回答。不需要给出 MySQL 的端口。我没有得到覆盖的网络问题。如果您可以在这里看到github.com/nextcloud/docker/blob/master/.examples/…,则没有指定网络,但它们可以通信。这是 Traefik 的事吗?
  • 在示例中,您提供的网络定义不存在。结果,网络将。在您运行 docker-compose up -d 时创建,并且所有容器都将在同一个网络中。另一方面,您定义了backend 网络。因此,我认为您需要在启动服务之前创建网络。您可以通过运行docker network ls 验证是否创建了网络,并通过docker inspect container_id 检查容器是否在同一网络中
  • 你能解释一下哪个服务没有到达哪个?
  • 我无法从应用程序访问 MariaDB、Redis 和 Cron 容器,我会试试你的变体。
  • 在深入查看 docker-compose 文件后,我注意到您正在将容器分配给一个名为“后端”的网络。虽然此网络未在文件中定义,但至少未使用确切名称。在文件末尾定义的网络(“后端”)将使用动态名称(类似于 "${folder}_backend" )创建。要解决此问题,您可以向网络添加一个名称。喜欢backend: external: false name: "backend"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多