首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用docker-compose在不同项目中设置多个docker容器的网络

使用docker-compose在不同项目中设置多个docker容器的网络
EN

Stack Overflow用户
提问于 2021-08-12 05:45:50
回答 2查看 89关注 0票数 1

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

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

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2021-08-12 08:21:17

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

在主机上设置网络

代码语言:javascript
运行
复制
docker network create my-net

第一个合成文件

代码语言:javascript
运行
复制
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

第二个合成文件

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-08-12 11:27:50

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

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

进行通信

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

继续将您的撰写文件拆分成几个独立的文件:

代码语言:javascript
运行
复制
# rails/docker-compose.yml
version: '3.8'
services:
  db:
    image: mysql/mysql-server
  app:
    build: .
    ports: ['4000:4000']
    depends_on: [db]
代码语言:javascript
运行
复制
# go/docker-compose.yml
services:
  mongo:
    image: mongo
  service:
    build: .
    ports: ['8080:8080']
    depends_on: [mongo]
    environment:
      - RAILS_APP_URL

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

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

代码语言:javascript
运行
复制
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。然后,您可以将客户端容器连接到其服务器的已发布端口:

代码语言:javascript
运行
复制
export RAILS_APP_URL=http://host.docker.internal:4000
docker-compose -f ./go/docker-compose.yml up

如果您正在进行开发,则可以在本地运行正在处理的服务及其在容器中的依赖项,并将环境变量指向容器

代码语言:javascript
运行
复制
go build -o ./server ./cmd/server
export RAILS_APP_URL=http://localhost:4000
./server

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68752185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档