python - 域名下划线的问题

标签 python django docker dns 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

为什么要使用 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 the default 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/

相关文章:

node.js - 从 Node 镜像运行 docker 容器时找不到 Npm

docker - 如何与Docker一起 “start over”?

Python - 特殊情况下的集合与列表

python - Selenium Python - 处理没有这样的元素异常

python - 模块未找到错误 : No module named 'django.shortcuts'

python - 在 URLConf 中定义嵌套 namespace ,用于反转 Django URL——有人有令人信服的例子吗?

python - Python 3 的枚举速度是否比 Python 2 慢?

python - 通过 View (Django)的 celery 任务返回为待处理,但可以通过终端

django - 在 ModelViewSet 中覆盖 get_queryset 时找不到详细信息

mysql - 将docker中的WSO2 apim连接到本地机器中的mysql时在url中使用useSSL = true时出现错误