首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker:没有硬编码IP地址的多个客户端/服务器容器

Docker:没有硬编码IP地址的多个客户端/服务器容器
EN

Stack Overflow用户
提问于 2021-02-25 01:48:10
回答 1查看 190关注 0票数 0

下午好。我是一个全新的Docker新手,我正在努力想出一个可扩展的解决方案来产生网络流量。我想让多个客户端和服务器端的容器通过docker桥网络相互通信。现在我有一个客户端和一个服务器容器,它们相互通信,但速度非常慢。此外,我必须对他们的IP地址进行硬编码,以便他们能够找到对方。必须有一种更好的方法来向上扩展,但我正在努力,因为我的client.py代码需要服务器的IP地址和端口号来查找服务器。

Client.py

代码语言:javascript
复制
from pyModbusTCP.client import ModbusClient
import time    

c = ModbusClient()
c.host("172.20.0.2")
c.port(502)
    
while True:
    if not c.is_open():
        if not c.open():
            print("Unable to connect to Server at 172.20.0.2:502")
        
    if c.is_open():
        regs = c.read_holding_registers(0, 4)
        if regs:
            print("Register #0: " + str(regs[0]))
            print("Register #1: " + str(regs[1]))
            print("Register #2: " + str(regs[2]))
            print("Register #3: " + str(regs[3]))
    time.sleep(5)

客户端DockerFile

代码语言:javascript
复制
FROM python:3
    
WORKDIR ~/client-server-docker-test/client
    
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
    
COPY . .
    
CMD ["python", "./client.py"]

Server.py

代码语言:javascript
复制
from pyModbusTCP.server import ModbusServer, DataBank
from time import sleep
from random import uniform
    
# set up server
server = ModbusServer('localhost',502, no_block=True)
# initialize register 0 with value of 80
DataBank.set_words(0, [80])
    
try:
    print("Start server...")
        server.start()
        print("Server is online...")
        # change register value every 5 seconds. 
        while True:
            # Set Register @ Address 0 to random int. value
            DataBank.set_words(0, [int(uniform(0,100))])
            # Tank 2
            DataBank.set_words(1, [int(uniform(0,100))])
            # Tank 3
            DataBank.set_words(2, [int(uniform(0,100))])
            # Tank 4
            DataBank.set_words(3, [int(uniform(0,100))])
            sleep(5)
# when hit ctrl+C in CMD line, shut down server
except:
    print("Shutdown server....")
    server.stop()
    print("Server is offline...")
    sleep(0.5)

服务器DockerFile

代码语言:javascript
复制
FROM python:3
    
WORKDIR ~/client-server-docker-test/server
    
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
    
COPY . .
    
CMD ["python", "./server.py"]

Docker-Compose文件

代码语言:javascript
复制
version: '2.1'
services:
  server:
    image: server1
    container_name: server1_con
    ports:
      - 502:502
    networks:
      test_net:
        ipv4_address: 172.20.0.2
    
  client:
    image: client1
    container_name: client1_con
    depends_on:
      - server
    networks:
      test_net:
        ipv4_address: 172.20.0.3
    
networks:
  test_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16

这会运行,但是我的客户机永远需要花费时间将寄存器值输出到命令行。除了速度慢之外,我目前的方法还不可伸缩。我必须使用MODBUS TCP协议进行通信,这就是python代码使用pyModbusTCP的原因。但是,必须有一种方法可以让10个客户端和服务器容器相互通信,而不必为每个容器指定IP地址?

我已经研究过docker swarm,但我看不出它如何帮助我解决为每个容器分配静态IP地址的问题。我还尝试添加一个环境变量,其中docker获取服务器的IP地址并将其传递到client.py代码中,但我无法使其正常工作。我被困住了,任何帮助都将不胜感激。非常感谢您的宝贵时间。

编辑:它非常慢,这意味着当我运行"docker-compose up“时,我会收到一个"Attaching to server1_con,client1_con”的通知,但我的命令行需要大约10分钟才能开始显示打印输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 04:30:21

这里有许多问题;首先是关于“我的命令行开始显示打印输出的大约10分钟”;在非缓冲模式下运行python,例如:

代码语言:javascript
复制
CMD ["python","-u", "client.py"]

第二个问题是启动服务器ModbusServer('localhost',502, no_block=True)的方式-这将绑定到本地主机,并且不能从主机(在本例中是容器)外部访问。使用ModbusServer('0.0.0.0',502, no_block=True)绑定到主机上的所有地址。

第三是消除了对IP地址进行硬编码的需要;将您的docker-compose.yml更新为(注意:我已经添加了build路径):

代码语言:javascript
复制
version: '2.1'
services:
  server:
    build: ./server
    networks:
      - test_net

  client:
    build: ./client
    depends_on:
      - server
    networks:
      - test_net

networks:
  test_net:
    driver: bridge
    ipam:
      driver: default

并将client.py更改为使用服务名称c.host("server")。通过这些更改,我相信当我在我的机器上运行应用程序时,您的应用程序所做的是您所期望的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66356177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档