无法从 Docker 容器访问本地主机
Unable to Access Local Host From Docker Container
问题
我有两个 Docker 个容器:
- 服务器 运行
fastapi;uvicorn
- 客户端向
http://0.0.0.0
发送 GET
请求
服务器似乎工作正常,因为 bashing curl -X GET http://0.0.0.0
按预期工作。但是,我的 docker 客户端似乎无法访问。
构建客户端容器(下面的文件)后,当 运行 docker run -it --name app_client_container app_client:latest
我收到以下错误:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: Errno 111 Connection refused'))
设置
我的项目是这样的
|- client.Dockerfile
|- client.py
|- client_req.txt
|- server.Dockerfile
|- server.py
|- server_req.txt
客户端
# client.Dockerfile
FROM python:3.8
WORKDIR /srv
WORKDIR /srv
ADD client_req.txt /srv/client_req.txt
RUN pip install -r client_req.txt
ADD . /srv
CMD python /srv/client.py
# client.py
import json
import requests
import traceback
try:
response = requests.get('http://0.0.0.0', timeout=5)
print(json.dumps(response.json(), indent=4))
except Exception as e:
print('Connection could not be established :(')
print('Here is more information:')
traceback.print_exc()
# client_req.txt
requests
服务器
# server.Dockerfile
FROM python:3.8
WORKDIR /srv
ADD server_req.txt /srv/server_req.txt
RUN pip install -r server_req.txt
EXPOSE 80
ADD . /srv
CMD uvicorn server:app --host 0.0.0.0 --port 80 --reload
# server.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
# server_req.txt
fastapi
uvicorn
使用 docker run ... --net=host ...
尝试 运行 客户端
虽然服务器向主机公开:80
,但默认情况下,主机的网络对其他容器不可用;即主机的 :80
在其他(包括客户端)容器中不可用。
或者,您可以:
- 通过容器内的 DNS 引用主机;
- 创建一个 docker 网络并将两个容器绑定到它(因此也使用容器名称来引用)
- 或者——与之前的有点相同——使用Docker Compose。
您也可以使用default docker bridge network.
将 IP 地址设置为:172.17.0.1(mac 为 docker.for.mac.host.internal)
这应该有效:
response = requests.get('http://172.17.0.1', timeout=5)
问题
我有两个 Docker 个容器:
- 服务器 运行
fastapi;uvicorn
- 客户端向
http://0.0.0.0
发送
GET
请求
服务器似乎工作正常,因为 bashing curl -X GET http://0.0.0.0
按预期工作。但是,我的 docker 客户端似乎无法访问。
构建客户端容器(下面的文件)后,当 运行 docker run -it --name app_client_container app_client:latest
我收到以下错误:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: Errno 111 Connection refused'))
设置
我的项目是这样的
|- client.Dockerfile
|- client.py
|- client_req.txt
|- server.Dockerfile
|- server.py
|- server_req.txt
客户端
# client.Dockerfile
FROM python:3.8
WORKDIR /srv
WORKDIR /srv
ADD client_req.txt /srv/client_req.txt
RUN pip install -r client_req.txt
ADD . /srv
CMD python /srv/client.py
# client.py
import json
import requests
import traceback
try:
response = requests.get('http://0.0.0.0', timeout=5)
print(json.dumps(response.json(), indent=4))
except Exception as e:
print('Connection could not be established :(')
print('Here is more information:')
traceback.print_exc()
# client_req.txt
requests
服务器
# server.Dockerfile
FROM python:3.8
WORKDIR /srv
ADD server_req.txt /srv/server_req.txt
RUN pip install -r server_req.txt
EXPOSE 80
ADD . /srv
CMD uvicorn server:app --host 0.0.0.0 --port 80 --reload
# server.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
# server_req.txt
fastapi
uvicorn
使用 docker run ... --net=host ...
虽然服务器向主机公开:80
,但默认情况下,主机的网络对其他容器不可用;即主机的 :80
在其他(包括客户端)容器中不可用。
或者,您可以:
- 通过容器内的 DNS 引用主机;
- 创建一个 docker 网络并将两个容器绑定到它(因此也使用容器名称来引用)
- 或者——与之前的有点相同——使用Docker Compose。
您也可以使用default docker bridge network.
将 IP 地址设置为:172.17.0.1(mac 为 docker.for.mac.host.internal)
这应该有效:
response = requests.get('http://172.17.0.1', timeout=5)