1

我是 Docker 和无人机编程的新手。我能够在我的 Windows 10 上将 python 脚本(包含dronekit 代码)部署到 docker 容器。要运行该脚本,我需要连接到主机上的服务。我在下面提供了一个片段,Windows 有一个正在运行的程序(Mavproxy SITL),它暴露了 127.0.0.1:14550,它是 UDP。我的图像应该连接到这个地址。

mydronectrlscript.py:

from dronekit import connect

# Connect to UDP endpoint.
vehicle = connect(‘udp:127.0.0.1:14550’, wait_ready=True)
# Use returned Vehicle object to query device state - e.g. to get the mode:
print(“Mode: %s” % vehicle.mode.name)

我阅读了有关 host.docker.internal 的文档和回复: https ://docs.docker.com/docker-for-windows/networking/ 如何从 docker 容器访问主机端口

对类似问题的回应表明在 Windows/Mac 上使用 host.docker.internal 版本 18.03+。

我的问题是“如何使用”host.docker.internal?它是在 docker run 命令中传递的吗?你能分享一下它是如何使用的例子吗?使用 host.docker.internal 是否允许 py 脚本访问主机的 UDP 127.0.0.1:14550 地址?

4

2 回答 2

2

您要查找的端点是'http://host.docker.internal'.

在 MacO 上运行。我将在我的 macbook 上运行一项服务,只需在根目录中带有 app.py 的 python:3.6 容器上使用基本烧瓶:

docker run -it -p 5000:5000 python:3.6 bash

pip install flask

python app.py
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/', methods=["GET"])
def main():
    return {'a': 1, 'b': 2}

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)

然后在另一个容器中运行

import requests

r = requests.get('http://host.docker.internal:5000')

r.json()
{'a': 1, 'b': 2}
于 2019-07-18T18:51:24.530 回答
0

简单地说,对我的问题的回答是:

mydronectrlscript.py:

from dronekit import connect
# Connect to UDP endpoint.
vehicle = connect(‘udp:host.docker.internal:14550’, wait_ready=True)
# Use returned Vehicle object to query device state - e.g. to get the mode:
print(“Mode: %s” % vehicle.mode.name)

此外,如果您使用的是 Windows 10 家庭版或需要虚拟盒的操作系统版本,则从我的尝试来看,这不起作用。这适用于 Windows 10 Professional 和 Mac OS。

由于这个问题与无人机编程有关:如果您最终尝试访问 COM 端口(用于遥测),目前无法使用 Windows 操作系统中托管的 Docker 映像:https ://github.com/docker/for-赢/问题/1018

根据我阅读的内容,可以从 Linux 中获得:Docker - 一种访问主机 USB 或串行设备的方法?

于 2019-07-22T14:22:34.383 回答