如何使用 compose 或 Dockerfile 配置将对 docker 容器发出的请求转发到在容器内运行的 http.server?

问题描述 投票:0回答:1

我有以下 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 文件中正确执行端口转发。

docker docker-compose portforwarding http.server
1个回答
0
投票

正如 David Maze 在评论中指出的那样,每个 docker 容器都有自己的本地主机,无法在容器外部访问。使用 0.0.0.0 作为主机解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.