【问题标题】:setup networking of multiple docker containers in different projects using docker-compose使用 docker-compose 在不同项目中设置多个 docker 容器的网络
【发布时间】:2021-08-12 05:45:50
【问题描述】:

您好,我有多个项目都有自己的 dockerfile 和 docker-compose.yml 文件。我不太熟悉如何在这些项目之间建立网络。因此他们可以共享相同的数据库,并且该项目将能够与另一个进行对话。有人有建议吗?

现在,在其中一个项目中,我只是将所有 dockerfile 拉入 docker-compose.yml 并在此 yml 文件中的所有其他项目中设置我需要的所有服务。我认为这并不理想,并且服务之间存在高度耦合。

version: "3"

services:
  db:
    image: mysql/mysql-server
    ports:
      - 3306:3306
  mongo: 
    image: mongo
    restart: always

  rails_app:
    build: 
        context: ${RAILS_APP_PATH}
        dockerfile: Dockerfile
    volumes:
      - ${RAILS_APP_PATH}:/application
    ports:
      - 4000:4000
    depends_on: 
      - db
      - mongo
    links: 
      - db
      - mongo

  frontend:
    build: 
      context: ${FRONTEND_PATH} 
    ports: 
        - ${EXPOSED_PORT}:${EXPOSED_PORT}
    depends_on:
      - go_services
    links:
      - go_services
  go_services:
    build: 
        context: . 
        dockerfile: Dockerfile
    ports: 
        - "8080:8080"
    depends_on: 
      - db
      - mongo
      - rails_app
    links: 
      - db
      - mongo
      - rails_app

【问题讨论】:

    标签: docker networking docker-compose dockerfile


    【解决方案1】:

    诀窍是使用外部 Docker 网络。 设置网络,容器可以通过它们的服务名称相互通信。

    在主机上设置网络

    docker network create my-net
    

    第一个撰写文件

    version: '3.9'
    
    services:
    
      mymongo:
        image: mongo:latest
        restart: unless-stopped
        container_name: mongo
        environment:
          MONGO_INITDB_DATABASE: mymongo
          MONGO_INITDB_ROOT_USERNAME: root
          MONGO_INITDB_ROOT_PASSWORD: password
        volumes:
          - ./database:/data/db
        ports:
          - "27017:27017"
    
    networks:
      default:
        external: true
        name: my-net
    

    第二个撰写文件

    version: '3.9'
    
    services:
    
      ui:
        build:
          context: ./build
          dockerfile: Dockerfile_ui
        image: ui
        restart: "no"
        container_name: ui
        ports:
          - "8005:3000"
        command: ["npm", "start"]
    
    networks:
      default:
        external: true
        name: my-net
    

    【讨论】:

      【解决方案2】:

      您可以在没有任何特殊 Compose 设置的情况下执行此操作,如果:

      • 每个项目都是独立的(它们共享数据库)
      • 服务位置可通过环境变量进行配置
      • 您不介意通过主机进行通信

      如果您正在考虑扩大这个项目,这种方法看起来很有吸引力。即使您在不同的主机上运行每个 Compose 文件,它也能正常工作,并且它可以很好地转换为 Kubernetes 等集群环境。

      继续将您的 Compose 文件分解为几个独立的文件:

      # rails/docker-compose.yml
      version: '3.8'
      services:
        db:
          image: mysql/mysql-server
        app:
          build: .
          ports: ['4000:4000']
          depends_on: [db]
      
      # go/docker-compose.yml
      services:
        mongo:
          image: mongo
        service:
          build: .
          ports: ['8080:8080']
          depends_on: [mongo]
          environment:
            - RAILS_APP_URL
      

      这里的最后一行将RAILS_APP_URL 环境变量从主机环境传递到容器中。

      您可以独立启动 Rails 应用程序:

      docker-compose -f ./rails/docker-compose.yml up -d
      

      您需要find some hostname where the container can call back to the host。在 MacOS 和 Windows 主机上,Docker 为此提供了一个特殊的主机名host.docker.internal。然后,您可以将客户端容器连接到其服务器的已发布端口:

      export RAILS_APP_URL=http://host.docker.internal:4000
      docker-compose -f ./go/docker-compose.yml up
      

      如果你在做开发,你可以在本地运行你正在开发的服务,以及它在容器中的依赖关系,并将环境变量指向容器

      go build -o ./server ./cmd/server
      export RAILS_APP_URL=http://localhost:4000
      ./server
      

      如果您想在多台主机上运行此设置,但不使用 Docker Swarm 或 Kubernetes 等专用集群管理器,请将环境变量设置为指向运行服务的主机的 DNS 名称。如果您确实想将其转换为 Kubernetes,Helm“图表”将是类似的,包含单个组件的部署、服务、和依赖项,您可以配置其他服务的通过 Helm 值的 URL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多