---
navigation: true
title: Docker
main:
  fluid: false
---
:ellipsis{left=0px width=40rem top=10rem blur=140px}
# Docker

Docker, to install deployable services in seconds and manage them with just a few commands or clicks.

::alert{type="info"}
🎯  __Goals:__
- Install [Docker](https://www.docker.com/)
- Install [Dockge](https://github.com/louislam/dockge) to manage stacks
- Install [Watchtower](https://github.com/containrrr/watchtower) to update containers
::

![picture](/img/serveex/docker.svg)

## Install Docker
---
Add the Docker repositories and GPG key:

```shell
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian   $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

Install the packages:

```shell
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

That's it!

**More options:** [Install Docker for Debian 12](https://docs.docker.com/engine/install/debian/)

::alert{type="info" icon="exclamation-circle"}
:::list{type="info"}
- From here on, we assume the stacks are installed in the `/docker` folder, created using the command:
:::
    ```shell
    sudo mkdir /docker
::

## Install [Dockge](https://github.com/louislam/dockge) to manage and deploy containers
---
[Dockge](https://github.com/louislam/dockge) is a web tool to create, configure, launch, and manage Docker containers. It's a simple, intuitive interface that’s lighter and easier for beginners than using the CLI or Portainer.

![picture](/img/serveex/dockge.png)

### Configuration

File structure we will create:

```console
root
└── docker
    └── dockge    
        └── compose.yml
```

Create the stack folder:

```shell
cd /docker
sudo mkdir dockge
```

Then create the `compose.yml` file in this folder using `vim`:

```shell
cd /docker/dockge
sudo vi compose.yml
```
Press `i` to enter insert mode and paste the following:

```yaml
---
services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    container_name: dockge
    ports:
      - 3555:5001 # LAN-accessible port will be 3555

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /docker/dockge/data:/app/data
      - /docker:/docker
    environment:
      - DOCKGE_STACKS_DIR=/docker
```

Press `Esc` and type `:x` to save and exit.

To launch the container:

```shell
cd /docker/dockge
sudo docker compose up -d
```

Then go to `http://yourserverip:3555` in your browser to access the login page.

More info on [Dockge and how to use it](https://github.com/louislam/dockge)

And there you go — Docker and a tool to easily manage your containers are ready!

## [Watchtower](https://github.com/containrrr/watchtower?tab=readme-ov-file), to auto-update containers
---
Watchtower is a container that checks for updates and pulls new images automatically, just by adding a label in your containers’ `compose.yml` files.

### Configuration

- Open Dockge in your browser
- Click `compose`
- Name the stack `watchtower`
- Paste the config below into the default config area in Dockge

```yaml
---
services:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:latest
    restart: unless-stopped
    env_file:
      - .env
    environment:
      - TZ=Europe/Paris
      - WATCHTOWER_SCHEDULE=${SCHEDULE}
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      # Discord notifications - uncomment if used
      #- WATCHTOWER_NOTIFICATIONS=slack
      #- WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
      #- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${WH_URL}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
```

Then fill in the `.env` section in Dockge with the following:

```properties
SCHEDULE=
WH_URL=
```

| Property       | Value                                                              | Examples                                     |
|----------------|--------------------------------------------------------------------|----------------------------------------------|
| `SCHEDULE`     | Cron format                                                        | `0 0 6 * * *` (every day at 6 AM)            |
| `WH_URL`       | Your Discord webhook URL - append `/slack` at the end              | `https://yourdiscordserver/webhook/slack`   |

To have Watchtower monitor your other containers, add this to their `compose.yml`:

```yaml
labels:
  - com.centurylinklabs.watchtower.enable=true
```

Then restart the modified stacks. And that's it — you now have a solid base to start deploying the services you want!