Docker su Linux e primi comandi

Immagine di copertina dell'articolo

Installazione

Ubuntu Debian

Per prima cosa rimuovere i seguenti pacchetti che possono dare conflitto

# comando ubuntu
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

# comando debian
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)

Impostiamo il repository apt (ubuntu)

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

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Impostiamo il repository apt (Debian)

# Add Docker's official GPG key:
sudo apt update
sudo apt 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:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Infine installiamo docker

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

Veirfichiamo che il servizio sia avviato

sudo systemctl status docker

E nel caso avviamolo

sudo systemctl start docker

Fedora / RHEL Linux

Rimuoviamo i pacchetti che posono dare conflitto

sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine podman runc

Impostiamo il repository con i seguenti comandi

# rhel linux
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# fedora
sudo dnf config-manager addrepo --from-repofile https://download.docker.com/linux/fedora/docker-ce.repo

Infine installiamo docker

sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Per avviare docker

sudo systemctl enable --now docker

Avvio e confiurazione post installazione

Per testare docker usare il comando

sudo docker run hello-world

Per eseguire docker senza specificare sudo seguire la seguente procedura

# aggiungere il gruppo docker
sudo groupadd docker

# aggiungere l'utente corrente al gruppo appena creato
sudo usermod -aG docker $USER

Fare il logout e poi login. Dopo si può eseguire docker senza specificare sudo

docker run hello-world

Comandi

# Versione installata
docker version

# Informazioni sul sistema
docker info

# Aiuto per un comando
docker <comando> --help

Gestione delle immagini

# Scaricare un'immagine
docker pull ubuntu:22.04

# Elencare le immagini locali
docker images

# Cercare immagini su Docker Hub
docker search nginx

# Rimuovere un'immagine
docker rmi ubuntu:22.04

# Rimuovere tutte le immagini non utilizzate
docker image prune -a

Gestione dei container

# Avviare un container
docker run ubuntu:22.04

# Avviare in modalità interattiva
docker run -it ubuntu:22.04 bash

# Avviare in background (detached)
docker run -d nginx

# Avviare con nome personalizzato
docker run -d --name mio-nginx nginx

# Avviare con mapping delle porte (host:container)
docker run -d -p 8080:80 nginx

# Avviare con variabili d'ambiente
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8

# Elencare i container in esecuzione
docker ps

# Elencare tutti i container (anche fermi)
docker ps -a

# Fermare un container
docker stop mio-nginx

# Avviare un container fermo
docker start mio-nginx

# Riavviare un container
docker restart mio-nginx

# Rimuovere un container
docker rm mio-nginx

# Rimuovere un container in esecuzione (forzato)
docker rm -f mio-nginx

# Eseguire un comando in un container in esecuzione
docker exec -it mio-nginx bash

# Visualizzare i log
docker logs mio-nginx

# Seguire i log in tempo reale
docker logs -f mio-nginx

Volumi e bind mount

I volumi permettono la persistenza dei dati al di fuori del ciclo di vita del container.

# Creare un volume
docker volume create mio-volume

# Elencare i volumi
docker volume ls

# Usare un volume in un container
docker run -d -v mio-volume:/var/lib/mysql mysql:8

# Bind mount (cartella locale → container)
docker run -d -v /percorso/locale:/percorso/container nginx

# Bind mount con sintassi --mount (più esplicita)
docker run -d \
  --mount type=bind,source=/percorso/locale,target=/percorso/container \
  nginx

# Rimuovere un volume
docker volume rm mio-volume

# Rimuovere i volumi non utilizzati
docker volume prune

Networking

# Elencare le reti
docker network ls

# Creare una rete personalizzata
docker network create mia-rete

# Connettere un container a una rete
docker run -d --network mia-rete --name app mia-app

# Connettere un container in esecuzione a una rete
docker network connect mia-rete mio-nginx

# Disconnettere un container da una rete
docker network disconnect mia-rete mio-nginx

# Ispezionare una rete
docker network inspect mia-rete

# Rimuovere le reti non utilizzate
docker network prune

Docker Compose

Docker Compose permette di gestire applicazioni multi-container tramite un file docker-compose.yml.

Esempio base: app web + database

# docker-compose.yml
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - db-data:/var/lib/postgresql/data

  web:
    image: nginx
    ports:
      - "8080:80"
    depends_on:
      - db

volumes:
  db-data:

I comandi per la gestione docker compose sono

# Avviare tutti i servizi in background
docker compose up -d

# Avviare e ricostruire le immagini
docker compose up -d --build

# Fermare i servizi
docker compose down

# Fermare e rimuovere i volumi
docker compose down -v

# Vedere i log di tutti i servizi
docker compose logs -f

# Vedere i log di un servizio specifico
docker compose logs -f web

# Elencare i container del compose
docker compose ps

# Eseguire un comando in un servizio
docker compose exec web bash

# Scalare un servizio
docker compose up -d --scale web=3

Pulizia del sistema

# Rimuovere container fermi, immagini non taggate, reti e cache build
docker system prune

# Rimuovere anche i volumi non utilizzati
docker system prune --volumes

# Rimuovere tutto (immagini, container, volumi, reti)
docker system prune -a --volumes

# Visualizzare l'utilizzo disco di Docker
docker system df