我試圖在docker中創建一個python套接字,并將該埠轉發到其主機上,其他一些程式應試圖連接到該埠。
為此,運行python的dockerised正在進行如下操作:
# Python 3.8, inside docker
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('0.0.0.0'/span>, 5000)
while True:
message, addrs = s.recvfrom(1480)
_log(f "DATA RECIEVED from {addrs}"/span>) #任意記錄功能。
由于其他程式不能事先知道docker網路的ip范圍,我不得不相信docker的埠通信。因此,我想實作的是,當主機收到任何套接字在其5000埠進行連接時,它將被dockerised python選中。
服務器和dockerised影像都是ubuntus。本地網路中主機的IP是192.168.1.141,docker子網是172.18.0.0,docker-compose對docker本身的描述如下:
docker-compose檔案
版本。"3"/span>
服務。
my_docker:
container_name: python_socket
image: registry.gitlab.com/my_group/my_project:update
卷。
- ./configs:/configs
- ./logs:/configs/logs
- ./sniffing:/app/sniffing
埠。
- "5000:5000"。
- "3788:3788"。
- "3787:80"/span>
網路。
- app_network
extra_hosts:
- "host.docker.internal:host-gateway"/span>
depends_on:
- rabbitmq
- 后臺
重新啟動: 總是
網路。
app_network:
在這種配置下,我無法連接。我看到,在主機中,如果我啟動一個Ipython并嘗試以下操作:
# Python 3.8, ipython console。
data = "Hello"/span>
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('172.18.0.2', 5000)
s.send(data.encode())
然后這些資訊成功到達docker。但如果我試圖連接到0.0.0.0:5000、localhost:5000或192.168.1.141:5000,那么我只會得到連接錯誤。 docker從機器外部獲取資訊,或者。
我錯過了什么?我有類似配置的Web服務器,其中docker埠轉發是成功的。
請提前感謝您的時間和幫助。
uj5u.com熱心網友回復:
你正在創建一個UDP套接字(SOCK_DGRAM)。 Compose ports:在這個功能上有些沉默,但是一般的Container networking概述暗示埠轉發默認為只有 TCP。
你可以明確地指定你需要轉發一個UDP埠:
ports:/span>
- '5000:5000/udp'/span>
然后你可以連接到主機的DNS或IP地址(或localhost或127.0.0.1,如果你從容器外但在同一主機上呼叫)和第一個埠號5000。 不要查詢容器的私有 IP 地址;它是不必要的,而且在大多數情況下是不起作用的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311833.html
標籤:
下一篇:如何將灰度影像變成RGB?
