在Docker中为Python容器暴露端口



我在python容器中暴露端口时有一个问题。在容器内部工作端口正确,但我不能将其暴露在外部,尽管使用端口参数运行图像。

docker run -d -p 8080:8080 api_python:0.1

main.pyis:

from http.server import BaseHTTPRequestHandler, HTTPServer
hostName = "localhost"
serverPort = 8080
class MyServer(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
self.wfile.write(bytes("<body>", "utf-8"))
self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
self.wfile.write(bytes("</body></html>", "utf-8"))
if __name__ == "__main__":
webServer = HTTPServer((hostName, serverPort), MyServer)
print("Server started http://%s:%s" % (hostName, serverPort))
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
webServer.server_close()
print("Server stopped.")

图像已建立:docker build -t api_python:0.1 .

Dockerfileis:

FROM python:3.8-slim-buster
RUN mkdir "api"
COPY api/MyServer.py api
WORKDIR api
ENTRYPOINT ["python","main.py"]

非常感谢您的回答。

根据您的代码,您似乎在localhost:8080上运行服务器。

hostName = "localhost"
serverPort = 8080
webServer = HTTPServer((hostName, serverPort), MyServer)
print("Server started http://%s:%s" % (hostName, serverPort))

容器确实有一个本地主机接口,但它是本地的容器。您需要将端口8080绑定到面向外部的网络,以便容器外部的任何东西都可以访问它。

尝试为hostName设置不同的值:

hostName = "0.0.0.0"

0.0.0.0将绑定到容器中所有面向外部的接口。这是一种方便的速记,因为您事先不知道容器的IP,并且它会在不通知的情况下更改。

既然外部网络有8080端口侦听,那么来自外部的端口映射器将能够访问容器中8080端口后面的代码。

相关内容

  • 没有找到相关文章

最新更新