# How to Update Docker Container with Zero Downtime

> URL: https://www.atlantic.net/vps-hosting/how-to-update-docker-container-with-zero-downtime/ | Published: 2021-03-01 | Updated: 2023-11-27 | Author: Hitesh Jethva

In a Dockerized environment, you are using multiple images and working with many containers. When you run a container from an image, it continues running that version because Docker images do not update automatically. You may need to update it manually. It is always recommended to run a container from the latest Docker image.

In this guide, we will show you hands-on examples of how to update a running container with zero downtime.

## Step 1 – Install Docker CE and Docker Compose

First, install all required dependencies with the following command:

```
apt-get update -y
apt-get install git apt-transport-https ca-certificates curl software-properties-common -y
```

Next, add the Docker GPG key and repository with the following command:

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```

Once the repository has been added, install the Docker and Docker compose with the following command:

```
apt-get install docker-ce docker-compose -y
```

Once both packages are installed, you can proceed to the next step.

## Step 2 – Create a Docker Compose File

For the purpose of this tutorial, we will create a docker network, volume, and a docker-compose.yml file to deploy a Ghost container.

First, create a network named net and volume named ghost using the following command:

```
docker network create net
docker volume create ghost
```

Next, create a directory for the Ghost project with the following command:

```
mkdir Ghost
```

Next, change the directory to Ghost and create a docker-compose.yml file:

```
cd Ghost
nano docker-compose.yml
```

Add the following lines:

```
version: '3.5'
services:
  ghost:
    image: ghost:3.36
    volumes:
      - ghost:/var/lib/ghost/content
    environment:
      - VIRTUAL_HOST=ghost.example.com
      - url=http://ghost.example.com
      - NODE_ENV=production
    restart: always
    networks:
      - net

volumes:
  ghost:
    external: true

networks:
  net:
    external: true
```

Save and close the file when you are finished.

The above file will download the Ghost image version 3.36 and create a Ghost container for domain ghost.example.com.

## Step 3 – Create a Ghost Container

Now, change the directory to Ghost and launch the Ghost container using the following command:

```
docker-compose up -d
```

You should get the following output:

```
Pulling ghost (ghost:3.36)...
3.36: Pulling from library/ghost
bb79b6b2107f: Pull complete
99ce436c3449: Pull complete
f7bdc31da5f5: Pull complete
7a1300b9ff59: Pull complete
a495c68fa838: Pull complete
6e362a39ec35: Pull complete
b68b4f3c36f7: Pull complete
41f8b02d4a71: Pull complete
3ecc736ea4e5: Pull complete
Digest: sha256:595c759980cd22e99037811397012908d89efb799776db222a4be6d4d892917c
Status: Downloaded newer image for ghost:3.36
Creating ghost_ghost_1 ... done
```

You can check the Ghost image with the following command:

```
docker images
```

Output:

```
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ghost        3.36      455ce1645479   4 months ago   440MB
```

You can also check the Ghost container with the following command:

```
docker ps
```

Output:

```
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS      NAMES
d4b51b1aafc8   ghost:3.36   "docker-entrypoint.s…"   23 seconds ago   Up 20 seconds   2368/tcp   ghost_ghost_1
```

## Step 4 – Update the Docker Compose File

In this section, we will update the Docker compose file and change the Ghost version from 3.36 to 3.37.1:

```
nano docker-compose.yml
```

Make the following changes:

```
version: '3.5'
services:
  ghost:
    image: ghost:3.37.1
    volumes:
      - ghost:/var/lib/ghost/content
    environment:
      - VIRTUAL_HOST=ghost.example.com
      - url=http://ghost.example.com
      - NODE_ENV=production
    restart: always
    networks:
      - net

volumes:
  ghost:
    external: true

networks:
  net:
    external: true
```

Save and close the file when you are finished.

## Step 5 – Launch a New Ghost Container

Now, we will use the scaling method to create a new Ghost container without affecting the older Ghost container. You can do it with the following command:

```
cd Ghost
docker-compose up -d --scale ghost=2 --no-recreate
```

You should get the following output:

```
Pulling ghost (ghost:3.37.1)...
3.37.1: Pulling from library/ghost
bb79b6b2107f: Already exists
99ce436c3449: Already exists
7f4b5e228565: Pull complete
de71eab7febf: Pull complete
29961d2eb573: Pull complete
923f84e249ab: Pull complete
dfad6f73fc3d: Pull complete
b16cf83b3022: Pull complete
387b2254843c: Pull complete
Digest: sha256:fad0c2631cbba3d6c61da6fa5ef39da201780f2ae64ce51f3d5ebb412ca2564b
Status: Downloaded newer image for ghost:3.37.1
Starting ghost_ghost_1 ... done
Creating ghost_ghost_2 ... done
```

You can check the new Ghost image with the following command:

```
docker images
```

Output:

```
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ghost        3.37.1    c64d108acdfe   3 months ago   439MB
ghost        3.36      455ce1645479   4 months ago   440MB
```

You can also check the new Ghost container with the following command:

```
docker ps
```

Output:

```
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS      NAMES
c21550f39440   ghost:3.37.1   "docker-entrypoint.s…"   33 seconds ago   Up 31 seconds   2368/tcp   ghost_ghost_2
d4b51b1aafc8   ghost:3.36     "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    2368/tcp   ghost_ghost_1
```

## Step 6 – Scale the New Ghost Container

At this point, both Ghost containers are running using the same configuration. Now, we will stop and remove the old Ghost container.

```
docker container stop ghost_ghost_1
docker container rm ghost_ghost_1
```

Now, run the following command to scale down the configuration to its original setting:

```
cd Ghost
docker-compose up -d --scale ghost=1 --no-recreate
```

You can also check the new Ghost container log for more information.

```
docker logs ghost_ghost_2
```

Output:

```
[2021-03-05 04:50:13] INFO Blog is in maintenance mode.
[2021-03-05 04:50:13] INFO Ghost is running in production...
[2021-03-05 04:50:13] INFO Your site is now available on http://ghost.example.com/
[2021-03-05 04:50:13] INFO Ctrl+C to shut down
[2021-03-05 04:50:13] INFO Ghost boot 3.581s
[2021-03-05 04:50:13] INFO Creating database backup
[2021-03-05 04:50:13] INFO Database backup written to: /var/lib/ghost/content/data/ghost.ghost.2021-03-05-04-50-13.json
[2021-03-05 04:50:13] INFO Updating portal button setting to false
[2021-03-05 04:50:13] INFO Blog is out of maintenance mode.
```

Your Ghost container is now updated with a new Ghost image.

## Conclusion

In the above guide, you learned how to update the Docker container without any downtime. Get started with updating your Docker container on [VPS hosting](https://www.atlantic.net/vps-hosting/) from Atlantic.Net!
