The main goal is to do a real NAT instead of NAPT. Note normal `docker run -p ip:port2:port1` command actally is doing NAPT (address+port translation) instead of NAT(address translation). Is it possible to map address only, but keep all exposed ports the same as the container, like `docker run -p=ip1:*:* ...` , instead of one by one or a range?

ps.1. My port range is rather big (22-50070, ssh-hdfs) so port range approach won't work.  

ps.2. Maybe I need a swarm of virtual machines and join the host into the swarm.

ps.3 I raised [an feature request on github](https://github.com/moby/moby/issues/34453). Not sure if they will accept it but currently there are 2000+ open issues (it's so popular).

Solution
--------

On linux, you can access any container by ip and port without any binding (no `-p`) ootb. Docker version: CE 17+

If your host is windows, and docker is running on a linux VM like me, to access the containers, the only thing need to do is adding the route on windows `route add -p 172.16.0.0 mask 255.240.0.0 ip_of_your_vm`. Now you can access all containers by IP:port without any port mapping from both windows host and linux VM.