首先让我描述一下我原来的问题和解决方案:
我有几个描述应用程序不同部分的 docker-compose 文件。这些部分是独立开发和部署的,因此它们不能集成到一个单独的 compose 文件中。但是这些组件需要相互通信,我目前使用的解决方案是拥有一个所有服务都连接到的外部网络(网桥)。到目前为止一切顺利,只要我连接到自定义桥接网络,我确实可以连接到使用任何 docker compose 文件启动的服务:
$ docker run --network=mynet --rm --name ping_test -it xenial-networking bash
root@0319469f7951:/# ping -c 1 proj_web_1
PING proj_web_1 (172.30.0.3) 56(84) bytes of data.
64 bytes from 172.30.0.3: icmp_seq=1 ttl=64 time=0.071 ms
--- proj_web_1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.071/0.071/0.071/0.000 ms
为什么要使用 proj_web_1
?因为那是 docker compose 正在创建的 DNS 条目。
这工作正常,没有人关心下划线不是 that great in domain names .
没有人...除了 django
似乎:
ERROR Invalid HTTP_HOST header: 'proj_web_1:8000'. The domain name provided is not valid according to RFC 1034/1035.
172.30.0.5 - admin [07/May/2018:05:41:53 +0000] "OPTIONS /api/v1/expansions/ HTTP/1.1" 400 58663 "-" "python-requests/2.18.4"
似乎 docker-compose does not support使用连字符而不是下划线。
可能是I can workaround this通过在我的 Django 服务中启用 DEBUG
。
有没有更简洁的方法来启用它,而不用在 Django Debug模式下运行? 有没有办法告诉 docker compose 停止使用下划线?
最佳答案
交叉组合网络连接
运行组合项目时,可以通过服务的全名(包括项目名称前缀,例如 myproject_web_1
)和服务名称(在组合中指定)访问服务文件),例如 web
。短名称是 network-scoped alias ,这意味着连接到同一网络的任何容器都可以通过该名称访问该容器。
默认情况下,docker-compose
会为每个 compose 项目 (projectname_default
) 创建一个网络,以便 compose 项目中的所有服务都可以进行通信。因为该网络是为每个项目单独创建的,所以两个组合项目不共享同一个网络,并且它们的服务与其他组合项目隔离。
但是,可以使组合项目(或组合项目中的各个服务)共享同一网络。
示例 1 - 为整个项目使用共享网络
以下组合文件为默认网络指定自定义名称;两个 compose 文件都默认使用 sharednet
网络,这意味着两个 compose 项目的服务将连接到同一网络:
编写文件 1(compose1.yml):
version: '3.5'
services:
compose1service:
image: busybox
tty: true
networks:
default:
name: sharednet
编写文件 2(compose2.yml):
version: '3.5'
services:
compose2service:
image: busybox
tty: true
networks:
default:
name: sharednet
为了说明这一点:
启动两个组合文件:
docker-compose -f compose1.yml --project-name=compose1 up -d
docker-compose -f compose2.yml --project-name=compose2 up -d
使用短名称 (compose2service
) 从 compose1service
容器中的服务内部对 compose2service
执行 ping 操作;
docker exec compose1_compose1service_1 ping -c1 compose2service
PING compose2service (172.20.0.3): 56 data bytes
64 bytes from 172.20.0.3: seq=0 ttl=64 time=0.134 ms
--- compose2service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.134/0.134/0.134 ms
反之亦然:
docker exec compose2_compose2service_1 ping -c1 compose1service
PING compose1service (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
全名(包括项目前缀)也是如此;
docker exec compose2_compose2service_1 ping -c1 compose1_compose1service_1
PING compose1_compose1service_1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.151 ms
--- compose1_compose1service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.151/0.151/0.151 ms
示例2 - 为项目中的某些服务使用共享网络
在此示例中,两个 compose 项目都有自己的(“默认”)网络,但此外,还添加了一个共享网络以允许某些服务连接到另一个 compose 项目中的服务。
编写文件 1(compose3.yml):
version: '3.5'
services:
compose3service:
image: busybox
tty: true
networks:
- default
- sharednet
compose3otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
Note: if you specify which networks a service should be connected to, you override the defaults, which means that the service is no longer automatically connected to the
default
network. Include thedefault
network in the list of networks to allow the service to communicate with other services in the compose project.
编写文件 2(compose4.yml):
version: '3.5'
services:
compose4service:
image: busybox
tty: true
networks:
- default
- sharednet
compose4otherservice:
image: busybox
tty: true
networks:
sharednet:
name: mysharednetwork
启动两个组合文件:
docker-compose -f compose3.yml --project-name=compose3 up -d
docker-compose -f compose4.yml --project-name=compose4 up -d
同样,从 compose3service
ping 到另一个 compose 项目中的 compose4service
服务(通过简称或全名);
docker exec compose3_compose3service_1 ping -c1 compose4service
PING compose4service (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.110 ms
--- compose4service ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.110/0.110/0.110 ms
docker exec compose3_compose3service_1 ping -c1 compose4_compose4service_1
PING compose4_compose4service_1 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.093 ms
--- compose4_compose4service_1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.093/0.093/0.093 ms
但是,尝试连接到 compose4otherservice
将失败,因为该服务未连接到 mysharednetwork
网络:
docker exec compose3_compose3service_1 ping -c1 compose4otherservice
ping: bad address 'compose4otherservice'
docker exec compose3_compose3service_1 ping -c1 compose4_compose4otherservice_1
ping: bad address 'compose4_compose4otherservice_1'
注意:
如果两个 compose 项目有一个同名的服务(例如,都有一个名为 web
的服务),则应该小心。在这种情况下,web
可能会随机解析为任一项目的 web
服务。
关于python - 域名下划线的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50207974/