How can you make the Docker container use the host machine's '/etc/hosts' file?

Docker

Docker Problem Overview


I want to make it so that the Docker container I spin up use the same /etc/hosts settings as on the host machine I run from. Is there a way to do this?

I know there is an --add-host option with docker run, but that's not exactly what I want because the host machine's /etc/hosts file may be different on different machines, so it's not great for me to hardcode exact IP addresses/hosts with --add-host.

Docker Solutions


Solution 1 - Docker

Use --network=host in the docker run command. This tells Docker to make the container use the host's network stack. You can learn more here.

Solution 2 - Docker

Add a standard hosts file -

docker run -it ubuntu cat /etc/hosts

Add a mapping for server 'foo' -

docker run -it --add-host foo:10.0.0.3 ubuntu cat /etc/hosts

Add mappings for multiple servers

docker run -it --add-host foo:10.0.0.3 --add-host bar:10.7.3.21 ubuntu cat /etc/hosts

Reference - Docker Now Supports Adding Host Mappings

Solution 3 - Docker

extra_hosts (in docker-compose.yml)

https://github.com/compose-spec/compose-spec/blob/master/spec.md#extra_hosts

Add hostname mappings. Use the same values as the docker client --add-host parameter.

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

Solution 4 - Docker

If you are using docker-compose.yml, the corresponding property is:

services:
  xxx:
    network_mode: "host"

Source

Solution 5 - Docker

Also you can install dnsmasq to the host machine, by the command:

sudo apt-get install dnsmasq

And then you need to add the file /etc/docker/daemon.json with content:

{
    "dns": ["host_ip_address", "8.8.8.8"],
}

After that, you need to restart the Docker service by command sudo service docker restart

This option forces to use the host DNS options for every Docker container. Or you can use it for a single container, and the command-line options are explained by this link. Also docker-compose options are supported (you can read about it by this link).

Solution 6 - Docker

If trusted users start your containers, you could use a shell function to easily "copy" the /etc/hosts entries that you need:

add_host_opt() { awk "/\\<${1}\\>/ {print \"--add-host $1:\" \$1}" /etc/hosts; }

You can then do:

docker run $(add_host_opt host.name) ubuntu cat /etc/hosts

That way you do not have to hard-code the IP addresses.

Solution 7 - Docker

Add this to your run command:

-v /etc/hosts:/etc/hosts

Solution 8 - Docker

The host machine's /etc/hosts file can't mount into a container. But you can mount a folder into the container. And you need a dnsmasq container.

  1. A new folder on host machine

     mkdir -p ~/new_hosts/
    
     ln  /etc/hosts ~/new_hosts/hosts
    
  2. mount the ~/new_hosts/ into container

     docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
    
  3. Config dnsmasq use /new_hosts/hosts to resolve name.

  4. Change your container's DNS server. Use the dnsmasq container's IP address.

If you change the /etc/hosts file on the host machine, the dnsmasq container's /new_hosts/hosts will change.

I found a problem:

> The file in dnsmasq container /new_hosts/hosts can change. But the new hosts can't resolve. Because dnsmasq use inotify listen change event. When you modify a file on the host machine. The dnsmasq can't receive the signal so it doesn't update the configuration. So you may need to write a daemon process to read the /new_hosts/hosts file content to another file every time. And change the dnsmasq configuration to use the new file.

Solution 9 - Docker

If you are running a virtual machine for running Docker containers, if there are hosts (VMs, etc.) you want your containers to be aware of, depending on what VM software you are using, you will have to ensure that there are entries on the host machine (hosting the VM) for whatever machines you want the containers to be able to resolve.

This is because the VM and its containers will have the IP address of the host machine (of the VMs) in their resolv.conf file.

Solution 10 - Docker

I had the same problem and found that it is likely in contrast with the containerization concept! however I solved my problem by adding each (ip host) pair from /etc/hosts to an existing running container in this way:

  1. docker stop your-container-name
  2. systemctl stop docker
  3. vi /var/lib/docker/containers/*your-container-ID*/hostconfig.json

> find ExtraHosts in text and add or replace null with "ExtraHosts":["your.domain-name.com":"it.s.ip.addr"]

  1. systemctl start docker
  2. docker start your-container-name

if you can stop your container and re-run it, you'd have better situation, so just do that. But if you do not want to destroy your containers, just like mine, it would be a good solution.

Solution 11 - Docker

IMO, passing --network=host option while running Docker is a better option as suggested by d3ming over other options as suggested by other answers:

  1. Any change in the host's /etc/hosts file is immediately available to the container, which is what probably you want if you have such a requirement at the first place.
  2. It's probably not a good idea to use the -v option to mount the host's /etc/hosts filr as any unintended change by the container will spoil the host's configuration.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiond3mingView Question on Stackoverflow
Solution 1 - Dockerd3mingView Answer on Stackoverflow
Solution 2 - DockerVinteshView Answer on Stackoverflow
Solution 3 - Docker120DEVView Answer on Stackoverflow
Solution 4 - Docker1615903View Answer on Stackoverflow
Solution 5 - DockerPRIHLOPView Answer on Stackoverflow
Solution 6 - DockermarcolzView Answer on Stackoverflow
Solution 7 - Dockeruser2915097View Answer on Stackoverflow
Solution 8 - Dockeruser6358791View Answer on Stackoverflow
Solution 9 - Dockeruser3379574View Answer on Stackoverflow
Solution 10 - Dockerfoad322View Answer on Stackoverflow
Solution 11 - DockerMohit GuptaView Answer on Stackoverflow