Hi everyone,
This is a tutorial I am going to walk through how to run two docker containers, add them to a new docker network and communicate with each other.
for this, I am going to create a demo API with nodejs and a Postgres database in containers, and connect them to a docker network.
so first I am creating a docker network. docker network is an isolated network layer, which allows you to add containers to it. we can assign these containers' IP addresses inside the network, and let them communicate. host to container port mapping is still available when using a network in a container. docker will create a bridge by default.
to create a docker network
docker network create --subnet 172.20.0.0/16 dockernetworkdemo
here I have specified a subnet with the value 172.20.0.0/16 in CIDR format.
after we run this command we can check it using
docker network ls
we can also use
docker network inspect dockernetworkdemo
to view more details about the network.
here dockernetworkdemo is the name of the network we specified then creating the network.
now we have the network in place next move to the database.
here we are going to use a Postgres database.
to spin a Postgres database I will use
docker run --name dockernetworkdemopg -p 6543:5432 -e POSTGRES_PASSWORD=123 -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres -d postgres:10-alpine
in this command,
dockernetworkdemopg is the name of the container
-p 6543:5432 will map port 5432 in the container to 6543 host port. here I have used a different port because I have a Postgres database already running on port 5432
-e POSTGRES_PASSWORD=123 -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres here -e flag will pass an environment variable to the container, here we specify the password, user, and database.
-d flag will run this container in detached mode.
postgres:10-alpine is the name and the tag of the Postgres image we are fetching from the Docker Hub. here I have chosen the alpine version because it is lightweight and smaller in size around 20 mb .
now if we use
docker ps
command we can see that our Postgres container is up and running.
next, we are going to connect the Postgres container (dockernetworkdemopg) to the network (dockernetworkdemo) we created.
docker network connect --ip 172.20.0.5 dockernetworkdemo dockernetworkdemopg
here we have specified the IP of the connecting container to be 172.20.0.5 using --ip flag.
now if we run the network inspect command we can see
the container we added.
now we'll setup the API. I am using a simple nodejs API, and build a docker image.
FROM node:current-alpine3.12
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm i
ENV NODE_ENV=production
ENV DBURL=postgres://postgres:123@172.20.0.5:5432/postgres
ENV PORT=3001
COPY . .
EXPOSE 3001
CMD [ "npm", "run" , "prod" ]
in the dockerfile, we have specified the environment variable DBURL to the Postgres container we ran earlier.
ENV DBURL=postgres://postgres:123@172.20.0.5:5432/postgres
in the connection string postgres://postgres:123@172.20.0.5:5432/postgres
172.20.0.5:5432 is the IP address and the port of the Postgres container.172.20.0.5 is the IP address we specified when connecting to the network.
docker build -t dockernetworkdemoapi .
here -t will set the name and tag to dockernetworkdemoapi:latest
before running the images we have to create the database relation so that we can query data using the API . for that I am using a migration script to run some SQL commands.
because migration is running in the host machine, connection string is passed as postgres://postgres:123@localhost:6543/postgres with database IP as localhost and port as 6543 specified when running the Postgres database.
next, we will run the API image dockernetworkdemoapi:latest .
docker run --name dockernetworkdemoapicont -p 3001:3001 dockernetworkdemoapi:latest
in the above command --name flag specifies the name of the container to be dockernetworkdemoapicont
-p 3001:3001 to publish the ports with 3001 container port to 3001 host port.
dockernetworkdemoapi:latest is the docker image.
here i ran the container without detached mode so we can see the output.
now as the final step we are connecting the API (dockernetworkdemoapicont) container to the dockernetworkdemo docker network.
docker network connect dockernetworkdemo dockernetworkdemoapicont
now if we send a get request to the API we can see that API is able to connect to the database.
final docker inspect output
illustration of the network.











Top comments (0)