taipower-dreams-tester / dreams-cloud-joint-tester

Repository for the tester that verifies if a cloud PV monitoring system meet the requirement of Tai Power DREAMS system
11 stars 8 forks source link

請問1-1連線問題 #57

Closed red81227 closed 1 year ago

red81227 commented 1 year ago

您好 ! 可否請問關於測試系統與outstation連線的問題,感謝!

我使用opendnp3將outstation執行於本地環境 AddTCPServer設為 LOCAL_IP : 0.0.0.0 PORT: 20000

兩次 AddOutstation分別設 LocalAddr = 4 RemoteAddr = 3 和 LocalAddr = 5 RemoteAddr = 3

啟動dreams tester之後設定ip 127.0.0.1 port 20000如下 image

但連線皆失敗,使用wireshark也沒觀察到dnp3.0的封包,想請問設定上有甚麼錯誤? 對DNP3十分陌生,可否提供協助,感謝!

另外自己起的master可以觀察到dnp3.0的封包,也有看到from 4 to 3和 from 5 to 3 如下,master也可以scan到outstation的資料。

image

另外觀察 dreamscloudjointtester_dnp3-master_1的docker logs,master似乎是有成功起起來的。 image

感謝!

red81227 commented 1 year ago

container連接localhost需另外設定

wisewomanbbt commented 3 months ago

@red81227 不好意思,請問一下您說的 container連接localhost需另外設定 ,是怎麼設定的?

red81227 commented 3 months ago

當初遇到的問題是container無法訪問宿主機(host)的local,解法幫你問了chatGPT以下

在 Linux 上,host.docker.internal 通常是不可用的。这个域名主要是在 Docker Desktop for Mac 和 Windows 环境中引入的,用于方便容器访问宿主机上的服务。然而,在 Linux 环境中,Docker 没有默认支持这个功能。

解决方案

要在 Linux 环境中让 Docker 容器访问宿主机上的 localhost 服务,可以使用以下几种方法:

方法 1: 使用宿主机的 IP 地址(docker0 网桥)

  1. 获取宿主机的 IP 地址: 在 Linux 上,Docker 使用 docker0 网络接口来处理默认桥接网络。可以通过以下命令获取宿主机在 docker0 网桥上的 IP 地址:

    ip addr show docker0

    典型的 IP 地址可能是 172.17.0.1

  2. 在容器中使用这个 IP 地址: 一旦你知道了宿主机的 IP 地址,你可以在容器内通过该地址访问宿主机的服务。例如,如果宿主机上在端口 8080 运行了一个服务,你可以在容器中这样访问它:

    curl http://172.17.0.1:8080

方法 2: 使用 --network="host" 模式

  1. 启动容器时指定 --network="host": 在 Linux 上,你可以使用 --network="host" 选项启动容器。这会让容器直接使用宿主机的网络堆栈,因此容器中的 localhost 就是宿主机的 localhost

    docker run --rm --network="host" your-image

    在这种模式下,容器内的任何服务都可以直接通过 localhost 访问宿主机的服务。

  2. 在 Docker Compose 中使用: 如果你使用 Docker Compose,可以在 docker-compose.yml 中设置 network_mode: "host"

    version: '3'
    services:
     app:
       image: your-image
       network_mode: "host"

方法 3: 手动添加宿主机的 IP 到 /etc/hosts

  1. 在容器内手动配置 /etc/hosts 文件: 你可以将宿主机的 IP 地址映射到 host.docker.internal,这样你仍然可以使用这个域名来访问。

    • 获取宿主机的 IP 地址(如前所述)。
    • 在启动容器时添加一个命令,将 IP 地址添加到 /etc/hosts 文件中:

      docker run -it --add-host=host.docker.internal:172.17.0.1 your-image

    这样你就可以在容器内通过 host.docker.internal 访问宿主机。

总结