I have a docker container running jenkins. As part of the build process, I need to access a web server that is run locally on the host machine. Is there a way the host web server (which can be configured to run on a port) can be exposed to the jenkins container?
EDIT: I'm running docker natively on a Linux machine.
UPDATE:
In addition to @larsks answer below, to get the IP address of the Host IP from the host machine, I do the following:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
Solution with docker-compose: For accessing to host-based service you can use
network_mode
parameter https://docs.docker.com/compose/compose-file/#network_modeI've explored the various solution and I find this the least hacky solution:
The only downside is if you have multiple networks or projects doing this, you have to ensure that their IP address range do not conflict.
Here is a Docker Compose example:
You can then access ports on the host from inside the container using the hostname "dockerhost".
Currently the easiest way to do this on Mac and Windows is using host
host.docker.internal
, that resolves to host machine's IP address. Unfortunately it does not work on linux yet (as of April 2018).For macOS and Windows
Docker v 18.03 and above (since March 21st 2018)
Use your internal IP address or connect to the special DNS name
host.docker.internal
which will resolve to the internal IP address used by the host.Linux support pending https://github.com/docker/for-linux/issues/264
MacOS with earlier versions of Docker
Docker for Mac v 17.12 to v 18.02
Same as above but use
docker.for.mac.host.internal
instead.Docker for Mac v 17.06 to v 17.11
Same as above but use
docker.for.mac.localhost
instead.Docker for Mac 17.05 and below
To access host machine from the docker container you must attach an IP alias to your network interface. You can bind whichever IP you want, just make sure you're not using it to anything else.
sudo ifconfig lo0 alias 123.123.123.123/24
Then make sure that you server is listening to the IP mentioned above or
0.0.0.0
. If it's listening on localhost127.0.0.1
it will not accept the connection.Then just point your docker container to this IP and you can access the host machine!
To test you can run something like
curl -X GET 123.123.123.123:3000
inside the container.The alias will reset on every reboot so create a start-up script if necessary.
Solution and more documentation here: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
Use
--net="host"
in yourdocker run
command, thenlocalhost
in your docker container will point to your docker host.I created a docker container for doing exactly that https://github.com/qoomon/docker-host
You can then simply use container name dns to access host system e.g.
curl http://dockerhost:9200