Communication Between Docker Containers
Sometimes between docker containers, we need connect container B from container A to do fast test, etc. For most well-known example, we have FastAPI app container connect to postgres db container. In addition, it's likely to do some sql test on PostgreSQL db container in a third container.
Here some methods we can use.
Using --link flag(Legacy)
Start a postgres db container:
docker run --rm --name postgres-db --detach -e POSTGRES_PASSWORD=mysecretpassword postgres
Run a postgres client container to connect the db container with user postgres and password mysecretpassword:
docker run -it --rm --link postgres-db:db postgres psql -h db -U postgres
psql (14.3)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
Or run a utility container:
docker run -it --rm --link postgres-db:db busybox sh
# in `busybox`
ping db
Using the default network
If you are running your container without specifying attached network, it will use the docker default bridge network.
However The default bridge network allows container-to-container communication by IP address only. To use hostname or alias name in connecting rather than IP address, see the following methods.
So before connecting, we need get the container IP address by
docker inspect.
Start a postgres db container:
docker run --rm --name postgres-db --detach -e POSTGRES_PASSWORD=mysecretpassword postgres
Get the IP address of the postgres db container:
docker inspect mynginx | grep IPAddress
"IPAddress": "172.17.0.2",
Run a postgres client container to connect the db container:
docker run -it --rm postgres psql -h "172.17.0.2" -U postgres
psql (14.3)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
Using the private network
Creating private bridge network will give you more privacy that it only allows only containers belonging to it can talk to each other.
Moreover, you can use hostname or alias name to connect without regard of IP address changing due to re-start.
Create a private bridge network:
docker network create postgres-net
Start a postgres db container:
docker run --rm --net postgres-net --name postgres-db --detach -e POSTGRES_PASSWORD=mysecretpassword postgres
Run a postgres client container to connect the db container:
docker run -it --rm --net postgres-net postgres psql -h postgres-db -U postgres
psql (14.3)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
Use Case in Docker Compose
Actually, docker compose will create its private bridge network, and when it start containers, containers will be attached to that network in default.
# Use below credentials to access in `adminer` web to access `db`,
# server: db (db1, db2 are also available!)
# user: postgres
# password: example
version: '3.1'
services:
db:
image: postgres
restart: always
environment:
# POSTGRES_USER: postgres # `postgres` in default.
POSTGRES_PASSWORD: example
networks:
default:
aliases:
- db1
- db2
adminer:
image: adminer
restart: always
ports:
- 8080:8080