Example to connect from container to host service

浪子不回头ぞ 提交于 2020-05-30 08:14:58

问题


I am new to Docker and Drone Programming. I was able to deploy a python script (that contains dronekit code) to docker container on my Windows 10. To run the script, I need to connect to a service on my host. I have provided a snippet below, Windows has a program running(Mavproxy SITL) which has exposed 127.0.0.1:14550 which is UDP. My image should connect to this address.

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)

I read documents and responses about host.docker.internal: https://docs.docker.com/docker-for-windows/networking/ How to access host port from docker container

Responses to similar question states to use host.docker.internal on Windows/Mac for version 18.03+.

My questions is "how to use" host.docker.internal? Is it passed in the docker run command? Can you please share me an example of how is it used? Will the use of host.docker.internal allow py script to access host’s UDP 127.0.0.1:14550 address ?


回答1:


The endpoint you're looking for is 'http://host.docker.internal'.

Running on MacOs. I will run a service on my macbook just using basic flask on a python:3.6 container with app.py in the root directory:

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)

Then just running in another container

import requests

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

r.json()
{'a': 1, 'b': 2}



回答2:


Simply, response to my question is:

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)

Also, from what I tried this does not work if you are using Windows 10 Home edition or a version of OS that needs virtual box. This worked on Windows 10 Professional and Mac OS.

Since this question is related to drone programming: If you are eventually trying to access COM ports (for telemetry), it is not possible at the moment with Docker image hosted in Windows OS: https://github.com/docker/for-win/issues/1018

It is possible from Linux based on what I read: Docker - a way to give access to a host USB or serial device?



来源:https://stackoverflow.com/questions/57098061/example-to-connect-from-container-to-host-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!