Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using custom local domain with Docker

Tags:

docker

I am running Docker using Docker Desktop on Windows.

I would like to set-up a simple server.

I run it using:

$ docker run -di -p 1234:80 yahya/example-server

This works as expected and runs fine on localhost:1234.

However, I want to give it's own local domain name (e.g. api.example.test), which should only be accessible locally.

Normally for a VM setup I would edit the Windows hosts file, get the IP address of the VM (let's say it's 192.168.90.90) and add something like the following:

192.168.90.90 api.example.test

How would I do something similar in Docker.

I know you can enter an ip address for port forwarding, but if I enter any local IP I get the following error:

$ docker run -di -p 192.168.90.90:1234:80 yahya/example-server
docker: Error response from daemon: Ports are not available: exposing port TCP 192.168.90.90:80 -> 0.0.0.0:0: listen tcp 192.168.90.90:80: can't bind on the specified endpoint.

However, it does work for 10.0.0.7 for some reason (I found this IP automatically added in the hosts file after installing Docker Desktop).

$ docker run -di -p 10.0.0.7:1234:80 yahya/example-server

This essentially solves the issue, but would become an issue again if I have more than 1 project.

Is there a way I can use another local IP address (preferably without a nginx proxy)?

like image 358
Yahya Uddin Avatar asked Aug 14 '26 08:08

Yahya Uddin


1 Answers

I think there is no simple way to do this without some kind of reverse-proxy.

In my dev environment I use Traefik and dnscrypt-proxy to achieve automatic *.test domain names for multiple projects at same time

First, start Traefik proxy on ports 80 and 433, example docker-compose.yml:

---
networks:
  traefik:
    name: traefik

services:
  traefik:
    image: traefik:2.8.3
    container_name: traefik
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    ports:
      - 80:80
      - 443:443
    environment:
      TRAEFIK_API: 'true'
      TRAEFIK_ENTRYPOINTS_http: 'true'
      TRAEFIK_ENTRYPOINTS_http_ADDRESS: :80
      TRAEFIK_ENTRYPOINTS_https: 'true'
      TRAEFIK_ENTRYPOINTS_https_ADDRESS: :443
      TRAEFIK_ENTRYPOINTS_https_HTTP_TLS: 'true'
      TRAEFIK_GLOBAL_CHECKNEWVERSION: 'false'
      TRAEFIK_GLOBAL_SENDANONYMOUSUSAGE: 'false'
      TRAEFIK_PROVIDERS_DOCKER: 'true'
      TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT: 'false'

Then, attach your service to traefik network, and set labels for routing (see Traefik & Docker). Example docker-compose.yml:

---
networks:
  traefik:
    external: true

services:
  example:
    image: yahya/example-server
    restart: always
    labels:
      traefik.enable: true
      traefik.docker.network: traefik
      traefik.http.routers.example.rule: Host(`example.test`)
      traefik.http.services.example.loadbalancer.server.port: 80
    networks:
      - traefik

Finally, add to hosts:

127.0.0.1 example.test

Instead of manually adding all future domains to hosts, you can setup local DNS resolver. I prefer to use cloaking feature of dnscrypt-proxy for this.

You can install it using Installation instructions, then uncomment following line in dnscrypt-proxy.toml:

cloaking_rules = 'cloaking-rules.txt'

and add to cloaking-rules.txt:

*.test 127.0.0.1

finally, setup your network connection to use 127.0.0.1 as DNS resolver

like image 180
Catzilla Avatar answered Aug 16 '26 23:08

Catzilla



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!