Network communication between containers in different Docker Compose applications running simultaneously

Is there any way that a container X in docker-compose application A can communicate with a container Y in docker-compose application B, both running simultaneously.

I wish to deliver my application as a docker-compose.yml file. This is docker-compose application A. The application requires that certain databases exist. In production, clients must provide these database and inform the application of the required access information.

Here is an runnable simulation of my production deliverable docker-compose.yml file. It provides a service, but needs access to an external Postgres database, configured via three environment variables.

# A
version: '3'

services:

  keycloak:
      image: jboss/keycloak:11.0.3
      environment:
        DB_VENDOR: POSTGRES
        DB_ADDR: ${MYAPP_KEYCLOAK_POSTGRES_ADDR}:${MYAPP_KEYCLOAK_POSTGRES_PORT}
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_SCHEMA: public
        DB_PASSWORD: "${MYAPP_KEYCLOAK_POSTGRES_PASSWORD}"
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: changeme
        PROXY_ADDRESS_FORWARDING: "true"

# Other services ...

Clients run the application with docker-compose up with the three environment variables set to those of a client provided Postgres database.

For development, I compose the required Postgres databases inside the Docker Compose application, using the following docker-compose.yml file. This composition runs out the box.

# DEV
version: '3'


volumes:
  dev-keycloak_postgres_data:
      driver: local

services:

  dev-keycloak-postgres:
      image: postgres:11.5
      volumes:
        - dev-keycloak_postgres_data:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: keycloak-postgres-changeme

# DELIVERABLES

  keycloak:
      image: jboss/keycloak:11.0.3
      environment:
        DB_VENDOR: POSTGRES
        DB_ADDR: dev-keycloak-postgres:5432
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_SCHEMA: public
        DB_PASSWORD: keycloak-postgres-changeme
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: keycloak-admin-changeme
        PROXY_ADDRESS_FORWARDING: "true"
      depends_on:
        - dev-keycloak-postgres

# Other services ...

While using containerized Postgres is not suitable for production, I would like to provide my clients with a demonstration required environment, in the form of a separate docker-compose.yml file, providing the required external infrastructure, in this example, a single containerized Postgres. The is Docker Compose application B.

# B
version: '3'

# For demonstration purposes only! Not production ready!

volumes:
  demo-keycloak_postgres_data:
      driver: local

services:

  demo-keycloak-postgres:
      image: postgres:11.5
      volumes:
        - demo-keycloak_postgres_data:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: keycloak-postgres-changeme

The demonstration required infrastructure application B is delivered and managed completely independently to the real deliverable application A. It needs to be up and running before application A starts.

Suppose the respective docker-compose files are in subfolders A and B respectively.

To start application B, I change into folder B and run docker-compose up.

To start application A, in another terminal I change into folder A, and run docker-compose up with the three environment variables set.

I hoped the following values would work, given the behaviour of the DEV docker-compose.yml above:

export ICT4APP_KEYCLOAK_POSTGRES_ADDR="demo-keycloak-postgres"
export ICT4APP_KEYCLOAK_POSTGRES_PORT="5432"
export ICT4APP_KEYCLOAK_POSTGRES_PASSWORD="keycloak-postgres-changeme"
docker-compose up

But no! Cearly ICT4APP_KEYCLOAK_POSTGRES_ADDR="demo-keycloak-postgres" is wrong.

  • Is there any way a container X in docker-compose application A can communicate with a container Y in docker-compose application B, and if so, can I determine the correct value for ICT4APP_KEYCLOAK_POSTGRES_ADDR

>Solution :

You have to create an external network and assign it to both containers in compose-file a and b.

docker network create external-net

and in your docker-compose.yml add to the end

networks:
  external-net:
    external:
      name: external-net

Leave a Reply