How to Assign Static IP Addresses to Docker Compose Containers

In Docker on 2~4 minutes
How to Assign Static IP Addresses to Docker Compose Containers

When we start Docker containers with Docker Compose, all the service containers in it will get dynamically assigned IP addresses. For example, if you run the containers in the below docker-compose.yml file, each of its app service containers can get new or random IP addresses from its default network. This dynamic IP behaviour is not a problem for containers in the same docker-compose.yml file as they can resolve hostnames out of the box. But the problem is, when you wanted to connect to these containers from the host PC or any other external network, it will be fairly difficult to determine the exact IP address as they do not have any static IP addresses.

version: '3'
services:
    app1:
        image: 'nginx:1.20.0-alpine'
        ports:
            - '8181:80'
    app2:
        image: 'nginx:1.20.0-alpine'
        ports:
            - '8282:80'

Under that kind of situation, we can assign static IP addresses to Docker Compose service containers so they will always get the exact same IP address. For that, first, we must add a custom network to the docker-compose.yml file. Make sure to mention an unused subnet or otherwise, you will not be able to start containers.

networks:
    appNetwork:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: "172.24.2.0/16"

Then, mention that network (Ex: appNetwork) for each service container that needs a static IP address. Also, make sure to double-check whether the IP address that you are going to assign is in the range of the subnet.

services:
    app:
    	...
        networks:
            appNetwork:
                ipv4_address: 172.24.2.1

Likewise, if you need, you can mention IPv6 addresses with ipv6_address as well.

Ultimately, the final docker-compose.yml file should look like something similar to the following.

version: '3'
services:
    app1:
        image: 'nginx:1.20.0-alpine'
        ports:
            - '8181:80'
        networks:
            appnet:
                ipv4_address: 172.24.2.1
    app2:
        image: 'nginx:1.20.0-alpine'
        ports:
            - '8282:80'
        networks:
            appnet:
                ipv4_address: 172.24.2.2
networks:
    appnet:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: "172.24.2.0/16"

Now you can start containers using the docker-compose up command. Add the -d flag if you need to start containers in the detached (background) mode.

docker-compose up -d