首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头与外部网络冲突组合服务名称

码头与外部网络冲突组合服务名称
EN

Stack Overflow用户
提问于 2019-10-20 16:42:37
回答 1查看 1.4K关注 0票数 6

我试图连接两个本地开发的项目,运行在码头-撰写使用外部联网

从一边看,我有第一次申请,打算公开。组成包含主机:apprabbit

代码语言:javascript
复制
version: '3.4'

services:
  app:
    # ...
  rabbit:
    # ...

networks:
  default:
    driver: bridge

在另一边,我有第二份申请,希望看到第一份申请:

代码语言:javascript
复制
version: '3.4'

services:
  app:
    # ...
    networks:
      - paymentservice_default
      - default

networks:
  paymentservice_default:
    external: true

到达主机rabbit.paymentservice_default是可能的。

但是,服务app (1)与app (2)冲突:

代码语言:javascript
复制
root@6db86687229c:/app# ping app.paymentservice_default
PING app.paymentservice_default (192.168.80.6) 56(84) bytes of data.

root@6db86687229c:/app# ping app
PING app (192.168.80.6) 56(84) bytes of data.

一般来说,从第二个组合的角度来看,主机appapp.paymentservice_default共享相同的IP,使得app.paymentservice_default无法被发现。

这里的问题是,我是否有正确的配置,并且可以避免冲突而不更改服务名称为什么是这样的约束?考虑到每个对接者组成的配置都是跨项目共享的,并且可以在微服务世界中开发。

代码语言:javascript
复制
$ docker-compose --version
docker-compose version 1.17.1, build unknown
$ docker --version
Docker version 19.03.4, build 9013bf583a

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-07-22 21:55:04

我在码头游乐场上使用了以下配置

paymentservice.docker-compose.yml

代码语言:javascript
复制
version: '3.4'

services:
  app:
    image: busybox
    # keep container running
    command: tail -f /dev/null
  rabbit:
    image: rabbitmq

networks:
  default:
    driver: bridge

other.docker-compose.yml

代码语言:javascript
复制
version: '3.4'

services:
  app:
    image: busybox
    # keep container running
    command: tail -f /dev/null
    networks:
      - paymentservice_default
      - default

networks:
  paymentservice_default:
    external: true

运行两个项目

代码语言:javascript
复制
$ COMPOSE_PROJECT_NAME=paymentservice docker-compose -f paymentservice.docker-compose.yml up -d
$ COMPOSE_PROJECT_NAME=other docker-compose -f other.docker-compose.yml up -d

展示码头IP

代码语言:javascript
复制
$ docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';

我得到了

代码语言:javascript
复制
other_app_1  172.20.0.2 172.19.0.4
paymentservice_app_1  172.19.0.3
paymentservice_rabbit_1  172.19.0.2

我用paymentservice_app_1 (172.19.0.3)从other_app_1中选择了app.paymentservice_default

代码语言:javascript
复制
$ docker exec -it other_app_1 ping -c 1 app.paymentservice_default
PING app.paymentservice_default (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.258 ms

--- app.paymentservice_default ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.258/0.258/0.258 ms

我用other_app_1 (172.20.0.2)从other_app_1中选择了app

代码语言:javascript
复制
$ docker exec -it other_app_1 ping -c 1 app
PING app (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.054 ms

--- app ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.054/0.054/0.054 ms

如您所见,我可以从第二个应用程序( paymentservice.docker-compose.yml)访问第一个应用程序( other.docker-compose.yml)。

同样的工作方向是相反的。我使用other_app_1 (172.19.0.4)从paymentservice_app_1中选择app.paymentservice_default

代码语言:javascript
复制
$ docker exec -it paymentservice_app_1 ping -c 1 app.paymentservice_default
PING app.paymentservice_default (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: seq=0 ttl=64 time=0.198 ms

--- app.paymentservice_default ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.198/0.198/0.198 ms

我使用paymentservice_app_1 (172.19.0.3)从paymentservice_app_1中选择app

代码语言:javascript
复制
$ docker exec -it paymentservice_app_1 ping -c 1 app
PING app (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.057 ms

--- app ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.057/0.057/0.057 ms

如您所见,我可以访问两个项目的app服务。如果我想访问同一项目的服务,则使用该项目的默认网络。如果我想访问另一个项目的服务,我使用两个项目之间共享的外部网络。

注意:我建议通过使用命令行在项目之外创建共享网络来使这一点更加明确。 docker网络创建付费服务与其他服务之间的共享 并在两个项目中宣布它是外部的。注意:如果在同一个(外部)网络(某种名称空间)中有3个具有相同服务名称(例如app)的项目,那么服务发现仍然有一个限制。在这种情况下,最好重命名您的服务,使用多个外部网络,定义别名,或者使用完全不同的方法来发现/标识Docker容器。

后来语

这就是要求吗?我试图复制你的问题,但我不确定我是否做了和你一样的事。例如,我不确定您在哪里运行pingroot@6db86687229c是码头主机还是码头容器?哪个容器?我以为它是服务app of other.docker-compose.yml的Docker容器。如果我遗漏了什么或者误解了你的问题,请发表评论,我会更新我的答案。然后,我可能会更详细地解释或提出另一个建议,即如何在多个Docker组合项目之间进行服务发现。

附录

清理

代码语言:javascript
复制
$ COMPOSE_PROJECT_NAME=other docker-compose -f other.docker-compose.yml down
$ COMPOSE_PROJECT_NAME=paymentservice docker-compose -f paymentservice.docker-compose.yml down

版本

代码语言:javascript
复制
$ docker --version
Docker version 20.10.0, build 7287ab3
$ docker-compose --version
docker-compose version 1.26.0, build unknown
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58475127

复制
相关文章

相似问题

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