Install Docker

Docker can be installed as described in the installation notes on docker.com.

Set up the repository

  1. update apt package index and install prerequisites

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
  1. Add Docker's official GPG key

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
  1. Add stable arm64 repository for debian10

sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

The docker daemon uses iptables for NAT while Debian uses nftables. Switching to iptables-legacy prevents dockerd from being unable to start

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
  1. Install Docker engine

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. Done - installation can be verified by running the hello world docker container:

sudo docker run hello-world

Get Docker Compose

Docker Compose allows the user to easily configure more complex docker projects containing multiple images in multiple containers with dependencies and network links set up.

Unfortunately there is no prebuilt arm64 version of Docker Compose available. The easiest way to run Docker Compose anyway is to run it in a Docker container as described here.

The docker container can be used almost like a native installation of Docker Compose after running the following two commands:

sudo curl -L --fail https://raw.githubusercontent.com/linuxserver/docker-docker-compose/master/run.sh -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

With this setup docker-compose.yml-files can simply be started with the docker-compose up -d command.

Docker Compose example

This is the contents of a working docker-compose.yml file that sets up a wordpress webserver that depends on a mariadb database.

docker-compose.yml

version: '2'
 
services:
  db:
    image: mariadb
    volumes:
      - ./data/db/:/var/lib/mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: wproot
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
 
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    working_dir: /var/www/html
    volumes:
       - ./data/wordpress:/var/www/html/wp-content

Create the docker-compose.yml-file and start the containers:

sudo docker-compose up

After starting the containers a WordPress website will be available at http://localhost:8080.

Portainer

Portainer simplifies finding and deleting unused images, containers, networks and volumes. It also provides a simple GUI to monitor and control docker containers, images, networks and volumes. It is also possible to set up new containers using portainer, although docker-compose is more popular and probably more versatile for that purpose.

Run Portainer in Docker:

docker volume create portainer_data
docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Alternatively a docker-compose file can be used to deploy portainer:

docker-compose.yml

version: '2'
 
services:
  portainer:
    image: portainer/portainer
    command: -H unix:///var/run/docker.sock
    restart: always
    ports:
      - 9000:9000
      - 8000:8000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
 
volumes:
  portainer_data:

The portainer UI will be available at http://localhost:9000.

Docker Links

  1. Docker Hub

  2. Docker Commands

  3. Compose file references