Home > Enterprise >  Bind incoming docker connection to specific hostname inside docker container
Bind incoming docker connection to specific hostname inside docker container

Time:09-18

I'm trying to migrate some Webpack based projects to run inside docker containers and have some issues with configuring networking.

  • Our WebPack devServer is configured in the following way:
    {
        host: 'dev.ng.com',
        port: 4000,
        compress: true,
        disableHostCheck: true
    }

in /etc/hosts file we have the following record:

127.0.0.1    dev.ng.com

and everything works fine.

  • When I run it inside docker I was getting EADDRNOTAVAIL error till I added to my docker-compose.yml the following lines:
extra_hosts:
 - "dev.ng.com:127.0.0.1"

But now my app inside the docker app is not available from the host.

The relevant docker-compose.yml part is following:

  gui-client:
    image: "gui-client"
    ports:
      - "4000:4000"
    extra_hosts:
      - "dev.ng.com:127.0.0.1"

If I change in my Webpack host: 'dev.ng.com' to host:'0.0.0.0' it works fine, but I prefer not to change the Webpack config and run it as is.

My knowledge of docker networks internals is limited by I guess that all inbound connections to docker container from the host should be redirected to dev.ng.com:4000 while now they redirected to 0.0.0.0:4000, can it be achieved?

CodePudding user response:

Yes, 127.0.0.1 is reachable normally only from the localhost. Containers work like if they would be virtual machines.

You need to configure it to listen everywhere. So very likely, "dev.ng.com:0.0.0.0" is what you want. Such things should be carefully used in normal circumstances, because mostly we do not want to share internal services to the internet. But here it serves only the purpose to make your configuration independent from the ip/netmask what docker gives to your container app.

Beside that, you need to forward the incoming connections of the host to your container. This can be done by a

- ports:
    "0.0.0.0:4000:4000"

In your docker-compose.yml.

Possibly you will also want to make your port 4000 (of the host) reachable from the external world, this can be done by your firewall rules.

In professional configurations, there is typically some frontend (to provide encryption/security/load balancing), but if you only want to show your work to your boss, a http://a.b.c.d:4000 is pretty enough.

  • Related