content/manuals/engine/network/drivers/host.md
If you use the host network mode for a container, that container's network
stack isn't isolated from the Docker host (the container shares the host's
networking namespace), and the container doesn't get its own IP-address allocated.
For instance, if you run a container which binds to port 80 and you use host
networking, the container's application is available on port 80 on the host's IP
address.
[!NOTE]
Given that the container does not have its own IP-address when using
hostmode networking, port-mapping doesn't take effect, and the-p,--publish,-P, and--publish-alloption are ignored, producing a warning instead:consoleWARNING: Published ports are discarded when using host network mode
Host mode networking can be useful for the following use cases:
This is because it doesn't require network address translation (NAT), and no "userland-proxy" is created for each port.
The host networking driver is supported on:
[!NOTE] For Docker Desktop users, see the Docker Desktop section below for setup instructions.
You can also use a host network for a swarm service, by passing --network host
to the docker service create command. In this case, control traffic (traffic
related to managing the swarm and the service) is still sent across an overlay
network, but the individual swarm service containers send data using the Docker
daemon's host network and ports. This creates some extra limitations. For instance,
if a service container binds to port 80, only one service container can run on a
given swarm node.
Host networking is supported on Docker Desktop version 4.34 and later. To enable this feature:
This feature works in both directions. This means you can access a server that is running in a container from your host and you can access servers running on your host from any container that is started with host networking enabled. TCP as well as UDP are supported as communication protocols.
The following command starts netcat in a container that listens on port 8000:
$ docker run --rm -it --net=host nicolaka/netshoot nc -lkv 0.0.0.0 8000
Port 8000 will then be available on the host and you can connect to it with the following
command from another terminal:
$ nc localhost 8000
What you type in here will then appear on the terminal where the container is running.
To access a service running on the host from the container, you can start a container with host networking enabled with this command:
$ docker run --rm -it --net=host nicolaka/netshoot
If you then want to access a service on your host from the container (in this
example a web server running on port 80), you can do it like this:
$ nc localhost 80
This example shows how to start an Nginx container that binds directly to port 80 on the Docker host. From a networking perspective, this provides the same level of isolation as if Nginx were running directly on the host, but the container remains isolated in all other aspects (storage, process namespace, user namespace).
Create and start the container as a detached process. The --rm option
removes the container when it exits. The -d flag starts it in the
background:
$ docker run --rm -d --network host --name my_nginx nginx
Access Nginx by browsing to http://localhost:80/.
Examine your network stack:
Check all network interfaces and verify that no new interface was created:
$ ip addr show
Verify which process is bound to port 80 using netstat. You need sudo
because the process is owned by the Docker daemon user:
$ sudo netstat -tulpn | grep :80
Stop the container. It's removed automatically because of the --rm option:
$ docker container stop my_nginx