从容器连接到主机服务的示例
Example to connect from container to host service
我是 Docker 和无人机编程的新手。我能够将 python 脚本(包含 dronekit 代码)部署到 Windows 10 上的 docker 容器。要 运行 脚本,我需要连接到服务在我的主机上。我在下面提供了一个片段,Windows 有一个程序 运行ning(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/
对类似问题的回复表明在 Windows/Mac 上使用 host.docker.internal 版本 18.03+。
我的问题是"how to use"host.docker.internal?是在docker运行命令中传入的吗?你能给我分享一个如何使用它的例子吗?
使用 host.docker.internal 是否允许 py 脚本访问主机的 UDP 127.0.0.1:14550 地址?
您要查找的端点是 '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}
简单地说,对我的问题的回答是:
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 家庭版或需要虚拟框的 OS 版本,这将不起作用。这适用于 Windows 10 Professional 和 Mac OS。
由于本题与无人机编程相关:
如果您最终尝试访问 COM 端口(用于遥测),目前无法使用 Docker 托管在 Windows OS 中的图像:https://github.com/docker/for-win/issues/1018
根据我阅读的内容,从 Linux 开始是可能的:Docker - a way to give access to a host USB or serial device?
我是 Docker 和无人机编程的新手。我能够将 python 脚本(包含 dronekit 代码)部署到 Windows 10 上的 docker 容器。要 运行 脚本,我需要连接到服务在我的主机上。我在下面提供了一个片段,Windows 有一个程序 运行ning(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/
对类似问题的回复表明在 Windows/Mac 上使用 host.docker.internal 版本 18.03+。
我的问题是"how to use"host.docker.internal?是在docker运行命令中传入的吗?你能给我分享一个如何使用它的例子吗? 使用 host.docker.internal 是否允许 py 脚本访问主机的 UDP 127.0.0.1:14550 地址?
您要查找的端点是 '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}
简单地说,对我的问题的回答是:
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 家庭版或需要虚拟框的 OS 版本,这将不起作用。这适用于 Windows 10 Professional 和 Mac OS。
由于本题与无人机编程相关: 如果您最终尝试访问 COM 端口(用于遥测),目前无法使用 Docker 托管在 Windows OS 中的图像:https://github.com/docker/for-win/issues/1018
根据我阅读的内容,从 Linux 开始是可能的:Docker - a way to give access to a host USB or serial device?