You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一网络下Python Requests无法解析Docker-Compose服务域名问题

服务间Docker网络域名解析失败问题解决

在两个独立仓库分别部署Docker-Compose环境,已通过docker inspect确认两个应用均正常运行且处于同一网络nhec-ter_ter-web-net,但从nhec_ter_app服务使用Python requests调用vtn_app服务时出现域名解析失败,导致Celery任务挂起。

docker-compose.yml 1

version: '3.2'

services:

  vtn_app: &app
    tty: true
    cap_add:
     - SYS_PTRACE
    build:
      context: .
      args:
        requirements: requirements/development.txt
    container_name: vtn
    environment:
      - DEBUG=False
      - PYTHONUNBUFFERED=1
      - TESTING_USER=oh_hey_there
      - SQL_USER=postgres
      - SQL_HOST=postgres     
      - SQL_PASSWORD=postgres
      - SQL_DB=postgres
      - SQL_PORT=5432
    restart: always
    volumes:
      - .:/app:delegated
    depends_on:
      - postgres
    ports:
      - 8000:80
      - 8080:8080
      - 8081:8081
    command: make adev
    networks:
      - nhec-ter_ter-web-net

  postgres:
      image: postgres:10
      container_name: vtn_postgres
      environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
          - POSTGRES_DB=postgres
      ports:
          - 5432:5432
      networks:
        - nhec-ter_ter-web-net

networks:
  nhec-ter_ter-web-net:
    external:
      name: nhec-ter_ter-web-net

docker-compose.yml 2

version: "3.9"
   
services:
  nhec_ter_app:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    container_name: nhec_ter
    environment:
      - DEBUG=True
      - PYTHONUNBUFFERED=1
      - TER_BASIC_AUTH_USER=pricesAdmin
      - TER_BASIC_AUTH_PASSWORD=Barry0325!
      - CELERY_BROKER_URL=redis://broker:6379/0
      - VTN_API_URL=http://vtn_app/
      - VTN_API_TOKEN=NHEC_UTILITY
    volumes:
      - .:/code
    ports:
      - "9000:8000"
    depends_on:
      - db
      - celery-worker
      - broker
    networks:
      - nhec-ter_ter-web-net
  nhec_ter_test:
    build: .
    command: python manage.py test
    container_name: nhec_ter_test
    environment:
      - DEBUG=True
      - PYTHONUNBUFFERED=1
    volumes:
      - .:/code
    depends_on:
      - db

  db:
    image: postgres:10
    container_name: nhec_ter_postgres
    ports:
      - 6000:5432
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: nhec
      POSTGRES_USER: nhec
      POSTGRES_PASSWORD: nhec
    networks:
      - nhec-ter_ter-web-net
  celery-worker:
    build: .
    command: celery -A nhec_ter worker -l DEBUG
    depends_on:
      - db
      - broker
    environment:
      CELERY_BROKER_URL=redis://broker:6379/0
    networks:
      - nhec-ter_ter-web-net
  broker:
    image: redis:6-alpine
    networks:
      - nhec-ter_ter-web-net

networks:
  nhec-ter_ter-web-net:
    name: nhec-ter_ter-web-net
    driver: bridge

volumes: 
  db_data: {}

测试报错信息

>>> import requests
>>> resp = requests.get('http://vtn_app/')
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 174, in _new_conn
    conn = connection.create_connection(
  File "/usr/local/lib/python3.8/site-packages/urllib3/util/connection.py", line 72, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/local/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 398, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 239, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.8/http/client.py", line 1256, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1302, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1251, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.8/http/client.py", line 1011, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.8/http/client.py", line 951, in send
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 205, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.8/site-packages/urllib3/connection.py", line 186, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fab9dded0a0>: Failed to establish a new connection: [Errno -2] Name or service not known

解决步骤

  • 修正访问地址:第一个docker-compose中vtn_app服务显式设置了container_name: vtn,Docker网络中容器的DNS别名优先使用容器名而非服务名,因此调用时应使用http://vtn/替代http://vtn_app/。
  • 更新环境变量:修改第二个docker-compose中nhec_ter_app的VTN_API_URL为http://vtn/,确保应用代码使用正确地址。
  • 验证网络连通性:进入nhec_ter_app容器执行ping vtn,确认域名可解析且网络连通;若不通,执行docker network inspect nhec-ter_ter-web-net检查两个容器是否确实在同一网络内。
  • 重启相关服务:修改配置后重启nhec_ter_app和celery-worker服务,使新环境变量生效。

内容的提问来源于stack exchange,提问作者Kyle Calica-St

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:54:34