我有以下 python 代码来创建服务器。当服务器在 docker 容器外部运行时会触发打印,但在容器内部则不会。我想在 compose.yaml 和/或 DockerFile 中设置端口转发和其他所需的设置。我不想通过 docker 命令来做到这一点。
import http.server
import socketserver
import requests
import os
tcp_host = 'localhost'
PORT = 8005
file_storage_host = 'file-storage'#int(os.environ['FILE_STORAGE_HOST'])
file_storage_port = 80#int(os.environ['FILE_STORAGE_PORT'])
class VideoHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def do_GET(self):
print('10')
if self.path == '/video':
print('3')
return ''
else:
print('4')
Handler = VideoHTTPRequestHandler
with socketserver.TCPServer((tcp_host, PORT), Handler) as httpd:
print(f"tcp server configured to: http://{tcp_host}:{PORT}")
httpd.serve_forever()
这是我的 compose.yaml 代码
services:
video-streaming:
image: video-streaming
build:
context: ./video-streaming
dockerfile: Dockerfile
container_name: video-streaming
ports:
- 4004:8005
environment:
- PORT=80
- FILE_STORAGE_HOST = file-storage
- FILE_STORAGE_PORT = 80
restart: "no"
和我的 dockerfile
ARG PYTHON_VERSION=3.12.3
FROM python:${PYTHON_VERSION}-slim as base
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=bind,source=requirements.txt,target=requirements.txt \
python -m pip install -r requirements.txt
USER appuser
COPY server.py .
# Expose the port that the application listens on.
EXPOSE 8005
# Run the application.
CMD python server.py
我在单独运行 python 脚本时获得了所需的功能,但在 docker 容器中却无法获得所需的功能。当旋转容器时,它似乎可以正常旋转服务器,但容器似乎没有收到任何请求。我认为问题是当我在浏览器上访问 http://localhost:4004/ 时,请求不会转发到容器内运行的 TCPServer。我知道将容器外部发出的请求转发到容器内部运行的服务器所需的唯一方法是端口转发 - 因此服务器主机名应该不重要。我认为我通过将外部端口 4004 映射到内部端口 8005 来在 compose.yaml 文件中正确执行端口转发。
正如 David Maze 在评论中指出的那样,每个 docker 容器都有自己的本地主机,无法在容器外部访问。使用 0.0.0.0 作为主机解决了问题。