Multi Docker-Compose 项目共享服务

Multi Docker-Compose projects sharing service

我正在尝试创建多个 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

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