从容器连接到主机服务的示例

时间:2019-07-18 15:31:48

标签: python docker drone telemetry dronekit

我是Docker和Drone编程的新手。我能够在Windows 10上将python脚本(包含dronekit代码)部署到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/ How to access host port from docker container

响应类似的问题状态,在Windows / Mac上使用host.docker.internal(版本18.03 +)。

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

2 个答案:

答案 0 :(得分:0)

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

在MacO上运行。我将使用python:3.6容器上的基本烧瓶在根目录中具有app.py的情况下,在Macbook上运行服务:

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}

答案 1 :(得分: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 Home Edition或需要虚拟盒子的OS版本,那么从我尝试过的方法来看这是行不通的。这适用于Windows 10专业版和Mac OS。

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

根据我读到的内容,可以在Linux上使用:Docker - a way to give access to a host USB or serial device?