问题
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