我如何配置 2 docker 组合文件,以便它们在已被拉取的情况下使用现有服务?

How can I configure 2 docker compose files such that they use an existing service if it's already been pulled?

我经常在使用 Docker 的不同应用程序之间切换,其中一些是需要同时运行的微服务,因此我不能简单地杀死所有容器。如果他们共享 mssql 或 redis 之类的服务,我 运行 会遇到端口预留问题。当然,我可以将它们设置为使用自己的端口。但是如果服务的同一个实例已经存在,我想重用它,因为我的开发机器不是那么强大。 docker 文件应该各自创建自己的数据库,所以一切都已经像我希望的那样隔离了。

用例看起来可行,但不是真正的标准(因为乍一看存在一些风险,不同应用程序的数据库会纠缠在一起!)但假设它对于开发(≠生产)环境是可以的。

TL;DR:

您似乎只需要创建(至少)三个 docker-compose.yml 文件:

  • 普通数据库的那个,比如说mysql/docker-compose.yml
  • 第一个 webapp 的那个,比方说 app1/docker-compose.yml
  • 第二个webapp的那个,依此类推...

该方法的症结在于:

  • 我们依赖 external networks
  • 的 so-called docker-compose 功能
  • 而且我们不要暴露比要求更多的端口……(详情见下文:§)

最小工作示例

文件mysql/docker-compose.yml:

services:

  db:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - mysql-data:/var/lib/mysql
    # don't include ports:
    networks:
      - mysql-network

volumes:
  mysql-data:
    driver: local

networks:
  mysql-network:
    driver: bridge
    # override the name
    name: mysql-network

文件app1/docker-compose.yml:

services:

  app1:
    image: phpmyadmin
    restart: unless-stopped
    environment:
      PMA_HOST: db
    networks:
      - mysql-network
    ports:
      - '8080:80'
    
networks:
  mysql-network:
    external:
      name: mysql-network

旁注

  1. 当然,由于后端和公共数据库是分开的 docker-compose.yml 规范,您将无法从某些字段中受益,例如 depends_on:,即,您需要事先在 mysql/ 文件夹中手动 运行 docker-compose up -d

  2. (§) 即使这个用例只针对开发环境,像往常一样,应该避免在 db 服务中公开端口,即 DON 'T 写:

      db:
        image: mysql:8
        ports:
          - '3306:3306'
        ...
    

    as (i) 这不是 Compose 服务通信所必需的:它们只需要属于一个公共 Compose 网络并使用 Compose 服务主机名,并且 (ii) 直接在主机上暴露一个这样的端口会不必要地增加攻击面……