Docker makes it easy to run apps using serverless cloud solutions, but many people will prefer to manage multiple containers running on a few powerful machines. In this case, using multiple IP addresses can be a great way to manage multiple services on the same port.

How Do Network Interfaces Work?

Linux uses network interfaces to represent physical hardware, as well as creating virtual networking components like VLANs, bridging, or aliases. If you list all the devices on your system with ip addr show, you’ll find various interfaces like eth0 and eno1 which represent actual connections.

IP addresses are a separate system from network interfaces, but essentially, you can have multiple IP addresses configured on a single interface, allowing you to bind services to network sockets for each IP:PORT combination.

This works well with Docker, which lets you handle the networking at the Docker level instead of the application level. With Docker, the application inside the container can just bind to “port 80,” which gets mapped by Docker to a specific IP address on the host.

This makes it far easier to separate the application layer from the host that’s running it. For example, you could have multiple different API services all running on the same machine, without configuring the underlying containers.

It doesn’t really matter for Docker which system interface the IP address is on, as Docker’s internal networking will handle this for you, as long as you launch the containers with the correct configuration.

Running Multiple Docker Services on the Same Server

Running a container on a specific address is pretty easy, depending on how you launch it. Essentially, most Docker containers have their ports configured with the host:container format. For example, 5000:80 would take the container’s port 80 and make it available from the host’s port 5000.

However, you can actually bind sockets directly, meaning instead of 5000, you can substitute an IP:PORT pair, using three colons for the entire binding:

docker run -it -d ipaddress:hostport:containerport --name web nginx

So, for example, you could have two NGINX containers on different IPs, like so (keep in mind, Docker needs separate container names):

docker run -it -d 123.0.0.1:80:80 --name web nginx
docker run -it -d 123.0.0.2:80:80 --name web2 nginx

If you’re using Docker Compose, the configuration is similar. In the ports section for the service, you can use the same syntax to bind to particular addresses.

version: "3"
services:
  nginx:
    image: nginx
    restart: always  
    ports: 
      - "123.0.0.1:80:80"

In either case, you can create multiple services bound to host port 80, as long as the services don’t listen on the same IP addresses.

If you are doing this, however, you will want to make sure that no container is listening on just the port—this will be a misconfiguration, as omitting the IP address will mean that it will listen on all addresses for that interface.

How Do You Get Multiple IP Addresses?

Most servers come with only a single IP address, so you may have to set up additional ones yourself.

Setting up multiple IPs per server will depend on the host you’re using. For example, AWS has it’s “Elastic IP” service, which is free to use if you’re using one IP per machine. However, if you want to purchase additional Elastic IP addresses, you can associate them with any server. You will pay $3.65 a month for each one.

Some services will allow you to make a one-time purchase of IP addresses, like OVH, which allows purchases of blocks up to /24 in size.

If you want to purchase large, contiguous blocks of IP address for you to actually own, you can do so through various brokerages, though this generally incurs a large fee and is mostly for large organizations.

Once you have the IP addresses, it’s up to your cloud provider to point them to your address. However, it’s up to you to configure your network interface to use it, using a tool like netplan.

Profile Photo for Anthony Heddings Anthony Heddings
Anthony Heddings is the resident cloud engineer for LifeSavvy Media, a technical writer, programmer, and an expert at Amazon's AWS platform. He's written hundreds of articles for How-To Geek and CloudSavvy IT that have been read millions of times.
Read Full Bio »