【问题标题】:Multi Docker-Compose projects sharing service多 Docker-Compose 项目共享服务
【发布时间】:2020-06-19 23:09:50
【问题描述】:

我正在尝试创建多个 Docker-Compose 项目并让它们共享一个服务,即数据库服务器。我目前无法让项目使用我的 mariadb 实例。我不确定我的问题出在 traefik 还是 docker 上。如果它包含在同一个 docker-compose 中,我可以让 wordpress 识别数据库,但由于我最终不希望运行多个数据库服务器实例,我希望它是它自己的项目。

# ~/docker/traefik/docker-compose.yml
version: "3.3"

services:

  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    command:
      - "--api=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.dnschallenge=true"
      - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=namedotcom"
      - "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myresolver.acme.email=<MY-EMAIL>"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    networks:
      t2_proxy:
    ports:
      - "80:80"
      - "443:443"
    environment:
      - "NAMECOM_USERNAME=<My-USERNAME>
      - "NAMECOM_API_TOKEN=<My-Token>
    labels:
      # Dashboard
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`api.mydomain.com`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=admin"
      - "traefik.http.routers.traefik.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.middlewares.admin.basicauth.users=myuser:mypasswordhash/"
        # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # global redirect to https
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.redirs.entrypoints=web"
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

networks:
  t2_proxy:
# ~/docker/db/docker-compose.yml
version: '3.3'

services:

  mysql:
    image: mariadb
    container_name: "mariadb"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: wordpressDB
      MYSQL_USER: wordpressUSER
      MYSQL_PASSWORD: wordpressPW
    networks:
      default:
    ports:
      - 3306:3306
  adminer:
    image: adminer
    restart: always
    container_name: "adminer"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.adminer.rule=PathPrefix(`/adminer`)"
      - "traefik.http.routers.adminer.entrypoints=websecure"
      - "traefik.http.routers.adminer.tls.certresolver=myresolver"
    networks:
      - default
      - traefik_t2_proxy
networks:
  default:
  traefik_t2_proxy:
    external: true
# ~/docker/wordpress/docker-compose.yml
version: '3.3'

services:
   wordpress:
     image: wordpress:latest
     restart: always
     container_name: "mySite"
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpressUSER
       WORDPRESS_DB_PASSWORD: wordpressPW
       WORDPRESS_DB_NAME: wordpressDB
     networks:
       traefik_t2_proxy:
       db_default:
     labels:
       - "traefik.enable=true"
       - "traefik.http.routers.wp2.rule=PathPrefix(`/wordpress`)"
       - "traefik.http.routers.wp2.entrypoints=websecure"
       - "traefik.http.routers.wp2.tls.certresolver=myresolver"
volumes:
  db_data: {}
networks:
  traefik_t2_proxy:
    external: true
  db_default:
    external: true

【问题讨论】:

  • 我对外部网络没有太多的了解,但是他们的名字不需要匹配吗?似乎它们在某些作曲方面有所不同。
  • 名称不同的原因是新网络的名称是用项目名称的前缀创建的。在这种情况下,t2_proxy 不是外部的,因此使用目录的前缀名称创建新网络,即traefik_t2_proxy,然后在其他 docker-compose 文件中重用。唯一缺少的部分是将traefik_t2_proxy 添加到mysql,如stackoverflow.com/a/62494992/2023252 中所述。

标签: docker docker-compose traefik


【解决方案1】:

您可以拥有多个 docker-compose 文件,具有相同的 network 并将它们一起运行,如下所示: docker-compose -f docker-compose-1.yml -f docker-compose-2.yml up -d 但是,如果您需要服务相互识别,则网络应该是相同的。把你的traefik_t2_proxy 网络也给mysql。

【讨论】:

  • 谢谢,这行得通,但是为什么 mysql 和 wordpress 容器都可以使用的网络 db_default 不够用?
  • 另外,我从这一行删除了端口号:WORDPRESS_DB_HOST: db:3306 并完全删除了 - 3306:3306
  • 你没有在你的mysql服务中声明db_default网络,所以它无法识别它。
  • 我很抱歉,我已经/做了,但我意识到我在 stackoverflow 和我的实现之间进行了更改。 wordpress 容器有一个名为 mysql_default 的外部网络,mysql 容器有一个名为 default 的网络。也许是因为我包含了上面描述的端口号?我会在不包括端口的情况下重试。
  • 网络名称应该“完全相同”。
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多