TP3 - réseaux et volumes

Portainer

docker run --detach --name portainer \
    -p 9000:9000 \
    -v portainer_data:/data \
    -v /var/run/docker.sock:/var/run/docker.sock \
    portainer/portainer-ce

Docker networking

Pour expérimenter avec le réseau, nous allons lancer une petite application nodejs d’exemple (moby-counter) qui fonctionne avec une queue redis (comme une base de données mais pour stocker des paires clé/valeur simple).

Récupérons les images depuis Docker Hub:

Pour connecter les deux applications créons un réseau manuellement:

Puis lancons les deux applications en utilisant notre réseau

Comment notre application se connecte-t-elle au conteneur redis ? Elle utilise ces instructions JS dans son fichier server.js:

var port = opts.redis_port || process.env.USE_REDIS_PORT || 6379;
var host = opts.redis_host || process.env.USE_REDIS_HOST || "redis";

En résumé par défaut, notre application se connecte sur l’hôte redis avec le port 6379

Explorons un peu notre réseau Docker.

Bien que vous ne puissiez pas avoir deux conteneurs avec les mêmes noms, comme nous l’avons déjà découvert, notre deuxième réseau fonctionne complètement isolé de notre premier réseau, ce qui signifie que nous pouvons toujours utiliser le domaine redis ; pour ce faire, nous devons ajouter le drapeau --network-alias :

Docker Volumes

Pour ne pas interférer avec la deuxième partie du TP :

Passons à l’exploration des volumes:

docker network create moby-counter
docker container run -d --name redis --network moby-counter redis
docker container run -d --name moby-counter --network moby-counter -p 8000:80 russmckendrick/moby-counter

Avons nous vraiment perdu les données de notre conteneur ? (spoiler non)

le Dockerfile pour l’image officielle Redis ressemble à ça:

FROM alpine:3.5

RUN addgroup -S redis && adduser -S -G redis redis
RUN apk add --no-cache 'su-exec>=0.2'`docker container prune`
`docker network prune`
`docker volume prune`
ENV REDIS_VERSION 3.0.7
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.7.tar.gz
ENV REDIS_DOWNLOAD_SHA e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c
RUN set -x \
    && apk add --no-cache --virtual .build-deps \
        gcc \
        linux-headers \
        make \
        musl-dev \
        tar \
    && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
    && echo "$REDIS_DOWNLOAD_SHA *redis.tar.gz" | sha1sum -c - \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && rm redis.tar.gz \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -r /usr/src/redis \
    && apk del .build-deps

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD [ "redis-server" ]

Notez, vers la fin du fichier, il y a une instruction VOLUME /data; Cela signifie que lorque notre conteneur a été lancé, un volume “caché” a effectivement été créé par Docker.

La beaucoup de conteneurs docker sont des applications stateful c’est à dire qui stockent des données. Automatiquement ces conteneurs créent des volument anonymes en arrière plan qu’il faut ensuite supprimer manuellement (avec rm ou prune).

Finalement nous allons écraser ce volume anonyme par le notre : la bonne façon de créer des volumes consiste à les créer manuellement (volume nommés). docker volume create redis_data.

Bind Mounting
Lorsqu’un répertoire hôte spécifique est utilisé dans un volume (la syntaxe -v HOST_DIR:CONTAINER_DIR), elle est souvent appelée bind mounting.
C’est quelque peu trompeur, car tous les volumes sont techniquement “bind mounted”. La différence, c’est que le point de montage est explicite plutôt que caché dans un répertoire appartenant à Docker.

Le read only est nécessaire pour que les deux redis n’écrivent pas de façon contradictoire dans la base de valeurs.

Comme les réseau et volumes n’étaient plus attachés à des conteneurs en fonctionnement ils ont étés supprimés. Généralement, il faut faire beaucoup plus attention au prune de volumes (données à perdre) que de conteneur(rien à perdre car immutable et dans le registry).