我是Docker和无人机编程的新手。我能够将一个python脚本(包含dronekit代码(部署到Windows 10上的docker容器。若要运行脚本,我需要连接到主机上的服务。我在下面提供了一个片段,Windows有一个正在运行的程序(Mavproxy SITL(,它暴露了UDP的127.0.0.1:14550。我的图像应连接到此地址。
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 上的 18.03+ 版中使用 host.docker.internal。
我的问题是"如何使用"host.docker.internal?它是在 docker run 命令中传递的吗?你能给我分享一个如何使用它的例子吗?使用 host.docker.internal 会允许 py 脚本访问主机的 UDP 127.0.0.1:14550 地址吗?
您要查找的端点是 'http://host.docker.internal'
。
在 MacOS 上运行。我将在我的 macbook 上运行一个服务,只需在 python:3.6 容器上使用基本烧瓶,根目录中有 app.py:
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}
简单地说,对我问题的回答是:
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-win/issues/1018
根据我读到的内容,可以从 Linux 获得:Docker - 一种访问主机 USB 或串行设备的方法?