Docker

Le projet Moby

Docker.com livre des binaires. Le modèle d'installation est de faire un curl et de faire confiance à ce que l'on télécharge.

Concernant le code source, Docker.com a créé le projet Moby sur lequel travail la communauté et à partir duquel Docker.com fabrique ses services.

Le code source de Moby se trouve sur github : https://github.com/moby/moby

Docker en rootless

Première rencontre

 curl https://get.docker.com/rootless -o rootless.sh

 # Et non pas comme c'est préconnisé :/ curl -fsSL https://get.docker.com/rootless | sh

On regarde ce qu'il fait avant de lancer... Il fait trop de choses, et veux télécharger des versions déjà compilées. Je souhaite partir des sources ou des binaires de la distribution.

From semi scratch

Voici la liste des actions/vérifications faites :

- kernel.unprivileged_userns_clone = 1
- user.max_user_namespaces = 63396
- grep "^$(id -un):\|^$(id -u):" /etc/subuid
- grep "^$(id -un):\|^$(id -u):" /etc/subgid

Le script de configuration rootless se trouve dans le projet Moby contrib/dockerd-rootless-setuptool.sh. Dans le principe, il faut

  • Télécharger
- https://raw.githubusercontent.com/moby/moby/master/contrib/dockerd-rootless-setuptool.sh
- https://raw.githubusercontent.com/moby/moby/master/contrib/dockerd-rootless.sh
- https://github.com/rootless-containers/rootlesskit.git
  • Exécuter dockerd-rootless-setuptool.sh install
  • Le script va
- créer le service systemd en userland ~/.config/systemd/user/default.target.wants/docker.service
- et le lancer

Attention: le service exécute dockerd-rootless.sh. Dans le mode de dev ci-dessous, il ne faut plus déplacer le script !!

Configuration

Le setup met à jour la configuration dans l'espace utilisateur en positionnant le contexte rootless.

$ cat ~/.docker/config.json 
{
        "auths": {},
        "currentContext": "rootless"
}

Les images sont stockées dans ~/.local/share/docker/

Les informations de runtime sont dans

  • /run/user/"$(id -u)"/dockerd-rootless/
  • /run/user/"$(id -u)"/docker/

Test de bon fonctionnment

# Etat du service
systemctl --user status docker
# Téléchargement image.
docker pull busybox
...
# Liste des images
docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    3f57d9401f8d   4 weeks ago   4.26MB

# Hop, premier cnteneur

docker run -ti --rm busybox:latest ping -c 2 docker.com
PING docker.com (141.193.213.20): 56 data bytes
64 bytes from 141.193.213.20: seq=0 ttl=254 time=26.789 ms
64 bytes from 141.193.213.20: seq=1 ttl=254 time=22.335 ms

--- docker.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 22.335/24.562/26.789 ms

Qu'est-ce qui tourne ?

%%{init: {'theme': 'dark' } }%% flowchart subgraph systemd["systemd --user"] direction LR init((" ")) -..-> dockerdrootless1["dockerd-rootless.sh"] --> rootlesskit --fork--> dockerdrootless2["dockerd-rootless.sh"] --> dockerd --> containerd rootlesskit --> slirb4ns end

docker-rootless.sh est appelé 2 fois, c'est la valeur de la variable "_DOCKERD_ROOTLESS_CHILD" qui décide si c'est rootlesskit qui est éxécuté ou dockerd.

fccagou   526311  0.0  0.1 1825344 32016 ?       Ssl  21:22   0:00  \_ rootlesskit --state-dir=/run/user/1000/dockerd-rootless --net=slirp4netns --mtu=65520 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run --propagation=rslave /home/fccagou/src/docker/docker-rootless/dockerd-rootless.sh
fccagou   526322  0.0  0.2 1972552 32916 ?       Sl   21:22   0:00      \_ /proc/self/exe --state-dir=/run/user/1000/dockerd-rootless --net=slirp4netns --mtu=65520 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run --propagation=rslave /home/fccagou/src/docker/docker-rootless/dockerd-rootless.sh
fccagou   526350  0.9  0.6 2846156 111852 ?      Sl   21:22   1:00      |   \_ dockerd
fccagou   526371  0.2  0.4 1944404 66344 ?       Ssl  21:22   0:13      |       \_ containerd --config /run/user/1000/docker/containerd/containerd.toml
fccagou   526343  0.0  0.1  28272 20928 ?        S    21:22   0:05      \_ slirp4netns --mtu 65520 -r 3 --disable-host-loopback --enable-sandbox --enable-seccomp 526322 tap0

Contenu de /run/user/1000/docker/containerd/containerd.toml

disabled_plugins = ["io.containerd.grpc.v1.cri"]
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/home/fccagou/.local/share/docker/containerd/daemon"
state = "/run/user/1000/docker/containerd/daemon"
temp = ""
version = 2

[cgroup]
  path = ""

[debug]
  address = "/run/user/1000/docker/containerd/containerd-debug.sock"
  format = "text"
  gid = 0
  level = ""
  uid = 0

[grpc]
  address = "/run/user/1000/docker/containerd/containerd.sock"
  gid = 0
  max_recv_message_size = 16777216
  max_send_message_size = 16777216
  tcp_address = ""
  tcp_tls_ca = ""
  tcp_tls_cert = ""
  tcp_tls_key = ""
  uid = 0

[metrics]
  address = ""
  grpc_histogram = false

[plugins]

[proxy_plugins]

[stream_processors]

[timeouts]

[ttrpc]
  address = ""
  gid = 0
  uid = 0

Script pour tout faire

#!/usr/bin/bash
#

set -ue
set -o pipefail

# On crée un environnement local
[ -d docker-rootless ] || mkdir -p docker-rootless

cd docker-rootless

# On récupère les shells si nécessaire
for f in dockerd-rootless-setuptool.sh dockerd-rootless.sh
do
    [ -f "$f" ] || curl -O https://raw.githubusercontent.com/moby/moby/master/contrib/"$f"
    chmod +x "$f"
done

# Les shells s'attendent )à ce que docker soit dans le même répertoire.
[ -f docker ] || [ -f /usr/bin/docker ] && ln -sf /usr/bin/docker .


# On build rootlesskit utilisé par les shells
# TODO: regarder plus précisément
[ -d rootlesskit ] || git clone https://github.com/rootless-containers/rootlesskit.git

## On build les binaires si besoin
[ -f rootlesskit/bin/rootlessctl ] \
    && [ -f rootlesskit/bin/rootlesskit ] \
    && [ -f rootlesskit/bin/rootlesskit-docker-proxy ] \
    || cd rootlesskit && make -j3 && cd -

# On met à jour le path avec tous les binaires nécessaires.
# TODO: garder les sources et mettre les binaires dans un seul endroit
#
export PATH="$(pwd)":"$(pwd)"/rootlesskit/bin:"$PATH"

case "$1" in

    "install")
        bash -v dockerd-rootless-setuptool.sh install 2>&1 | tee "$0"-install-"$(date +%s)".log
        ;;
    "uninstall")
        bash -v dockerd-rootless-setuptool.sh uninstall 2>&1 | tee "$0"-uninstall-"$(date +%s)".log
        ;;
     *)
         printf -- "[-] commande inconnue %s\n" "$1"
         exit 1
        ;;
esac