我想連接客戶端影像和服務器影像。所以我嘗試使用--link, docker-compose.yml,但是失敗了。但是,當我嘗試連接本地客戶端代碼和服務器容器時,它成功了。我認為這可能是 Dockerfile 的問題,但我無法修復它。這些是我的代碼:
- -服務器
import socket
HOST = socket.gethostbyname('localhost')
PORT = 65456
print('> echo-server is activated')
#print(HOST,PORT)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serverSocket:
serverSocket.bind(('', PORT))
serverSocket.listen()
clientSocket, clientAddress = serverSocket.accept()
with clientSocket:
print('> client connected by IP address {0} with Port number {1}'.format(clientAddress[0], clientAddress[1]))
while True:
# [=start=]
RecvData = clientSocket.recv(1024)
print('> echoed:', RecvData.decode('utf-8'))
clientSocket.sendall(RecvData)
if RecvData.decode('utf-8') == 'quit':
break
# [==end==]
print('> echo-server is de-activated')
- -客戶
import socket
HOST = socket.gethostbyname('localhost')
PORT = 65456
print('> echo-client is activated')
#print(HOST,PORT)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as clientSocket:
#print(HOST,PORT)
clientSocket.connect((HOST, PORT))
while True:
sendMsg = input("> ")
clientSocket.sendall(bytes(sendMsg, 'utf-8'))
recvData = clientSocket.recv(1024)
print('> received:', recvData.decode('utf-8'))
if sendMsg == "quit":
break
print('> echo-client is de-activated')
---服務器 Dockerfile
FROM python:latest
COPY . /me
RUN apt-get update
RUN mkdir -p /me
CMD ["python", "/me/server.py"]
EXPOSE 65456
---客戶端Dockerfile
FROM python:latest
COPY . /you
RUN apt-get update
RUN mkdir -p /you
CMD ["python", "/you/client.py"]
EXPOSE 65456
這是回聲程式。
uj5u.com熱心網友回復:
你的代碼對我有用。
您不包括您嘗試過的命令。這些將對您的問題有所幫助。
構建兩個容器。我使用不同Dockerfile的名稱來消除兩者之間的歧義。
Q="74282751"
docker build \
--tag=${Q}:server \
--file=./Dockerfile.server \
${PWD}
docker build \
--tag=${Q}:client \
--file=./Dockerfile.client \
${PWD}
然后在一個 shell 中,運行服務器容器,在主機埠 (65456) 上發布容器的埠 65456:
docker run \
--interactive --tty --rm \
--publish=65456:65456 \
${Q}:server
并且,在另一個 shell 中,運行客戶端容器,將容器系結到主機的網路。這是提供對主機 65456 埠的訪問的簡單方法,該埠現在映射到服務器容器埠 65456:
docker run \
--interactive --tty --rm \
--net=host \
${Q}:client
反饋
- 當 you 時
FROM python,實際上是在隱式參考 Docker 的容器注冊表。始終保持明確和FROM docker.io/python - 盡量不要使用
:latest. 在這種情況下,您需要考慮使用實際最新版本的 Python 容器(即3.9.15)。 - 通常
WORKDIR用于在容器中定義作業目錄。這將創建和更改檔案夾并保存RUN mkdir并重復參考目標檔案夾。 - 嘗試明確說明正在發生
COPY的事情。對于服務器,它只是server.py而不是.整個目錄。 EXPOSE僅用于檔案。它沒有效果。它僅適用于服務器,因為客戶端不公開任何埠。- 最好不要在代碼中硬編碼常量(
HOST,PORT),而是將它們作為環境變數(即HOST = os.getenv("HOST"))來訪問。這使您的代碼更加靈活。通常 (!) 對于注定要容器化的代碼,您可以默認HOST為localhost(或127.0.0.1有時0.0.0.0)。
FROM docker.io/python:3.9.15
RUN apt-get update
WORKDIR /me
COPY server.py .
EXPOSE 65456
CMD ["python", "/me/server.py"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525411.html
標籤:Python码头工人插座
上一篇:在腳本中實作多執行緒/并行處理
