同一网络下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
相关产品推荐
相关产品推荐

