如何配置两个docker compose文件的网络以实现所属服务互相访问
解决方案
方案一:自定义共享外部网络(最推荐)
Docker Compose默认会为每个单独的compose项目创建独立的隔离桥接网络,要实现跨项目服务互通,最清晰的方式是创建一个公共的外部共享网络,两个项目的服务都接入该网络即可通过服务名直接DNS解析通信。
步骤1:创建公共网络
在宿主机执行命令创建自定义桥接网络:docker network create shared-api-auth-net
步骤2:修改身份管理服务docker-compose配置
修改后完整配置如下:
version: "3.9" services: auth: image: quay.io/keycloak/keycloak environment: KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: admin ports: - 4000:8080 # 接入共享网络 networks: - shared-api-auth-net # 声明外部共享网络 networks: shared-api-auth-net: external: true
步骤3:修改API服务docker-compose配置
修改后完整配置如下,注意同时修改JWT校验的Authority地址为同网络下的auth服务内部地址:
version: "3.9" services: api: build: . ports: - 5000:80 - 5001:443 depends_on: - db environment: - ASPNETCORE_ENVIRONMENT=Production - ConnectionString=Server=db,1433;Database=test;User Id=sa;Password=${SQL_PASSWORD} - JWTSettings__Issuer=${AUTH_ISSUER} # 同网络下直接用服务名+内部端口访问,无需走宿主机端口 - JWTSettings__Authority=http://auth:8080 - JWTSettings__Audience=${AUTH_AUDIENCE} # 接入共享网络,同时保留默认网络保证api可正常访问同项目的db服务 networks: - shared-api-auth-net - default db: image: mcr.microsoft.com/mssql/server user: root ports: - 1433:1433 environment: - SA_PASSWORD=${SQL_PASSWORD} - ACCEPT_EULA="Y" # 声明外部共享网络 networks: shared-api-auth-net: external: true
步骤4:验证配置
依次启动两个服务后,进入api容器执行curl http://auth:8080,如果能正常返回Keycloak的响应内容则说明网络互通配置成功。
方案二:复用已有项目网络(适合临时调试)
如果不想额外创建新网络,也可以直接复用其中一个项目的默认网络:
- 先启动身份管理服务,执行
docker network ls找到身份服务项目的默认网络,命名规则一般为[身份服务compose所在文件夹名]_default - 在API服务的compose中声明该网络为外部网络,将api服务接入该网络即可,配置逻辑和方案一一致。
内容的提问来源于stack exchange,提问作者KDani
相关产品推荐
相关产品推荐

