Network Two Containers#

In this lab you’ll create a Docker network that you can use to connect two containers. One of the great things about a Docker network is that names and addresses are handled by Docker. On a non-default network containers can be reached by their name. Until now we’ve let Docker automatically give us a name like church_missives, but now we’ll give containers names that we want to be able to use with the --name argument.

Create a Network#

The Django container needs to reach the Postgres. The Postgres container should not expose any ports to the host, it’s completely hidden from the outside world. Let’s create a Docker network:

$ docker network create mysite

Verify your network is there:

$ docker network list
NETWORK ID     NAME      DRIVER    SCOPE
9850eee009e7   bridge    bridge    local
28e6c097494d   mysite    bridge    local
a99d5edd9623   host      host      local
81a76cda7c70   none      null      local

Start Postgress#

If you already have a Postgres container running, stop and remove it. We need to launch it again with the --network option to use the mysite network.

$ docker run -d --rm \
    -v $HOME/data:/var/lib/postgresql/data \
    -e POSTGRES_PASSWORD=django -e POSTGRES_DB=mysite \
    --network mysite \
    --name postgres \
    postgres:14.1

Note

Notice that port forwarding has been disabled.

Update Django’s Configuration#

With Postgres started in a container named postgres you can update Django’s settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mysite',
        'USER': 'postgres',
        'PASSWORD': 'django',
        'HOST': 'postgres',
    },
}

Rebuild and run your container on the mysite network:

$ docker run -it --rm -p 8000:8000 \
    --network mysite --name django \
    -e SECRET_KEY=mysecretkey -e PORT=8000 \
    mysite 

Note

We still need a port forward so our app is visible to the outside.

Clean Up#

With your data safe, you’re free to remove the containers any time you want. Stop and remove your two running containers:

$ docker stop django postgres