域名下划线问题

dan*_*ast 5 python django dns docker docker-compose

让我先描述一下我原来的问题和解决方案:

我有几个 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
Run Code Online (Sandbox Code Playgroud)

为什么使用proj_web_1?因为那是 docker compose 正在创建的 DNS 条目。

这很好用,没有人关心下划线在域名中不是那么好

没有人......除了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"
Run Code Online (Sandbox Code Playgroud)

docker-compose似乎不支持使用连字符而不是下划线。

可能是我可以通过DEBUG在我的 django 服务中启用来解决这个问题

有没有更简洁的方法来启用它,而无需在 django 调试模式下运行?有没有办法告诉 docker compose 停止使用下划线?

tha*_*tah 5

交叉组合网络连接

运行 compose 项目时,可以通过服务的全名(包括项目名称前缀,例如myproject_web_1)和服务名称(如 compose-file 中指定的)来访问服务,例如web。短名称是一个网络范围的别名,这意味着任何连接到同一网络的容器都可以通过该名称访问该容器。

默认情况下,docker-compose为每个 compose 项目 ( projectname_default)创建一个网络,以便 compose 项目中的所有服务都可以进行通信。因为该网络是为每个项目单独创建的,所以两个 compose 项目不共享同一个网络,并且它们的服务与其他 compose 项目隔离。

但是,可以使组合项目(或组合项目中的单个服务)共享同一个网络。

示例 1 - 为整个项目使用共享网络

以下撰写文件为默认网络指定了自定义名称;两个 compose-files 都使用sharednet网络作为默认值,这意味着两个 compose 项目的服务将连接到同一个网络:

撰写文件 1 (compose1.yml):

version: '3.5'
services:
  compose1service:
    image: busybox
    tty: true

networks:
  default:
    name: sharednet
Run Code Online (Sandbox Code Playgroud)

撰写文件 2 (compose2.yml):

version: '3.5'
services:
  compose2service:
    image: busybox
    tty: true

networks:
  default:
    name: sharednet
Run Code Online (Sandbox Code Playgroud)

为了说明这一点:

启动两个撰写文件:

docker-compose -f compose1.yml --project-name=compose1 up -d
docker-compose -f compose2.yml --project-name=compose2 up -d
Run Code Online (Sandbox Code Playgroud)

使用短 ( compose2service) 名称compose2servicecompose1service容器中的服务内部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
Run Code Online (Sandbox Code Playgroud)

反之亦然:

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
Run Code Online (Sandbox Code Playgroud)

全名(包括项目前缀)也是如此;

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
Run Code Online (Sandbox Code Playgroud)

示例 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
Run Code Online (Sandbox Code Playgroud)

注意:如果您指定服务应该连接到哪些网络,您将覆盖默认值,这意味着服务不再自动连接到default网络。将default网络包括在网络列表中,以允许该服务与 compose 项目中的其他服务进行通信。

撰写文件 2 (compose4.yml):

version: '3.5'
services:
  compose4service:
    image: busybox
    tty: true
    networks:
      - default
      - sharednet

  compose4otherservice:
    image: busybox
    tty: true

networks:
  sharednet:
    name: mysharednetwork
Run Code Online (Sandbox Code Playgroud)

启动两个撰写文件:

docker-compose -f compose3.yml --project-name=compose3 up -d
docker-compose -f compose4.yml --project-name=compose4 up -d
Run Code Online (Sandbox Code Playgroud)

再次,从 pingcompose3servicecompose4service其他 compose 项目中的服务(通过简称或全名);

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
Run Code Online (Sandbox Code Playgroud)

但是,尝试连接到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'
Run Code Online (Sandbox Code Playgroud)

注意

如果两个 compose 项目有一个同名的服务(例如,都有一个名为 的服务web),则应该小心。在这种情况下,web可以web从任一项目中随机解析到服务。