Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:docker1:drf02 [2020/08/10 13:48] adminelearning:workbooks:docker1:drf02 [2021/12/29 10:32] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version : **2020.02** - Consulter le ChangeLog en fin de module+Version : **2022.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-======DOF103 - Gestion des Volumes, du Réseau et des Ressources======+======DOF103 - Gérer les Images Docker======
  
 =====Contenu du Module===== =====Contenu du Module=====
  
-  * **DOF103 - Gestion des Volumes, du Réseau et des Ressources** +  * **DOF103 - Gérer les Images Docker** 
-    * LAB #Gestion des Volumes +    * Contenu du Module 
-      * Gestion Automatique par Docker +    * LAB #Re-créer une image officielle docker 
-      * Gestion Manuelle d'un Volume +      * 1.1 - Utilisation d'un Dockerfile 
-    LAB #7 Gestion du Réseau +      1.2 FROM 
-      * L'Approche Réseau Docker +      * 1.3 - RUN 
-        Bridge +      1.4 - ENV 
-        None +      1.5 - VOLUME 
-        Liens +      1.6 - COPY 
-      * Lancer Wordpress dans un container +      * 1.7 - ENTRYPOINT 
-      * Gestion d'une Architecture de Microservices +      * 1.8 - EXPOSE 
-    * LAB #8 - Superviser les Conteneurs +      * 1.9 - CMD 
-      * Les Journaux +      * 1.10 - Autres Commandes 
-      * Les Processus +    * LAB #Créer un Dockerfile 
-      * L'Activité en Continu +      * 2.1 - Création et test du script 
-    * LAB #Gestion des Ressources +      * 2.2 - Bonnes Pratiques liées au Cache
-      * Limiter la Mémoire+
  
-=====LAB #Gestion des Volumes=====+=====LAB #Re-créer une image officielle docker=====
  
-Lancez un conteneur à partir de la dernière image :+====1.1 - Utilisation d'un Dockerfile==== 
 + 
 +Bien que la compilation des images soient assuré par Docker Hub, il est tout à fait possible de compiler une image "officielle" à partir d'un Dockerfile :
  
 <code> <code>
-root@debian9:~/mongodb# docker run -d --name mongo2 i2tch/mongodb2 +root@debian9:~# mkdir mongodb 
-e91a055283f4d67cbd91d11bb3faa6f67925893cb18f9cc25023e72e0f7ed85a+root@debian9:~# cd mongodb/ 
 +root@debian9:~/mongodb# touch Dockerfile docker-entrypoint.sh
 </code> </code>
  
-====Gestion Automatique de Volumes par Docker====+Le Docker file contient les instructions nécessaires pour la contruction de l'image :
  
-Vérifiez que le processus est bien démarré dans le conteneur :+<file txt Dockerfile> 
 +FROM ubuntu:bionic
  
-<code> +add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added 
-root@debian9:~docker ps +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES +
-b9773e4aa06d        i2tch/mongodb2      "docker-entrypoint..."   7 hours ago         Up About a minute   27017/tcp           mongo2 +
-</code>+
  
-Identifiez ensuite le point de montage du répertoire **/data/db*du conteneur :+RUN set -eux; \ 
 + apt-get update; \ 
 + apt-get install -y --no-install-recommends \ 
 + ca-certificates \ 
 + jq \ 
 + numactl \ 
 + ; \ 
 + if ! command -v ps > /dev/null; then \ 
 + apt-get install -y --no-install-recommends procps; \ 
 + fi; \ 
 + rm -rf /var/lib/apt/lists/*
  
-<code> +# grab gosu for easy step-down from root (https://github.com/tianon/gosu/releases) 
-root@debian9:~# docker inspect mongo2 +ENV GOSU_VERSION 1.11 
-... +# grab "js-yamlfor parsing mongod's YAML config files (https://github.com/nodeca/js-yaml/releases) 
-        "Mounts":+ENV JSYAML_VERSION 3.13.0
-            { +
-                "Type": "volume", +
-                "Name": "9c84c2d1a0db811a3c13dce354ba21169f3073513c8d025dd96c5f902364d44a", +
-                "Source": "/var/lib/docker/volumes/9c84c2d1a0db811a3c13dce354ba21169f3073513c8d025dd96c5f902364d44a/_data", +
-                "Destination": "/data/configdb", +
-                "Driver": "local", +
-                "Mode": "", +
-                "RW": true, +
-                "Propagation": "" +
-            }, +
-            { +
-                "Type": "volume", +
-                "Name": "a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050", +
-                "Source": "/var/lib/docker/volumes/a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050/_data", +
-                "Destination": "/data/db", +
-                "Driver": "local", +
-                "Mode": "", +
-                "RW": true, +
-                "Propagation": "" +
-            } +
-... +
-            "Volumes":+
-                "/data/configdb": {}, +
-                "/data/db": {} +
-            }, +
-..+
-</code>+
  
-En regardant le contenu du répertoire **/data/db**, on constate une arborescence classique de stockage de données de mongodb :+RUN set -ex; \ 
 +
 + apt-get update; \ 
 + apt-get install -y --no-install-recommends \ 
 + wget \ 
 + ; \ 
 + if ! command -v gpg > /dev/null; then \ 
 + apt-get install -y --no-install-recommends gnupg dirmngr; \ 
 + fi; \ 
 + rm -rf /var/lib/apt/lists/*; \ 
 +
 + dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')";
 + wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch";
 + wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc";
 + export GNUPGHOME="$(mktemp -d)"; \ 
 + gpg --batch --keyserver pgp.mit.edu --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4;
 + # gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu;
 + command -v gpgconf && gpgconf --kill all || :; \ 
 + rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc;
 + chmod +x /usr/local/bin/gosu;
 + gosu --version; \ 
 + gosu nobody true; \ 
 +
 + wget -O /js-yaml.js "https://github.com/nodeca/js-yaml/raw/${JSYAML_VERSION}/dist/js-yaml.js";
 +# TODO some sort of download verification here 
 +
 + apt-get purge -y --auto-remove wget
  
-<code> +RUN mkdir /docker-entrypoint-initdb.d
-root@debian9:~# ls /var/lib/docker/volumes/a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050/_data +
-journal  local.0  local.ns  mongod.lock  storage.bson +
-</code>+
  
-Arrêtez et supprimez le conteneur **mongo2** :+ENV GPG_KEYS E162F504A20CDF15827F718D4B7C549A058F8B6B 
 +RUN set -ex; \ 
 + export GNUPGHOME="$(mktemp -d)"; \ 
 + for key in $GPG_KEYS; do \ 
 + gpg --batch --keyserver pgp.mit.edu --recv-keys "$key";
 + done; \ 
 + gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg;
 + command -v gpgconf && gpgconf --kill all || :; \ 
 + rm -r "$GNUPGHOME";
 + apt-key list
  
-<code> +Allow build-time overrides (egto build image with MongoDB Enterprise version
-root@debian9:~docker stop mongo2 +# Options for MONGO_PACKAGE: mongodb-org OR mongodb-enterprise 
-mongo2 +Options for MONGO_REPOrepo.mongodb.org OR repo.mongodb.com 
-root@debian9:~# docker ps -+# Example: docker build --build-arg MONGO_PACKAGE=mongodb-enterprise --build-arg MONGO_REPO=repo.mongodb.com 
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES +ARG MONGO_PACKAGE=mongodb-org-unstable 
-ea239635e141        testcache           "more /tmp/moment"       6 hours ago         Exited (0) 6 hours ago                          test1 +ARG MONGO_REPO=repo.mongodb.org 
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my..."   6 hours ago         Exited (1376 hours ago                        myDocker +ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
-b9773e4aa06d        i2tch/mongodb2      "docker-entrypoint..."   7 hours ago         Exited (0) 10 seconds ago                       mongo2 +
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint..."   18 hours ago        Created                     27017/tcp           mongo1 +
-f5b45072b831        i2tch/mongodb       "bash"                   18 hours ago        Exited (137) 6 hours ago                        mongo +
-9731a48f126a        nginx               "nginx -g 'daemon ..."   18 hours ago        Exited (0) 6 hours ago                          cocky_gates +
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                         adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                         i2tch +
-root@debian9:~docker rm mongo2 +
-mongo2 +
-root@debian9:~# docker ps -a +
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES +
-ea239635e141        testcache           "more /tmp/moment"       6 hours ago         Exited (0) 6 hours ago                         test1 +
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my...  6 hours ago         Exited (137) 6 hours ago                       myDocker +
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint...  18 hours ago        Created                    27017/tcp           mongo1 +
-f5b45072b831        i2tch/mongodb       "bash"                   18 hours ago        Exited (137) 6 hours ago                       mongo +
-9731a48f126a        nginx               "nginx -g 'daemon ..."   18 hours ago        Exited (0) 6 hours ago                         cocky_gates +
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                        adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                        i2tch +
-</code>+
  
-Re-créez maintenant un conteneur à partir de l'image **i2tch/mongodb2** :+ENV MONGO_MAJOR 4.1 
 +ENV MONGO_VERSION 4.1.9 
 +# bashbrew-architectures:amd64 arm64v8 s390x 
 +RUN echo "deb http://$MONGO_REPO/apt/ubuntu bionic/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR multiverse" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
  
-<code> +RUN set -x \ 
-root@debian9:~# docker run ---name mongo2 i2tch/mongodb2 + && apt-get update \ 
-a8382642c4e849337e12a60419b10f63ea21251dfcc2c6050284ca3eed7fa13d + && apt-get install -y \ 
-root@debian9:~# docker ps -a + ${MONGO_PACKAGE}=$MONGO_VERSION \ 
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES + ${MONGO_PACKAGE}-server=$MONGO_VERSION \ 
-a8382642c4e8        i2tch/mongodb2      "docker-entrypoint..."   12 seconds ago      Exited (100) 11 seconds ago                       mongo2 + ${MONGO_PACKAGE}-shell=$MONGO_VERSION \ 
-ea239635e141        testcache           "more /tmp/moment"       6 hours ago         Exited (0) 6 hours ago                            test1 + ${MONGO_PACKAGE}-mongos=$MONGO_VERSION \ 
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my..."   6 hours ago         Exited (137) 6 hours ago                          myDocker + ${MONGO_PACKAGE}-tools=$MONGO_VERSION \ 
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint..."   18 hours ago        Created                       27017/tcp           mongo1 + && rm -rf /var/lib/apt/lists/* \ 
-f5b45072b831        i2tch/mongodb       "bash"                   18 hours ago        Exited (137) 6 hours ago                          mongo + && rm -rf /var/lib/mongodb \ 
-9731a48f126a        nginx               "nginx -g 'daemon ...  18 hours ago        Exited (0) 6 hours ago                            cocky_gates + && mv /etc/mongod.conf /etc/mongod.conf.orig
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                           adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                           i2tch +
-</code>+
  
-Utilisez de nouveau la commande **docker inspect** pour identifier le point de montage du répertoire **/data/db** :+RUN mkdir -p /data/db /data/configdb \ 
 + && chown -R mongodb:mongodb /data/db /data/configdb 
 +VOLUME /data/db /data/configdb
  
-<code> +COPY docker-entrypoint.sh /usr/local/bin
-root@debian9:~# docker inspect mongo2 +ENTRYPOINT ["docker-entrypoint.sh"]
-... +
-        "Mounts":+
-            { +
-                "Type": "volume", +
-                "Name": "76dcc0ccbe6604278cf8e8da0398a807f5d0719087f17c227c8504be24456d43", +
-                "Source": "/var/lib/docker/volumes/76dcc0ccbe6604278cf8e8da0398a807f5d0719087f17c227c8504be24456d43/_data", +
-                "Destination": "/data/db", +
-                "Driver": "local", +
-                "Mode": "", +
-                "RW": true, +
-                "Propagation": "" +
-            }, +
-            { +
-                "Type": "volume", +
-                "Name": "3bf724ceb38ce0792469d7e403f05b6794f27e0aa72bda51a8ab75b2df5ae87c", +
-                "Source": "/var/lib/docker/volumes/3bf724ceb38ce0792469d7e403f05b6794f27e0aa72bda51a8ab75b2df5ae87c/_data"+
-                "Destination": "/data/configdb", +
-                "Driver": "local", +
-                "Mode": "", +
-                "RW": true, +
-                "Propagation": "" +
-            } +
-... +
-</code>+
  
-<WRAP center round important> +EXPOSE 27017 
-**Important** : Notez que le répertoire des données du précédent conteneur, **/var/lib/docker/volumes/a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050/_data** n'est pas le même que le conteneur courant **/var/lib/docker/volumes/76dcc0ccbe6604278cf8e8da0398a807f5d0719087f17c227c8504be24456d43/_data**. +CMD ["mongod"] 
-</WRAP>+</file>
  
-Les conteneurs n'ayant pas été arrêtés avec l'option **-v**, on peut constater que les répertoires persistent dans **/var/lib/docker** :+Le fichier docker-entrypoint.sh sert à lancer le serveur mongodb dans le conteneur :
  
-<code+<file txt docker-entrypoint.sh
-root@debian9:~ls -l /var/lib/docker/volumes+#!/bin/bash 
-total 52 +set -Eeuo pipefail
-drwxr-xr-x 3 root root  4096 Sep  7 09:43 3bf724ceb38ce0792469d7e403f05b6794f27e0aa72bda51a8ab75b2df5ae87c +
-drwxr-xr-x 3 root root  4096 Sep  6 16:07 46d11d005d05757609ff76159ce0992d210089c5247fa54b024706a20b0de501 +
-drwxr-xr-x 3 root root  4096 Sep  7 09:43 76dcc0ccbe6604278cf8e8da0398a807f5d0719087f17c227c8504be24456d43 +
-drwxr-xr-x 3 root root  4096 Sep  7 02:33 9c84c2d1a0db811a3c13dce354ba21169f3073513c8d025dd96c5f902364d44a +
-drwxr-xr-x 3 root root  4096 Sep  7 02:33 a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050 +
-drwxr-xr-x 3 root root  4096 Sep  6 16:07 cc38fa97138adc55976aa16993d8920c5f7da922ad1b2a07936d30cc82d59f38 +
--rw------- 1 root root 32768 Sep  7 09:43 metadata.db +
-</code>+
  
-<WRAP center round important> +if [ "${1:0:1}" = '-' ]; then 
-**Important** Notez que non-seulement ceci représente une source de perte d'espace disque mais prouve aussi que les données ne sont pas persistantes entre deux instances d'un conteneur d'**i2tch/mongodb2**. Ceci crée bien évidement un problème important en production. + set -- mongod "$@" 
-</WRAP>+fi
  
-====Gestion Manuelle d'un Volume====+originalArgOne="$1"
  
-Arrêtez et supprimez le conteneur **mongo2** puis re-créez un conteneur avec un volume spécifique pour contenir les données placées dans **/data/db** du conteneur par mongodb :+# allow the container to be started with `--user` 
 +# all mongocommands should be dropped to the correct user 
 +if [[ "$originalArgOne" == mongo]] && [ "$(id -u)" = '0' ]; then 
 + if [ "$originalArgOne" = 'mongod' ]; then 
 + find /data/configdb /data/db \! -user mongodb -exec chown mongodb '{}'
 + fi
  
-<code> + make sure we can write to stdout and stderr as "mongodb
-root@debian9:~docker stop mongo2 + (for our "initdbcode later; see "--logpathbelow
-mongo2 + chown --dereference mongodb "/proc/$$/fd/1" "/proc/$$/fd/2" || 
-root@debian9:~# docker rm mongo2 + # ignore errors thanks to https://github.com/docker-library/mongo/issues/149
-mongo2 +
-root@debian9:~# docker run -d --name mongo2 -v persistent_data:/data/db i2tch/mongodb2 +
-3cf093d72b9e3739f2cb288e571244e494b7518292c31994ee012e3620bb0e98 +
-root@debian9:~# docker ps -a +
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES +
-3cf093d72b9e        i2tch/mongodb2      "docker-entrypoint...  21 seconds ago      Up 20 seconds              27017/tcp           mongo2 +
-ea239635e141        testcache           "more /tmp/moment"       6 hours ago         Exited (0) 6 hours ago                         test1 +
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my...  6 hours ago         Exited (137) 6 hours ago                       myDocker +
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint..."   18 hours ago        Created                    27017/tcp           mongo1 +
-f5b45072b831        i2tch/mongodb       "bash"                   18 hours ago        Exited (137) 6 hours ago                       mongo +
-9731a48f126a        nginx               "nginx -g 'daemon ...  19 hours ago        Exited (06 hours ago                         cocky_gates +
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                        adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                        i2tch +
-root@debian9:~# docker logs mongo2 +
-2017-09-07T08:53:12.523+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=3cf093d72b9e +
-2017-09-07T08:53:12.524+0000 I CONTROL  [initandlisten] db version v3.0.15 +
-2017-09-07T08:53:12.524+0000 I CONTROL  [initandlisten] git version: b8ff507269c382bc100fc52f75f48d54cd42ec3b +
-2017-09-07T08:53:12.524+0000 I CONTROL  [initandlisten] build info: Linux ip-10-166-66-3 3.2.0-4-amd64 #SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49 +
-2017-09-07T08:53:12.524+0000 I CONTROL  [initandlisten] allocator: tcmalloc +
-2017-09-07T08:53:12.524+0000 I CONTROL  [initandlisten] options: { storage: { mmapv1: { smallFiles: true } } } +
-2017-09-07T08:53:12.535+0000 I JOURNAL  [initandlisten] journal dir=/data/db/journal +
-2017-09-07T08:53:12.535+0000 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed +
-2017-09-07T08:53:13.368+0000 I JOURNAL  [initandlisten] preallocateIsFaster=true 15.4 +
-2017-09-07T08:53:14.410+0000 I JOURNAL  [initandlisten] preallocateIsFaster=true 19.36 +
-2017-09-07T08:53:16.277+0000 I JOURNAL  [initandlisten] preallocateIsFaster=true 15.86 +
-2017-09-07T08:53:16.277+0000 I JOURNAL  [initandlisten] preallocateIsFaster check took 3.742 secs +
-2017-09-07T08:53:16.277+0000 I JOURNAL  [initandlisten] preallocating a journal file /data/db/journal/prealloc.0 +
-2017-09-07T08:53:19.930+0000 I JOURNAL  [initandlisten] preallocating a journal file /data/db/journal/prealloc.1 +
-2017-09-07T08:53:23.035+0000 I JOURNAL  [initandlisten] preallocating a journal file /data/db/journal/prealloc.2 +
-2017-09-07T08:53:25.889+0000 I JOURNAL  [durability] Durability thread started +
-2017-09-07T08:53:25.889+0000 I JOURNAL  [journal writer] Journal writer thread started +
-2017-09-07T08:53:26.016+0000 I INDEX    [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes... +
-2017-09-07T08:53:26.246+0000 I STORAGE  [FileAllocator] allocating new datafile /data/db/local.0, filling with zeroes... +
-2017-09-07T08:53:26.246+0000 I STORAGE  [FileAllocator] creating directory /data/db/_tmp +
-2017-09-07T08:53:26.256+0000 I STORAGE  [FileAllocator] done allocating datafile /data/db/local.0, size: 16MB,  took 0.002 secs +
-2017-09-07T08:53:26.299+0000 I NETWORK  [initandlisten] waiting for connections on port 27017 +
-</code>+
  
-Notez que cette fois-ci, docker a créé un répertoire **persistent_data** dans le répertoire **/var/lib/docker/volumes/** :+ exec gosu mongodb "$BASH_SOURCE" "$@" 
 +fi
  
-<code> +# you should use numactl to start your mongod instances, including the config servers, mongos instances, and any clients. 
-root@debian9:~# ls -l /var/lib/docker/volumes/ +# https://docs.mongodb.com/manual/administration/production-notes/#configuring-numa-on-linux 
-total 68 +if [[ "$originalArgOne" == mongo* ]]; then 
-drwxr-xr-x 3 root root  4096 Sep  7 09:43 3bf724ceb38ce0792469d7e403f05b6794f27e0aa72bda51a8ab75b2df5ae87c + numa='numactl --interleave=all' 
-drwxr-xr-x 3 root root  4096 Sep  6 16:07 46d11d005d05757609ff76159ce0992d210089c5247fa54b024706a20b0de501 + if $numa true &> /dev/null; then 
-drwxr-xr-x 3 root root  4096 Sep  7 09:46 511e23f818d5cf60f4333a3fe8fd2e4333c900dec6eee97f70448bfb0091184d + set -- $numa "$@" 
-drwxr-xr-x 3 root root  4096 Sep  7 09:53 5ca72be4140ecf1271efe7342cf7cd58ce66fc3673d12c04b8503603b8cee66c + fi 
-drwxr-xr-x 3 root root  4096 Sep  7 09:43 76dcc0ccbe6604278cf8e8da0398a807f5d0719087f17c227c8504be24456d43 +fi
-drwxr-xr-x 3 root root  4096 Sep  7 02:33 9c84c2d1a0db811a3c13dce354ba21169f3073513c8d025dd96c5f902364d44a +
-drwxr-xr-x 3 root root  4096 Sep  7 02:33 a6177cf4b46089356280f084dd2e272f673aa4a81accb53f031267fafcee6050 +
-drwxr-xr-x 3 root root  4096 Sep  6 16:07 cc38fa97138adc55976aa16993d8920c5f7da922ad1b2a07936d30cc82d59f38 +
--rw------- 1 root root 65536 Sep  7 09:53 metadata.db +
-drwxr-xr-x 3 root root  4096 Sep  7 09:46 persistent_data +
-</code>+
  
-Arrêtez et supprimez le conteneur **mongo2** puis re-créez un conteneur en utilisant le même volume spécifique pour contenir les données placées dans **/data/db** du conteneur par mongodb :+# usage: file_env VAR [DEFAULT] 
 +#    ie: file_env 'XYZ_DB_PASSWORD' 'example' 
 +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of 
 +#  "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) 
 +file_env() { 
 + local var="$1" 
 + local fileVar="${var}_FILE" 
 + local def="${2:-}" 
 + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then 
 + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" 
 + exit 1 
 + fi 
 + local val="$def" 
 + if [ "${!var:-}" ]; then 
 + val="${!var}" 
 + elif [ "${!fileVar:-}" ]; then 
 + val="$(< "${!fileVar}")" 
 + fi 
 + export "$var"="$val" 
 + unset "$fileVar" 
 +}
  
-<code> +see https://github.com/docker-library/mongo/issues/147 (mongod is picky about duplicated arguments) 
-root@debian9:~# docker stop mongo2 +_mongod_hack_have_arg() { 
-mongo2 + local checkArg="$1"; shift 
-root@debian9:~# docker rm mongo2 + local arg 
-mongo2 + for arg; do 
-root@debian9:~docker run ---name mongo2 -v persistent_data:/data/db i2tch/mongodb2 + case "$arg" in 
-ad672c3038245c25a36162d05820c21f7250557ac342582d0908d3ca33799e37 + "$checkArg"|"$checkArg"=*) 
-root@debian9:~docker ps -a + return 0 
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES + ;; 
-ad672c303824        i2tch/mongodb2      "docker-entrypoint...  24 seconds ago      Up 22 seconds              27017/tcp           mongo2 + esac 
-ea239635e141        testcache           "more /tmp/moment      6 hours ago         Exited (06 hours ago                         test1 + done 
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my...  6 hours ago         Exited (1376 hours ago                       myDocker + return 1 
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint...  18 hours ago        Created                    27017/tcp           mongo1 +} 
-f5b45072b831        i2tch/mongodb       "bash                  18 hours ago        Exited (1376 hours ago                       mongo +_mongod_hack_get_arg_val '--some-arg' "$@" 
-9731a48f126a        nginx               "nginx -'daemon ...  19 hours ago        Exited (0) 6 hours ago                         cocky_gates +_mongod_hack_get_arg_val() { 
-eacd70596e23        nginx               "nginx -'daemon ...  19 hours ago        Exited (019 hours ago                        adoring_yonath + local checkArg="$1"; shift 
-cffb4456e9c4        ubuntu              "/bin/bash             19 hours ago        Exited (019 hours ago                        i2tch + while [ "$#" -gt 0 ]; do 
-</code>+ local arg="$1"; shift 
 + case "$arg" in 
 + "$checkArg"
 + echo "$1" 
 + return 0 
 + ;; 
 + "$checkArg"=*) 
 + echo "${arg#$checkArg=}" 
 + return 0 
 + ;; 
 + esac 
 + done 
 + return 1 
 +
 +declare -a mongodHackedArgs 
 +# _mongod_hack_ensure_arg '--some-arg' "$@" 
 +# set -- "${mongodHackedArgs[@]}" 
 +_mongod_hack_ensure_arg() { 
 + local ensureArg="$1"; shift 
 + mongodHackedArgs="$@" 
 + if ! _mongod_hack_have_arg "$ensureArg"$@"; then 
 + mongodHackedArgs+="$ensureArg" 
 + fi 
 +
 +# _mongod_hack_ensure_no_arg '--some-unwanted-arg' "$@" 
 +# set -- "${mongodHackedArgs[@]}" 
 +_mongod_hack_ensure_no_arg() { 
 + local ensureNoArg="$1"; shift 
 + mongodHackedArgs=() 
 + while [ "$#" -gt 0 ]; do 
 + local arg="$1"; shift 
 + if [ "$arg" = "$ensureNoArg" ]; then 
 + continue 
 + fi 
 + mongodHackedArgs+=( "$arg"
 + done 
 +
 +# _mongod_hack_ensure_no_arg '--some-unwanted-arg' "$@" 
 +# set -- "${mongodHackedArgs[@]}" 
 +_mongod_hack_ensure_no_arg_val() { 
 + local ensureNoArg="$1"; shift 
 + mongodHackedArgs=() 
 + while [ "$#" -gt ]; do 
 + local arg="$1"; shift 
 + case "$arg" in 
 + "$ensureNoArg"
 + shift # also skip the value 
 + continue 
 + ;; 
 + "$ensureNoArg"=*) 
 + # value is already included 
 + continue 
 + ;; 
 + esac 
 + mongodHackedArgs+=( "$arg"
 + done 
 +
 +# _mongod_hack_ensure_arg_val '--some-arg' 'some-val' "$@" 
 +# set -- "${mongodHackedArgs[@]}" 
 +_mongod_hack_ensure_arg_val() { 
 + local ensureArg="$1"; shift 
 + local ensureVal="$1"; shift 
 + _mongod_hack_ensure_no_arg_val "$ensureArg" "$@" 
 + mongodHackedArgs+="$ensureArg" "$ensureVal" 
 +}
  
-Encore une fois, cherchez le point de montage de **/data/db** grâce à l'utilisation de la commande **docker inspect** :+# _js_escape 'some "string" value' 
 +_js_escape() { 
 + jq --null-input --arg 'str' "$1" '$str' 
 +}
  
-<code> +jsonConfigFile="${TMPDIR:-/tmp}/docker-entrypoint-config.json
-root@debian9:~# docker inspect mongo2 +tempConfigFile="${TMPDIR:-/tmp}/docker-entrypoint-temp-config.json
-... +_parse_config() { 
-        "Mounts":+ if [ -s "$tempConfigFile]; then 
-            { + return 0 
-                "Type""volume", + fi
-                "Name": "6cefc73cef475279dfe20e25421fa358e6aa995b5c175b9f2c7a9b86163661e5", +
-                "Source": "/var/lib/docker/volumes/6cefc73cef475279dfe20e25421fa358e6aa995b5c175b9f2c7a9b86163661e5/_data", +
-                "Destination": "/data/configdb", +
-                "Driver": "local", +
-                "Mode": "", +
-                "RW": true, +
-                "Propagation": "" +
-            }+
-            { +
-                "Type": "volume", +
-                "Name": "persistent_data", +
-                "Source": "/var/lib/docker/volumes/persistent_data/_data", +
-                "Destination": "/data/db", +
-                "Driver": "local", +
-                "Mode": "z", +
-                "RW": true, +
-                "Propagation": "" +
-            } +
-... +
-</code>+
  
-<WRAP center round important> + local configPath 
-**Important** : Notez ici que l'utilisation du même répertoire entre les deux conteneurs rend les données persistantes et évite la création de volumes orphelins. Pour plus d'information sur les volumesconsultez la page : **[[https://docs.docker.com/storage/volumes/]]**. + if configPath="$(_mongod_hack_get_arg_val --config "$@")"; then 
-</WRAP>+ # if --config is specifiedparse it into a JSON file so we can remove a few problematic keys (especially SSL-related keys) 
 + # see https://docs.mongodb.com/manual/reference/configuration-options
 + mongo --norc --nodb --quiet --eval "load('/js-yaml.js'); printjson(jsyaml.load(cat($(_js_escape "$configPath"))))" "$jsonConfigFile" 
 + jq 'del(.systemLog, .processManagement, .net, .security)' "$jsonConfigFile" > "$tempConfigFile" 
 + return 0 
 + fi
  
-https://docs.docker.com/storage/volumes/+ return 1 
 +
 +dbPath= 
 +_dbPath() { 
 + if [ -n "$dbPath" ]; then 
 + echo "$dbPath" 
 + return 
 + fi
  
-=====LAB #6 Gestion du Réseau=====+ if ! dbPath="$(_mongod_hack_get_arg_val --dbpath "$@")"; then 
 + if _parse_config "$@"; then 
 + dbPath="$(jq -r '.storage.dbPath // empty' "$jsonConfigFile")" 
 + fi 
 + fi
  
-Docker fournit trois réseaux par défaut :+ if [ -z "$dbPath" ]; then 
 + if _mongod_hack_have_arg --configsvr "$@" || { 
 + _parse_config "$@"
 + && clusterRole="$(jq -r '.sharding.clusterRole // empty' "$jsonConfigFile")"
 + && [ "$clusterRole" = 'configsvr'
 + }; then 
 + # if running as config server, then the default dbpath is /data/configdb 
 + # https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption-mongod-configsvr 
 + dbPath=/data/configdb 
 + fi 
 + fi
  
-<code> + "${dbPath:=/data/db}"
-root@debian9:~# docker network ls +
-NETWORK ID          NAME                DRIVER              SCOPE +
-495b3db75b0d        bridge              bridge              local +
-e1ed4de2f947        host                host                local +
-6bda460c97c6        none                null                local +
-</code>+
  
-====Bridge====+ echo "$dbPath" 
 +}
  
-Ce type de réseau est limité aux conteneurs d'un hôte unique exécutant Docker. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieuril faut configurer le mappage de port.+if [ "$originalArgOne"'mongod]; then 
 + file_env 'MONGO_INITDB_ROOT_USERNAME' 
 + file_env 'MONGO_INITDB_ROOT_PASSWORD' 
 + # pre-check a few factors to see if it's even worth bothering with initdb 
 + shouldPerformInitdb= 
 + if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
 + # if we have a username/passwordlet's set "--auth" 
 + _mongod_hack_ensure_arg '--auth' "$@" 
 + set -- "${mongodHackedArgs[@]}" 
 + shouldPerformInitdb='true' 
 + elif [ "$MONGO_INITDB_ROOT_USERNAME" ] || [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
 + cat >&2 <<-'EOF' 
 + error: missing 'MONGO_INITDB_ROOT_USERNAME' or 'MONGO_INITDB_ROOT_PASSWORD' 
 +        both must be specified for a user to be created 
 + EOF 
 + exit 1 
 + fi
  
-Par défaut Docker fonctionne en mode **Pont** ou (//Bridge//) et crée une interface intermédiaire à cet effet appelé **docker0** :+ if [ -z "$shouldPerformInitdb" ]; then 
 + # if we've got any /docker-entrypoint-initdb.d/* files to parse later, we should initdb 
 + for f in /docker-entrypoint-initdb.d/*; do 
 + case "$f" in 
 + *.sh|*.js) # this should match the set of files we check for below 
 + shouldPerformInitdb="$f" 
 + break 
 + ;; 
 + esac 
 + done 
 + fi
  
-<code> + check for a few known paths (to determine whether we've already initialized and should thus skip our initdb scripts) 
-root@debian9:~ip addr show docker0 + if [ -n "$shouldPerformInitdb" ]; then 
-3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default  + dbPath="$(_dbPath "$@")" 
-    link/ether 02:42:38:f1:e7:ee brd ff:ff:ff:ff:ff:ff + for path in \ 
-    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 + "$dbPath/WiredTiger" \ 
-       valid_lft forever preferred_lft forever + "$dbPath/journal"
-</code>+ "$dbPath/local.0" \ 
 + "$dbPath/storage.bson" \ 
 + ; do 
 + if [ -e "$path" ]; then 
 + shouldPerformInitdb= 
 + break 
 + fi 
 + done 
 + fi
  
-Démarrez un conteneur dénommé **resotest** à partir d'une image de CentOS : + if [ -n "$shouldPerformInitdb" ]; then 
 + mongodHackedArgs=( "$@"
 + if _parse_config "$@"; then 
 + _mongod_hack_ensure_arg_val --config "$tempConfigFile" "${mongodHackedArgs[@]}" 
 + fi 
 + _mongod_hack_ensure_arg_val --bind_ip 127.0.0.1 "${mongodHackedArgs[@]}" 
 + _mongod_hack_ensure_arg_val --port 27017 "${mongodHackedArgs[@]}" 
 + _mongod_hack_ensure_no_arg --bind_ip_all "${mongodHackedArgs[@]}"
  
-<code> + # remove "--auth" and "--replSet" for our initial startup (see https://docs.mongodb.com/manual/tutorial/enable-authentication/#start-mongodb-without-access-control) 
-root@debian9:~# docker run -itd --name=resotest centos + # https://github.com/docker-library/mongo/issues/211 
-2169360fcbfdbd6e68ea969a95edeb6fc42603c23ee42f03ceec286276519855 + _mongod_hack_ensure_no_arg --auth "${mongodHackedArgs[@]}" 
-</code>+ if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
 + _mongod_hack_ensure_no_arg_val --replSet "${mongodHackedArgs[@]}" 
 + fi
  
-Lancez ensuite la commande **docker network inspect bridge** à partir de la machine virtuelle hôte de Debian_9 :+ sslMode="$(_mongod_hack_have_arg '--sslPEMKeyFile' "$@" && echo 'allowSSL' || echo 'disabled')" # "BadValueneed sslPEMKeyFile when SSL is enabled" vs "BadValue: need to enable SSL via the sslMode flag when using SSL configuration parameters" 
 + _mongod_hack_ensure_arg_val --sslMode "$sslMode" "${mongodHackedArgs[@]}"
  
-<code> + if stat "/proc/$$/fd/1> /dev/null && -w "/proc/$$/fd/1" ]; then 
-root@debian9:~# docker network inspect bridge + # https://github.com/mongodb/mongo/blob/38c0eb538d0fd390c6cb9ce9ae9894153f6e8ef5/src/mongo/db/initialize_server_global_state.cpp#L237-L251 
-+ # https://github.com/docker-library/mongo/issues/164#issuecomment-293965668 
-    { + _mongod_hack_ensure_arg_val --logpath "/proc/$$/fd/1" "${mongodHackedArgs[@]}" 
-        "Name": "bridge", + else 
-        "Id": "495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12", + initdbLogPath="$(_dbPath "$@")/docker-initdb.log
-        "Created": "2017-09-07T07:44:49.942615596+01:00", + echo >&"warninginitdb logs cannot write to '/proc/$$/fd/1'so they are in '$initdbLogPath' instead
-        "Scope": "local", + _mongod_hack_ensure_arg_val --logpath "$initdbLogPath" "${mongodHackedArgs[@]}
-        "Driver": "bridge", + fi 
-        "EnableIPv6": false, + _mongod_hack_ensure_arg --logappend "${mongodHackedArgs[@]}"
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null+
-            "Config": [ +
-                { +
-                    "Subnet": "172.17.0.0/16", +
-                    "Gateway": "172.17.0.1" +
-                } +
-            +
-        }, +
-        "Internal"false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "2169360fcbfdbd6e68ea969a95edeb6fc42603c23ee42f03ceec286276519855":+
-                "Name": "resotest", +
-                "EndpointID": "fc74e519d69b9a2112be959c92cda22b67671b52efbbd36fadf66097ccbb1271", +
-                "MacAddress": "02:42:ac:11:00:03", +
-                "IPv4Address": "172.17.0.3/16", +
-                "IPv6Address""" +
-            }, +
-            "ad672c3038245c25a36162d05820c21f7250557ac342582d0908d3ca33799e37":+
-                "Name": "mongo2", +
-                "EndpointID": "adc15132fb73b57ab14e960feeff1b965321ada411be8535b715b103b941d8cc", +
-                "MacAddress": "02:42:ac:11:00:02", +
-                "IPv4Address": "172.17.0.2/16", +
-                "IPv6Address""+
-            } +
-        }, +
-        "Options": { +
-            "com.docker.network.bridge.default_bridge": "true", +
-            "com.docker.network.bridge.enable_icc""true", +
-            "com.docker.network.bridge.enable_ip_masquerade": "true", +
-            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", +
-            "com.docker.network.bridge.name": "docker0", +
-            "com.docker.network.driver.mtu""1500+
-        }, +
-        "Labels": {} +
-    } +
-+
-</code>+
  
-<WRAP center round important> + pidfile="${TMPDIR:-/tmp}/docker-entrypoint-temp-mongod.pid" 
-**Important** Notez ici que les conteneurs **mongo2** et **resotest** ne disposent pas de la même adresse que l'interface **docker0** de la machine hôte. Cependant les adresses se trouvent dans le même segment **172.17.0.0/16** indiqué par la sortie **"Subnet""172.17.0.0/16"**. + rm -f "$pidfile
-</WRAP>+ _mongod_hack_ensure_arg_val --pidfilepath "$pidfile" "${mongodHackedArgs[@]}"
  
-Vous pouvez déconnecter un conteneur du réseau en utilisant la commande suivante :+ "${mongodHackedArgs[@]}" --fork
  
-<code> + mongo=( mongo --host 127.0.0.1 --port 27017 --quiet )
-root@debian9:~# docker network disconnect bridge resotest +
-root@debian9:~# docker network inspect bridge +
-+
-    { +
-        "Name": "bridge", +
-        "Id": "495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12", +
-        "Created": "2017-09-07T07:44:49.942615596+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": null, +
-            "Config":+
-                { +
-                    "Subnet": "172.17.0.0/16", +
-                    "Gateway": "172.17.0.1+
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "ad672c3038245c25a36162d05820c21f7250557ac342582d0908d3ca33799e37":+
-                "Name": "mongo2", +
-                "EndpointID": "adc15132fb73b57ab14e960feeff1b965321ada411be8535b715b103b941d8cc", +
-                "MacAddress": "02:42:ac:11:00:02", +
-                "IPv4Address": "172.17.0.2/16", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options":+
-            "com.docker.network.bridge.default_bridge": "true", +
-            "com.docker.network.bridge.enable_icc": "true", +
-            "com.docker.network.bridge.enable_ip_masquerade": "true", +
-            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", +
-            "com.docker.network.bridge.name": "docker0", +
-            "com.docker.network.driver.mtu": "1500" +
-        }, +
-        "Labels": {} +
-    } +
-+
-</code>+
  
-Créez maintenant votre propre réseau ponté appelé **my-bridged-network** :+ # check to see that our "mongod" actually did start up (catches "--help", "--version", MongoDB 3.2 being silly, slow prealloc, etc) 
 + # https://jira.mongodb.org/browse/SERVER-16292 
 + tries=30 
 + while true; do 
 + if ! { [ -s "$pidfile" ] && ps "$(< "$pidfile")" &> /dev/null; }; then 
 + # bail ASAP if "mongod" isn't even running 
 + echo >&
 + echo >&2 "error: $originalArgOne does not appear to have stayed running -- perhaps it had an error?" 
 + echo >&
 + exit 1 
 + fi 
 + if "${mongo[@]}" 'admin' --eval 'quit(0)' &> /dev/null; then 
 + # success! 
 + break 
 + fi 
 + (( tries-- )) 
 + if [ "$tries" -le 0 ]; then 
 + echo >&
 + echo >&2 "error: $originalArgOne does not appear to have accepted connections quickly enough -- perhaps it had an error?" 
 + echo >&
 + exit 1 
 + fi 
 + sleep 1 
 + done
  
-<code> + if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
-root@debian9:~# docker network create -d bridge --subnet 172.25.0.0/16 --gateway 172.25.0.1 my-bridged-network + rootAuthDatabase='admin'
-ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3 +
-root@debian9:~# docker network ls +
-NETWORK ID          NAME                 DRIVER              SCOPE +
-495b3db75b0d        bridge               bridge              local +
-e1ed4de2f947        host                 host                local +
-ceb7ba749393        my-bridged-network   bridge              local +
-6bda460c97c6        none                 null                local              +
-</code>+
  
-Bien évidementce réseau est actuellement vide :+ "${mongo[@]}" "$rootAuthDatabase" <<-EOJS 
 + db.createUser({ 
 + user: $(_js_escape "$MONGO_INITDB_ROOT_USERNAME"), 
 + pwd: $(_js_escape "$MONGO_INITDB_ROOT_PASSWORD"), 
 + roles: [ { role: 'root'db$(_js_escape "$rootAuthDatabase") } ] 
 + }) 
 + EOJS 
 + fi
  
-<code> + export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}"
-root@debian9:~# docker network inspect my-bridged-network +
-+
-    { +
-        "Name""my-bridged-network", +
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": {}+
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers": {}, +
-        "Options": {}, +
-        "Labels": {} +
-    } +
-+
-</code>+
  
-Lancez maintenant deux conteneurs et consultez les informations concernant le réseau + echo 
 + for f in /docker-entrypoint-initdb.d/*; do 
 + case "$f" in 
 + *.sh) echo "$0running $f"; . "$f" ;; 
 + *.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;; 
 + *)    echo "$0: ignoring $f" ;; 
 + esac 
 + echo 
 + done
  
-<code> + "${mongodHackedArgs[@]}" --shutdown 
-root@debian9:~# docker run -itd --name=centos1 centos + rm -f "$pidfile"
-9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e+
  
-root@debian9:~# docker run -itd --name=centos2 centos + echo 
-aaed3bc8e404ee1bccd6c87b39de32332940b5391514691fc70188edb17c1d7c+ echo 'MongoDB init process complete; ready for start up.' 
 + echo 
 + fi
  
-root@debian9:~docker inspect --format='{{json .NetworkSettings.Networks}}'  centos1 + MongoDB 3.6+ defaults to localhost-only binding 
-{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12","EndpointID":"d7b87875688b45258fc867b6bb8b0a0592f5c5fa16857fe136e55b87b6698219","Gateway":"172.17.0.1","IPAddress":"172.17.0.3","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:03","DriverOpts":null}}+ if mongod --help 2>&1 | grep -q -- --bind_ip_all; then # TODO remove this conditional when 3.4 is no longer supported 
 + haveBindIp= 
 + if _mongod_hack_have_arg --bind_ip "$@|| _mongod_hack_have_arg --bind_ip_all "$@"; then 
 + haveBindIp=1 
 + elif _parse_config "$@&& jq --exit-status '.net.bindIp // .net.bindIpAll' "$jsonConfigFile> /dev/null; then 
 + haveBindIp=1 
 + fi 
 + if [ -z "$haveBindIp]; then 
 + # so if no "--bind_ipis specifiedlet's add "--bind_ip_all" 
 + set -- "$@--bind_ip_all 
 + fi 
 + fi
  
-root@debian9:~# docker inspect --format='{{json .NetworkSettings.Networks}}'  centos2 + unset "${!MONGO_INITDB_@}" 
-{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"495b3db75b0d4bfcfc6da7c3e2af5f6addcdc227aa8b69b1e59a998be1819d12","EndpointID":"2bfe090dccef89495d437d8deba5765996a917544ab7fde28ef5199f4e907eb1","Gateway":"172.17.0.1","IPAddress":"172.17.0.4","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:04","DriverOpts":null}}+fi
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos1 +rm -f "$jsonConfigFile" "$tempConfigFile"
-172.17.0.3+
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +exec "$@" 
-172.17.0.4 +</file>
-</code>+
  
-Mettez le conteneur **centos1** dans le réseau **my-bridged-network** :+Examinons chaque commande dans le Dockerfile :
  
-<code> +====1.2 FROM====
-root@debian9:~# docker network connect my-bridged-network centos1+
  
-root@debian9:~# docker network inspect my-bridged-network +<file> 
-+FROM ubuntu:bionic 
-    { +</file>
-        "Name""my-bridged-network", +
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": {}, +
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e":+
-                "Name": "centos1", +
-                "EndpointID": "71e10e4e34ce8c42ef029e302f6ed372357f6fde8fd87fc2cbc1b14c2bdf6bb5", +
-                "MacAddress": "02:42:ac:19:00:02", +
-                "IPv4Address": "172.25.0.2/16", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options": {}, +
-        "Labels": {} +
-    } +
-]+
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos1 +Cette ligne définit l'image à partir de laquelle sera construite notre image. Quand l'image n'est construite à partir d'une autre image, la valeur de **FROM** est **scratch**. 
-172.17.0.3172.25.0.2 + 
-</code>+====1.3 RUN==== 
 + 
 +<file> 
 +... 
 + 
 +RUN groupadd -r mongodb && useradd -r -g mongodb mongodb 
 + 
 +RUN set -eux; \ 
 + apt-get update; \ 
 + apt-get install -y --no-install-recommends \ 
 + ca-certificates \ 
 + jq \ 
 + numactl \ 
 + ; \ 
 + if ! command -v ps > /dev/null; then \ 
 + apt-get install -y --no-install-recommends procps; \ 
 + fi; \ 
 + rm -rf /var/lib/apt/lists/
 +... 
 +RUN set -ex; \ 
 +
 + apt-get update; \ 
 + apt-get install -y --no-install-recommends \ 
 + wget \ 
 + ; \ 
 + if ! command -v gpg > /dev/null; then \ 
 + apt-get install -y --no-install-recommends gnupg dirmngr; \ 
 + fi; \ 
 + rm -rf /var/lib/apt/lists/*;
 +
 + dpkgArch="$(dpkg --print-architecture | awk -F- 'print $NF }')";
 + wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch";
 + wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc";
 + export GNUPGHOME="$(mktemp -d)"; \ 
 + gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4;
 + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu;
 + command -v gpgconf && gpgconf --kill all || :; \ 
 + rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc;
 + chmod +x /usr/local/bin/gosu;
 + gosu --version; \ 
 + gosu nobody true; \ 
 +
 + wget -O /js-yaml.js "https://github.com/nodeca/js-yaml/raw/${JSYAML_VERSION}/dist/js-yaml.js"; \ 
 +# TODO some sort of download verification here 
 +
 + apt-get purge -y --auto-remove wget 
 + 
 +RUN mkdir /docker-entrypoint-initdb.
 +... 
 + 
 +RUN set -ex; \ 
 + export GNUPGHOME="$(mktemp -d)"; \ 
 + for key in $GPG_KEYS; do \ 
 + gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key";
 + done; \ 
 + gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg;
 + command -v gpgconf && gpgconf --kill all || :; \ 
 + rm -r "$GNUPGHOME";
 + apt-key list 
 +... 
 +RUN set -x \ 
 + && apt-get update \ 
 + && apt-get install -y \ 
 + ${MONGO_PACKAGE}=$MONGO_VERSION \ 
 + ${MONGO_PACKAGE}-server=$MONGO_VERSION \ 
 + ${MONGO_PACKAGE}-shell=$MONGO_VERSION \ 
 + ${MONGO_PACKAGE}-mongos=$MONGO_VERSION \ 
 + ${MONGO_PACKAGE}-tools=$MONGO_VERSION \ 
 + && rm -rf /var/lib/apt/lists/* \ 
 + && rm -rf /var/lib/mongodb \ 
 + && mv /etc/mongod.conf /etc/mongod.conf.orig 
 + 
 +RUN mkdir -p /data/db /data/configdb \ 
 + && chown -R mongodb:mongodb /data/db /data/configdb 
 +... 
 +</file> 
 + 
 +Cette commande lance un processus dans la construction de l'image. Dans les cas ci-dessus, chaque chaîne correspond à la commande passée au shell **/bin/sh**. 
 + 
 +Il existe un autre syntaxe de la commande RUN appelé le format exec, à savoir : 
 + 
 +  RUN ["/bin/bash", "-c", "commande"]
  
 <WRAP center round important> <WRAP center round important>
-**Important** : Notez  que le conteneur **centos1** se trouve dans deux réseaux.+**Important** : La commande RUN est utilisée pour exécuter une commande passée en argument lors de la compilation de l'image seulement. Cette commande ne doit pas donc être utilisée pour exécuter une commande lors du lancement du conteneur. La commande utilisée pour accomplir ce dernier est ENTRYPOINT.
 </WRAP> </WRAP>
  
-Faites la même chose pour le conteneur **centos2** :+====1.4 - ENV====
  
-<code> +Cette commande permet de fixer la valeur d'une variable d'environnement disponible dans la suite du Dockerfile 
-root@debian9:~# docker network connect my-bridged-network centos2+
  
-root@debian9:~# docker network inspect my-bridged-network +<file> 
-+... 
-    { +ENV GOSU_VERSION 1.11 
-        "Name": "my-bridged-network", +# grab "js-yamlfor parsing mongod's YAML config files (https://github.com/nodeca/js-yaml/releases) 
-        "Id": "ceb7ba7493933c55d181bc92b1f799ca07bfe84b168d52a6ac648c1a906093f3", +ENV JSYAML_VERSION 3.13.0 
-        "Created": "2017-09-07T10:03:17.063730665+01:00", +...
-        "Scope": "local", +
-        "Driver": "bridge", +
-        "EnableIPv6": false, +
-        "IPAM":+
-            "Driver": "default", +
-            "Options": {}, +
-            "Config":+
-                { +
-                    "Subnet": "172.25.0.0/16", +
-                    "Gateway": "172.25.0.1" +
-                } +
-            ] +
-        }, +
-        "Internal": false, +
-        "Attachable": false, +
-        "Ingress": false, +
-        "ConfigFrom":+
-            "Network": "" +
-        }, +
-        "ConfigOnly": false, +
-        "Containers":+
-            "9f36a628c72b383edfd4dc13ee4e4b2eaf5be0078d780f0334fcb8be0d977d0e":+
-                "Name": "centos1", +
-                "EndpointID": "71e10e4e34ce8c42ef029e302f6ed372357f6fde8fd87fc2cbc1b14c2bdf6bb5", +
-                "MacAddress": "02:42:ac:19:00:02", +
-                "IPv4Address": "172.25.0.2/16", +
-                "IPv6Address": "" +
-            }, +
-            "aaed3bc8e404ee1bccd6c87b39de32332940b5391514691fc70188edb17c1d7c":+
-                "Name": "centos2", +
-                "EndpointID": "34f533622f134b995097f1d3e6ce935158c1e5644201f896b42336738a81819c", +
-                "MacAddress": "02:42:ac:19:00:03", +
-                "IPv4Address": "172.25.0.3/16", +
-                "IPv6Address": "" +
-            } +
-        }, +
-        "Options": {}, +
-        "Labels": {} +
-    } +
-]+
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +ENV GPG_KEYS E162F504A20CDF15827F718D4B7C549A058F8B6B 
-172.17.0.4172.25.0.3 +...
-</code>+
  
-Connectez-vous au conteneur **centos1** en lançant bash :+ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
  
-<code> +ENV MONGO_MAJOR 4.1 
-root@debian9:~# docker exec -it centos1 bash +ENV MONGO_VERSION 4.1.95 
-</code>+... 
 +</file>
  
-Vérifiez que la connectivité fonctionne :+**et** dans les conteneurs générés à partir de l'image construite.
  
-<code> +====1.5 - VOLUME====
-[root@9f36a628c72b /]# ping 172.25.0.3 +
-PING 172.25.0.3 (172.25.0.3) 56(84) bytes of data. +
-64 bytes from 172.25.0.3: icmp_seq=1 ttl=64 time=0.100 ms +
-64 bytes from 172.25.0.3: icmp_seq=2 ttl=64 time=0.050 ms +
-64 bytes from 172.25.0.3: icmp_seq=3 ttl=64 time=0.050 ms +
-^C +
---- 172.25.0.3 ping statistics --- +
-3 packets transmitted, 3 received, 0% packet loss, time 1998ms +
-rtt min/avg/max/mdev 0.050/0.066/0.100/0.025 ms +
-</code>+
  
-Les options possibles au niveau de la gestion du réseau sont vasteVoici deux exemples supplémentaires.+<file> 
 +..
 +VOLUME /data/db /data/configdb 
 +... 
 +</file>
  
-Il est possible d'ajouter une adresse d'un serveur DNS au lancement d'un conteneur :+Cette commande expose les répertoires passés en argument afin qu'ils puissent être mappés vers des répertoires sur la machine hôte ou ailleurs, tel que nous avons vu avec l'exemple nginx.
  
-<code> +====1.6 COPY====
-[root@9f36a628c72b /]# exit +
-exit +
-root@debian9:~# docker stop mongo2 +
-mongo2 +
-root@debian9:~# docker rm mongo2 +
-mongo2 +
-root@debian9:~# docker run -it --name mongo2 --dns 8.8.8.8 i2tch/mongodb2 bash +
-root@735599480b45:/# cat /etc/resolv.conf  +
-search home +
-nameserver 8.8.8.8 +
-root@735599480b45:/#  +
-</code>+
  
-ou de passer une entrée pour le fichier **/etc/hosts** :+<file> 
 +... 
 +COPY docker-entrypoint.sh /usr/local/bin/ 
 +... 
 +</file>
  
-<code> +Cette commande permet de récupérer les fichiers dans le contexte et de les copier dans l'image.
-root@735599480b45:/# exit +
-exit +
-root@debian9:~# docker stop mongo2 +
-mongo2 +
-root@debian9:~# docker rm mongo2 +
-mongo2 +
-root@debian9:~# docker run -it --name mongo2 --add-host mickeymouse:127.0.0.1 i2tch/mongodb2 bash +
-root@718e7eab814f:/# cat /etc/hosts +
-127.0.0.1 localhost +
-::1 localhost ip6-localhost ip6-loopback +
-fe00::0 ip6-localnet +
-ff00::0 ip6-mcastprefix +
-ff02::1 ip6-allnodes +
-ff02::2 ip6-allrouters +
-127.0.0.1 mickeymouse +
-172.17.0.2 718e7eab814f +
-</code>+
  
-====Host====+**Attention** : tous les fichiers dans le contexte sont inclus dans l'image finale, même ceux qui sont inutiles.
  
-Ce type de réseau est utilisé dans le cas où le réseau ne doit pas être isolé de l'hôte tout en isolant les autres aspects du conteneurLes conteneurs utilisent la même interface que l'hôte en prenant la même adresse IP que la machine hôte.+Il est possible d'exclure des fichiers présents dans le contexte en les mettant dans un fichier appelé **.dockerignore** placé dans le contexte.
  
-Dans le cas de la machine virtuelle, l'adresse IP de l'interface connectée au réseau local est **10.0.2.15** :+<WRAP center round important> 
 +**Important** - Il existe une autre commande similaire à COPY : ADD. ADD est une commande qui n'est plus recommendé sauf dans le cas de cas spécifiques. Notez que dans le cas de l'utilisation de la commande ADD, si le fichier source est une archive de type TAR, son contenu sera désarchivé et copier vers la destination tandis que si le fichier source est référencé par un URL, le contenu sera téléchargé puis déposé dans la destination. 
 +</WRAP>
  
-<code> +====1.7 - ENTRYPOINT====
-root@debian9:~# ip addr show enp0s3 +
-2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 +
-    link/ether 08:00:27:2e:77:01 brd ff:ff:ff:ff:ff:ff +
-    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 +
-       valid_lft 83772sec preferred_lft 83772sec +
-    inet6 fe80::a00:27ff:fe2e:7701/64 scope link  +
-       valid_lft forever preferred_lft forever +
-</code>+
  
-Démarrez un conteneur à partir de l'image **centos** dans un réseau de type **host** :+<file> 
 +... 
 +ENTRYPOINT ["docker-entrypoint.sh"
 +... 
 +</file>
  
-<code> +Cette commande stipule la commande qui sera exécutée lors du démarrage du conteneur.
-root@debian9:~# docker run -it --rm --network host --name centos1 centos bash +
-[root@debian9 /]# ip a +
-1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 +
-    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +
-    inet 127.0.0.1/8 scope host lo +
-       valid_lft forever preferred_lft forever +
-    inet6 ::1/128 scope host  +
-       valid_lft forever preferred_lft forever +
-2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 +
-    link/ether 08:00:27:2e:77:01 brd ff:ff:ff:ff:ff:ff +
-    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 +
-       valid_lft 82102sec preferred_lft 82102sec +
-    inet6 fe80::a00:27ff:fe2e:7701/64 scope link  +
-       valid_lft forever preferred_lft forever +
-3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default  +
-    link/ether 02:42:38:f1:e7:ee brd ff:ff:ff:ff:ff:ff +
-    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 +
-       valid_lft forever preferred_lft forever +
-    inet6 fe80::42:38ff:fef1:e7ee/64 scope link  +
-       valid_lft forever preferred_lft forever +
-[root@debian9 /]# hostname +
-debian9 +
-[root@debian9 /]# exit +
-</code>+
  
-====None====+Deux cas de figure se présentent :
  
-Ce type de réseau est utilisé principalement dans le cas de l'utilisation d'un plugin réseau disponible dans le **[[https://hub.docker.com/search/?category=network&q=&type=plugin|Docker Hub]]**.+  * ENTRYPOINT suivi d'une chaîne - un shell est démarré pour exécuter la chaîne, 
 +  ENTRYPOINT suivi d'une table JSON ( comme ci-dessus ) au format ENTRYPOINT ["commande à exécuter", "paramètres de la commande"].
  
-Il est donc possible de lancer un conteneur totalement étanche grâce au réseau **none** :+Dans le fichier **docker-entrypoint.sh** :
  
-<code+<file
-root@718e7eab814f:/# exit +... 
-exit +originalArgOne="$1"
-root@debian9:~# docker stop mongo2 +
-mongo2 +
-root@debian9:~# docker rm mongo2 +
-mongo2 +
-root@debian9:~# docker run -it --name mongo2 --network none i2tch/mongodb2 bash +
-root@332aa9930f30:/#  +
-</code>+
  
-====Liens====+# allow the container to be started with `--user` 
 +# all mongo* commands should be dropped to the correct user 
 +if [[ "$originalArgOne" == mongo* ]] && [ "$(id -u)" '0' ]; then 
 + if [ "$originalArgOne" 'mongod' ]; then 
 + find /data/configdb /data/db \! -user mongodb -exec chown mongodb '{}'
 + fi
  
-Le mécanisme des liens entre conteneurs est très puissant et permet d'atteindre un autre conteneur facilement à condition que les deux conteneurs soient dans le même réseau. Créez donc un conteneur dénommé **centos3** qui est lié au conteneur **centos2** qu'il connait aussi sous l'alias **alias** :+ # make sure we can write to stdout and stderr as "mongodb" 
 + # (for our "initdb" code later; see "--logpath" below) 
 + chown --dereference mongodb "/proc/$$/fd/1" "/proc/$$/fd/2" || : 
 + # ignore errors thanks to https://github.com/docker-library/mongo/issues/149
  
-<code> + exec gosu mongodb "$BASH_SOURCE" "$@" 
-root@332aa9930f30:/# exit +fi
-exit+
  
-root@debian9:~docker run -itd --name centos3 --link centos2:alias centos +# you should use numactl to start your mongod instances, including the config servers, mongos instances, and any clients. 
-6a315259b2946c3bf2bb69f608cbe910d87edaadedb4f805e7a4dbf6af1eb916+# https://docs.mongodb.com/manual/administration/production-notes/#configuring-numa-on-linux 
 +if [[ "$originalArgOne" == mongo* ]]; then 
 + numa='numactl --interleave=all' 
 + if $numa true &> /dev/null; then 
 + set -- $numa "$@" 
 + fi 
 +fi 
 +... 
 +exec "$@" 
 +</file>
  
-root@debian9:~# docker ps -a +si la valeur du paramètre passé à entrypoint.sh est **mongod**, le script affecte l'utilisateur mongodb aux répertoires /data/configdb et /data/db puis lance mongo sous l'utilisateur mongodb avec des droits réduits gosu ).
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES +
-6a315259b294        centos              "/bin/bash"              33 seconds ago      Up 32 seconds                                     centos3 +
-332aa9930f30        i2tch/mongodb2      "docker-entrypoint..."   3 minutes ago       Exited (127) 39 seconds ago                       mongo2 +
-aaed3bc8e404        centos              "/bin/bash"              16 minutes ago      Up 16 minutes                                     centos2 +
-9f36a628c72b        centos              "/bin/bash"              16 minutes ago      Up 16 minutes                                     centos1 +
-2169360fcbfd        centos              "/bin/bash"              20 minutes ago      Up 20 minutes                                     resotest +
-ea239635e141        testcache           "more /tmp/moment"       7 hours ago         Exited (0) 7 hours ago                            test1 +
-21b0490a93dd        i2tch/mydocker      "/entrypoint.sh my..."   7 hours ago         Exited (137) 6 hours ago                          myDocker +
-bdb4bc0f81de        i2tch/mongodb1      "docker-entrypoint..."   18 hours ago        Created                       27017/tcp           mongo1 +
-f5b45072b831        i2tch/mongodb       "bash"                   19 hours ago        Exited (137) 6 hours ago                          mongo +
-9731a48f126a        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (06 hours ago                            cocky_gates +
-eacd70596e23        nginx               "nginx -g 'daemon ..."   19 hours ago        Exited (0) 19 hours ago                           adoring_yonath +
-cffb4456e9c4        ubuntu              "/bin/bash"              20 hours ago        Exited (0) 20 hours ago                           i2tch+
  
-root@debian9:~# docker exec -it centos3 bash+Ce fichier finit par "$@" qui indique que si aucune condition n'ait été remplie, la commande est exécutée avec la valeur passée en argument.
  
-[root@6a315259b294 /]# ping centos2 +<WRAP center round important> 
-PING alias (172.17.0.4) 56(84) bytes of data+**Important** - Notez que la compilation d'une image se fait à l'intérieur d'un **contexte**Le **contexte** est le répertoire de buildDernièrement, notez qu'il peut y avoir plusieurs ENTRYPOINT dans le fichier Dockerfile mais uniquement le dernier est pris en compte
-64 bytes from alias (172.17.0.4): icmp_seq=1 ttl=64 time=0.116 ms +</WRAP>
-64 bytes from alias (172.17.0.4): icmp_seq=2 ttl=64 time=0.069 ms +
-64 bytes from alias (172.17.0.4): icmp_seq=3 ttl=64 time=0.068 ms +
-64 bytes from alias (172.17.0.4): icmp_seq=4 ttl=64 time=0.070 ms +
-^C +
---- alias ping statistics --- +
-4 packets transmitted, 4 received, 0% packet loss, time 2999ms +
-rtt min/avg/max/mdev = 0.068/0.080/0.116/0.023 ms+
  
-[root@6a315259b294 /]# cat /etc/hosts +====1.EXPOSE====
-127.0.0.1 localhost +
-::1 localhost ip6-localhost ip6-loopback +
-fe00::0 ip6-localnet +
-ff00::0 ip6-mcastprefix +
-ff02::1 ip6-allnodes +
-ff02::2 ip6-allrouters +
-172.17.0.4 alias aaed3bc8e404 centos2 +
-172.17.0.2 6a315259b294+
  
-[root@6a315259b294 /]# exit +<file> 
-exit+... 
 +EXPOSE 27017 
 +... 
 +</file>
  
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}centos3 +Cette commande permet d'exposer un port à l'extérieur du conteneur. 
-172.17.0.2+ 
 +====1.9 CMD==== 
 + 
 +<file> 
 +... 
 +CMD ["mongod"
 +... 
 +</file> 
 + 
 +Ceci représente la valeur du paramètre par défaut si aucun paramètre n'est spécifié à la fin de la commande docker run. 
 + 
 +====1.10 - Autres Commandes==== 
 + 
 +Le Dockerfile peut aussi contenir les commandes suivantes : 
 + 
 +  * **WORKDIR**, 
 +    * Cette commande fixe le répertoire de travil lors de la compilation d'une imageElle peut apparaître plusieurs fois dans le Dockerfile permettant ainsi l'évolution du répertoire de travail, 
 +  * **LABEL**, 
 +    * Cette commande permet de définir des couples clef/valeur à inclure dans les méta-données décrivant l'image lors de sa distribution, par exemple, la **version**, la **description** ou un **readme**. 
 + 
 + 
 +Lancez maintenant la compilation de l'image : 
 + 
 +<code> 
 +root@debian9:~/mongodb# docker build .
 </code> </code>
  
-Notez cependant qu le lien est unidirectionnel :+Consultez la liste de images :
  
 <code> <code>
-root@debian9:~# docker exec -it centos2 bash+root@debian9:~/mongodb# docker images 
 +REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE 
 +<none>              <none>              3bf216d921d6        About a minute ago   96.2MB 
 +i2tch/mongodb       latest              eca7835d4fe6        11 minutes ago       1.03GB 
 +nginx               latest              2bcb04bdb83f        13 days ago          109MB 
 +centos              latest              9f38484d220f        3 weeks ago          202MB 
 +ubuntu              bionic              94e814e2efa8        4 weeks ago          88.9MB 
 +ubuntu              latest              94e814e2efa8        4 weeks ago          88.9MB 
 +hello-world         latest              fce289e99eb9        3 months ago         1.84kB 
 +</code>
  
-[root@aaed3bc8e404 /]# ping centos3 +Notez que l'image n'a ni REPOSITORY, ni TAG. Créez donc un TAG :
-pingcentos3: Name or service not known+
  
-[root@aaed3bc8e404 /]ping 172.17.0.2 +<code> 
-PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data+root@debian9:~/mongodbdocker tag 3bf2 i2tch/mongodb1 
-64 bytes from 172.17.0.2: icmp_seq=ttl=64 time=0.054 ms +root@debian9:~/mongodb# docker images 
-64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.035 ms +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-64 bytes from 172.17.0.2: icmp_seq=ttl=64 time=0.051 ms +i2tch/mongodb1      latest              3bf216d921d6        minutes ago       96.2MB 
-64 bytes from 172.17.0.2: icmp_seq=ttl=64 time=0.071 ms +i2tch/mongodb       latest              eca7835d4fe6        11 minutes ago      1.03GB 
-^C +nginx               latest              2bcb04bdb83f        13 days ago         109MB 
---- 172.17.0.2 ping statistics --- +centos              latest              9f38484d220f        weeks ago         202MB 
-4 packets transmitted, 4 received, 0% packet loss, time 2997ms +ubuntu              bionic              94e814e2efa8        4 weeks ago         88.9MB 
-rtt min/avg/max/mdev = 0.035/0.052/0.071/0.015 ms+ubuntu              latest              94e814e2efa8        weeks ago         88.9MB 
 +hello-world         latest              fce289e99eb9        3 months ago        1.84kB 
 +</code>
  
-[root@aaed3bc8e404 /]+Démarrez un conteneur à partir de l'image i2tch/mongodb1 : 
 + 
 +<code> 
 +root@debian9:~/mongodbdocker run -d --name mongo1 i2tch/mongodb1 
 +bdb4bc0f81de8b5821f20d8609b9640abaaae7b4a7577c42b78d4bd34617d211 
 +docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "exec: \"docker-entrypoint.sh\": executable file not found in $PATH"
 +root@debian9:~/mongodb# ls -l 
 +total 16 
 +-rw-r--r-- 1 root root 10971 avril  9 13:56 docker-entrypoint.sh 
 +-rw-r--r-- 1 root root  3542 avril  9 13:55 Dockerfile
 </code> </code>
  
-Dans le cas ci-dessus, **centos2** peut atteindre **centos3** en utilisant l'adresse IP **172.17.0.2** car **centos2** se trouve dans les deux réseaux avec les adresses IP 172.17.0.4 et 172.25.0.3  :+<WRAP center round important> 
 +**Important** - Notez que le fichier docker-entrypoint.sh n'était pas exécutable ! 
 +</WRAP> 
 + 
 +Recompilez donc l'image :
  
 <code> <code>
-[root@aaed3bc8e404 /]exit +root@debian9:~/mongodbdocker rm mongo1 
-exit +mongo1 
-root@debian9:~# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2 +root@debian9:~/mongodbchmod +x docker-entrypoint.sh 
-172.17.0.4172.25.0.3+root@debian9:~/mongodb# docker build . 
 +Sending build context to Docker daemon   16.9kB 
 +Step 1/22 : FROM ubuntu:bionic 
 + ---> 94e814e2efa8 
 +Step 2/22 : RUN groupadd -r mongodb && useradd -r -g mongodb mongodb 
 + ---> Using cache 
 + ---> f40ac453fa97 
 +Step 3/22 : RUN set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates jq numactl ; if ! command -v ps > /dev/null; then apt-get install -y --no-install-recommends procps; fi; rm -rf /var/lib/apt/lists/
 + ---> Using cache 
 + ---> adc57da1b19f 
 +Step 4/22 : ENV GOSU_VERSION 1.11 
 + ---> Using cache 
 + ---> 038e7de870b7 
 +Step 5/22 : ENV JSYAML_VERSION 3.13.0 
 + ---> Using cache 
 + ---> 3bf216d921d6 
 +... 
 +Removing intermediate container a98ae692fe1f 
 + ---> 04c2e98927c3 
 +Step 17/22 : RUN mkdir -p /data/db /data/configdb && chown -R mongodb:mongodb /data/db /data/configdb 
 + ---> Running in d0f5bee34571 
 +Removing intermediate container d0f5bee34571 
 + ---> d5b95e9e63e1 
 +Step 18/22 : VOLUME /data/db /data/configdb 
 + ---> Running in c7626528a9b9 
 +Removing intermediate container c7626528a9b9 
 + ---> 4250613adf6a 
 +Step 19/22 : COPY docker-entrypoint.sh /usr/local/bin/ 
 + ---> eedfd53da0f8 
 +Step 20/22 : ENTRYPOINT ["docker-entrypoint.sh"
 + ---> Running in eff53d0213d1 
 +Removing intermediate container eff53d0213d1 
 + ---> 716abf2faa87 
 +Step 21/22 : EXPOSE 27017 
 + ---> Running in 5139fcf19d7f 
 +Removing intermediate container 5139fcf19d7f 
 + ---> fc5896e08fd6 
 +Step 22/22 : CMD ["mongod"
 + ---> Running in 458d6f15cdf2 
 +Removing intermediate container 458d6f15cdf2 
 + ---> 12e00099ca8d 
 +Successfully built 12e00099ca8d 
 +root@debian9:~/mongodb# 
 </code> </code>
  
-====Lancer Wordpress dans un container====+<WRAP center round important> 
 +**Important** - Notez ici les lignes **Using cache**. Il est cependant possible de ne pas utiliser le cache en stipulant **--no-cache**. Notez aussi l'utilisation de conteneurs temporaires par étape nouvelle avec un commit vers une image et une suppression dudit conteneur. Dernièrement, notez que la compilation d'une image se fait à l'intérieur d'un **contexte**. Le **contexte** est le répertoire de build. **Attention** : tous les fichiers dans le contexte sont inclus dans l'image finale, même ceux qui sont inutiles. 
 +</WRAP>
  
-Créez le répertoire ~/wordpress et placez-vous dedans :+Consultez la liste des images de nouveau et renommez votre dernière image :
  
 <code> <code>
-root@debian9:~# mkdir ~/wordpress && cd ~/wordpress+root@debian9:~/mongodbdocker images 
 +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
 +<none>              <none>              12e00099ca8d        42 seconds ago      377MB 
 +i2tch/mongodb1      latest              3bf216d921d6        10 minutes ago      96.2MB 
 +i2tch/mongodb       latest              eca7835d4fe6        19 minutes ago      1.03GB 
 +nginx               latest              2bcb04bdb83f        13 days ago         109MB 
 +centos              latest              9f38484d220f        3 weeks ago         202MB 
 +ubuntu              bionic              94e814e2efa8        4 weeks ago         88.9MB 
 +ubuntu              latest              94e814e2efa8        4 weeks ago         88.9MB 
 +hello-world         latest              fce289e99eb9        3 months ago        1.84kB 
 +root@debian9:~/mongodb# docker tag 12e0 i2tch/mongodb2 
 +root@debian9:~/mongodb# docker images 
 +REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE 
 +i2tch/mongodb2      latest              12e00099ca8d        About a minute ago   377MB 
 +i2tch/mongodb1      latest              3bf216d921d6        11 minutes ago       96.2MB 
 +i2tch/mongodb       latest              eca7835d4fe6        20 minutes ago       1.03GB 
 +nginx               latest              2bcb04bdb83f        13 days ago          109MB 
 +centos              latest              9f38484d220f        3 weeks ago          202MB 
 +ubuntu              bionic              94e814e2efa8        4 weeks ago          88.9MB 
 +ubuntu              latest              94e814e2efa8        4 weeks ago          88.9MB 
 +hello-world         latest              fce289e99eb9        3 months ago         1.84kB
 </code> </code>
  
-Créez un conteneur dénommé **wordpressdb** à partir de l'image **mariadb:latest** :+Lancez un conteneur à partir de la dernière image :
  
 <code> <code>
-root@debian9:~/wordpress# docker run -e MYSQL_ROOT_PASSWORD=fenestros -e MYSQL_DATABASE=wordpress --name wordpressdb -v "$PWD/database":/var/lib/mysql -d mariadb:latest +root@debian9:~/mongodb# docker run ---name mongo2 i2tch/mongodb2 
-Unable to find image 'mariadb:latest' locally +e91a055283f4d67cbd91d11bb3faa6f67925893cb18f9cc25023e72e0f7ed85a
-latest: Pulling from library/mariadb +
-f2b6b4884fc8: Pull complete  +
-26d8bdca4f3e: Pull complete  +
-74f09e820cce: Pull complete  +
-5390f1fe4554: Pull complete  +
-3d3f1706a741: Pull complete  +
-2942f66426ea: Pull complete  +
-97ee11d39c75: Pull complete  +
-590c46ef722b: Pull complete  +
-32eb4b9666e5: Pull complete  +
-fc883f98a064: Pull complete  +
-bb8bee61bc1e: Pull complete  +
-Digest: sha256:6135f5b851e7fe263dcf0edf3480cdab1ab28c4287e867c5d83fbe967412ea14 +
-Status: Downloaded newer image for mariadb:latest +
-67831dacf002bdc21dc79b0e8483f538235d00ddd2e8aae175ef3ebf189ae14d+
 </code> </code>
  
-Vérifiez que le conteneur fonctionne :+Utilisez la commande **docker ps** pour visualiser si le processus mongodb est bien démarré :
  
 <code> <code>
-root@debian9:~/wordpress# docker ps +root@debian9:~/mongodb# docker ps 
-CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES 
-67831dacf002        mariadb:latest      "docker-entrypoint.s…"   About a minute ago   Up 45 seconds       3306/tcp            wordpressdb+e91a055283f4        i2tch/mongodb2      "docker-entrypoint.s…"   28 seconds ago      Up 27 seconds       27017/tcp            mongo2 
 +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   21 minutes ago      Up 19 minutes                            mongo 
 +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:81->80/tcp   suspicious_sanderson
 </code> </code>
  
-Créez un conteneur appellé **wordpress** lié au conteneur wordpressdb :+Connectez-vous à mongodb à partir de votre machine hôte :
  
 <code> <code>
-root@debian9:~/wordpress# docker run -e WORDPRESS_DB_PASSWORD=fenestros --name wordpress --link wordpressdb:mysql -p 10.0.2.15:80:80 -v "$PWD/html":/var/www/html -d wordpress +root@debian9:~/mongodb# docker inspect mongo2 | grep IP 
-Unable to find image 'wordpress:latest' locally +            "LinkLocalIPv6Address": "", 
-latestPulling from library/wordpress +            "LinkLocalIPv6PrefixLen": 0
-2a72cbf407d6Pull complete  +            "SecondaryIPAddresses"null, 
-273cd543cb15Pull complete  +            "SecondaryIPv6Addresses"null, 
-ec5ac8875de7Pull complete  +            "GlobalIPv6Address": "", 
-9106e19b56c1Pull complete  +            "GlobalIPv6PrefixLen"0, 
-ee2f70ac7c7dPull complete  +            "IPAddress""172.17.0.4", 
-7257ad6985e8Pull complete  +            "IPPrefixLen"16, 
-18f5c2055da2Pull complete  +            "IPv6Gateway""", 
-85293a6fdd80Pull complete  +                    "IPAMConfig"null, 
-9e797eeb0c14Pull complete  +                    "IPAddress""172.17.0.4", 
-f16178842884Pull complete  +                    "IPPrefixLen"16, 
-13899c06d3f8Pull complete  +                    "IPv6Gateway""", 
-70c27fe4c3c5Pull complete  +                    "GlobalIPv6Address""", 
-d32c8ad2d9d7Pull complete  +                    "GlobalIPv6PrefixLen"0, 
-07fe445494e6Pull complete  +root@debian9:~/mongodb# 
-63b8de7b32fePull complete  +root@debian9:~/mongodb# mongo --host 172.17.0.4 
-e4b721952e22Pull complete  +MongoDB shell version v4.0.8 
-d9ede6dd6f74Pull complete  +connecting tomongodb://172.17.0.4:27017/?gssapiServiceName=mongodb 
-0af4f74bfd92Pull complete  +Implicit sessionsession { "id" : UUID("3feff8c0-5460-473b-b036-4aee64a314f7") } 
-e4e7c47b969fPull complete  +MongoDB server version4.1.9 
-69aff47f3112Pull complete  +WARNINGshell and server versions do not match 
-Digestsha256:201d004f55669dd2c0884f00fc44145fb0da8cafa465bf22cbaacecaf81138d4 +Server has startup warnings:  
-StatusDownloaded newer image for wordpress:latest +2019-04-09T17:50:12.635+0000 I STORAGE  [initandlisten]  
-9eb2f7fbfbd25307ed2f463c7eb3bef40bfa556174e68750bb76b8d032546129+2019-04-09T17:50:12.636+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 
 +2019-04-09T17:50:12.636+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem 
 +2019-04-09T17:50:13.458+0000 I CONTROL  [initandlisten]  
 +2019-04-09T17:50:13.459+0000 I CONTROL  [initandlisten] ** NOTE: This is a development version (4.1.9) of MongoDB. 
 +2019-04-09T17:50:13.459+0000 I CONTROL  [initandlisten] **       Not recommended for production. 
 +2019-04-09T17:50:13.459+0000 I CONTROL  [initandlisten]  
 +2019-04-09T17:50:13.459+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database. 
 +2019-04-09T17:50:13.459+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted. 
 +2019-04-09T17:50:13.460+0000 I CONTROL  [initandlisten]  
 +--- 
 +Enable MongoDB's free cloud-based monitoring service, which will then receive and display 
 +metrics about your deployment (disk utilization, CPU, operation statistics, etc). 
 + 
 +The monitoring data will be available on a MongoDB website with a unique URL accessible to you 
 +and anyone you share the URL with. MongoDB may use this information to make product 
 +improvements and to suggest MongoDB products and deployment options to you. 
 + 
 +To enable free monitoring, run the following command: db.enableFreeMonitoring() 
 +To permanently disable this reminder, run the following command: db.disableFreeMonitoring() 
 +--- 
 + 
 +> exit 
 +bye 
 +root@debian9:~/mongodb#
 </code> </code>
  
-Vérifiez que le conteneur fonctionne :+Notez que lors de la compilation de l'image finale, une image a été créée lors de chaque instruction dans le fichier Dockerfile sauf en cas d'utilisation d'une image en cache :
  
 <code> <code>
-root@debian9:~/wordpress# docker ps +root@debian9:~/mongodb# docker images -a 
-CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES +REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
-9eb2f7fbfbd2        wordpress           "docker-entrypoint.s…"   minutes ago       Up About a minute   10.0.2.15:80->80/tcp   wordpress +i2tch/mongodb2      latest              12e00099ca8d        5 minutes ago       377MB 
-67831dacf002        mariadb:latest      "docker-entrypoint.s…"   minutes ago       Up 8 minutes        3306/tcp               wordpressdb+<none>              <none>              d5b95e9e63e1        minutes ago       377MB 
 +<none             <none>              4250613adf6a        5 minutes ago       377MB 
 +<none>              <none>              eedfd53da0f8        5 minutes ago       377MB 
 +<none>              <none>              04c2e98927c3        5 minutes ago       377MB 
 +<none>              <none>              c6eae79e3d22        7 minutes ago       110MB 
 +<none>              <none>              c205179d538c        7 minutes ago       110MB 
 +<none>              <none>              b70835bebe35        7 minutes ago       110MB 
 +<none>              <none>              5b2827910929        7 minutes ago       110MB 
 +<none>              <none>              5b1f6df94d98        7 minutes ago       110MB 
 +<none>              <none>              a950a5d04b68        7 minutes ago       110MB 
 +<none>              <none>              c183cfecc5f0        7 minutes ago       110MB 
 +<none>              <none>              aadb5806f1b8        8 minutes ago       110MB 
 +<none>              <none>              8d538d38407e        8 minutes ago       110MB 
 +<none>              <none>              32d59bf23987        8 minutes ago       110MB 
 +i2tch/mongodb1      latest              3bf216d921d6        15 minutes ago      96.2MB 
 +<none>              <none>              038e7de870b7        15 minutes ago      96.2MB 
 +<none>              <none>              adc57da1b19f        15 minutes ago      96.2MB 
 +<none>              <none>              f40ac453fa97        15 minutes ago      89.3MB 
 +i2tch/mongodb       latest              eca7835d4fe6        24 minutes ago      1.03GB 
 +<none>              <none>              620057baa411        27 minutes ago      816MB 
 +<none>              <none>              67afc80e1424        33 minutes ago      816MB 
 +nginx               latest              2bcb04bdb83f        13 days ago         109MB 
 +centos              latest              9f38484d220f        3 weeks ago         202MB 
 +ubuntu              bionic              94e814e2efa8        4 weeks ago         88.9MB 
 +ubuntu              latest              94e814e2efa8        4 weeks ago         88.9MB 
 +hello-world         latest              fce289e99eb9        3 months ago        1.84kB
 </code> </code>
  
-Vérifiez que le Wordpress fonctionne :+=====LAB #2 - Créer un Dockerfile===== 
 + 
 +====2.1 - Création et test du script==== 
 + 
 +Créez un répertoire nommé myDocker :
  
 <code> <code>
-root@debian9:~/wordpresslynx --dump http://10.0.2.15 +root@debian9:~/mongodbmkdir ~/myDocker 
-   [1]WordPress +root@debian9:~/mongodb# cd ~/myDocker 
-   Select a default language [English (United States)________]+root@debian9:~/myDocker#  
 +</code>
  
-   Continue+Créez le fichier myEntrypoint.sh :
  
-References+<code> 
 +root@debian9:~/myDocker# vi myEntrypoint.sh 
 +root@debian9:~/myDocker# cat myEntrypoint.sh  
 +#!/bin/bash 
 +if [ -z "$myVariable" ]; then 
 + echo "La variable myVariable doit être renseignée" 
 + return 1 
 +fi
  
-   1. https://wordpress.org/+while true; 
 +do 
 + echo $\($(date +%H:%M:%S)\); 
 + sleep "$myVariable"; 
 +done 
 +</code>
  
-root@debian9:~/wordpress# docker inspect wordpress | grep IPAddress +Testez ce script :
-            "SecondaryIPAddresses": null, +
-            "IPAddress": "172.17.0.3", +
-                    "IPAddress": "172.17.0.3", +
-                     +
-root@debian9:~/wordpress# lynx --dump http://172.17.0.3 +
-   [1]WordPress +
-   Select a default language [English (United States)________]+
  
-   Continue+<code> 
 +root@debian9:~/myDocker# myVariable=3 . ./myEntrypoint.sh salut 
 +salut (20:04:39) 
 +salut (20:04:42) 
 +salut (20:04:45) 
 +salut (20:04:48) 
 +salut (20:04:51) 
 +^C 
 +root@debian9:~/myDocker#  
 +</code>
  
-References+Rendez ce script exécutable :
  
-   1. https://wordpress.org/+<code> 
 +root@debian9:~/myDocker# chmod u+x myEntrypoint.sh 
 </code> </code>
  
-====Gestion d'une Architecture de Microservices====+Créez maintenant le fichier **Dockerfile** dans le répertoire **~/myDocker** :
  
-Vous allez mettre en place une application simple sous forme de microservices, développé par Docker et appelé **demo-voting-app**,  :+<code> 
 +root@debian9:~/myDocker# vi Dockerfile 
 +root@debian9:~/myDocker# cat Dockerfile 
 +FROM centos:latest 
 +MAINTAINER i2tch "infos@i2tch.eu" 
 +COPY myEntrypoint.sh /entrypoint.sh 
 +ENV myVariable 3 
 +ENTRYPOINT ["/entrypoint.sh"
 +CMD ["mycommand"
 +</code>
  
-{{ :elearning:workbooks:debian:6:avance:app.png?direct&400 |}}+Générez maintenant l'image :
  
-Dans cette application le conteneur **voting-app** permet de voter pour des **chats** ou des **chiens**Cette application tourne sous Python et fournit une interface HTML :+<code> 
 +root@debian9:~/myDocker# docker build -t i2tch/mydocker . 
 +Sending build context to Docker daemon  3.072kB 
 +Step 1/6 : FROM centos:latest 
 + ---> 9f38484d220f 
 +Step 2/6 : MAINTAINER i2tch "infos@i2tch.eu" 
 + ---> Running in 02c700ed04da 
 +Removing intermediate container 02c700ed04da 
 + ---> 4274107d52e2 
 +Step 3/6 : COPY myEntrypoint.sh /entrypoint.sh 
 + ---> 7a3923372768 
 +Step 4/6 : ENV myVariable 3 
 + ---> Running in 3288bf6291ad 
 +Removing intermediate container 3288bf6291ad 
 + ---> 3edb630c1511 
 +Step 5/6 : ENTRYPOINT ["/entrypoint.sh"
 + ---> Running in 8dcba2c41520 
 +Removing intermediate container 8dcba2c41520 
 + ---> 11962052539c 
 +Step 6/6 : CMD ["mycommand"
 + ---> Running in f891fbcfaad0 
 +Removing intermediate container f891fbcfaad0 
 + ---> 7925ba23abb2 
 +Successfully built 7925ba23abb2 
 +Successfully tagged i2tch/mydocker:latest 
 +</code>
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes15.png?direct&800 |}}+Lancez le conteneur :
  
-Lors de la vote, le résultat de celle-ci est stocké dans **Redis** dans une base de données en mémoire. Le résultat est ensuite passé au conteneur **Worker** qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur **db** qui tourne sous PostgreSQL.+<code> 
 +root@debian9:~/myDocker# docker run -it --name myDocker i2tch/mydocker 
 +mycommand (18:07:12) 
 +mycommand (18:07:15) 
 +mycommand (18:07:18) 
 +mycommand (18:07:21) 
 +^Cmycommand (18:07:22) 
 +mycommand (18:07:25) 
 +mycommand (18:07:28) 
 +^P^Q 
 +root@debian9:~/myDocker# 
 +</code>
  
-L'application **result-app** qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :+Constatez que le conteneur est toujours en cours de fonctionnement :
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes16.png?direct&800 |}}+<code> 
 +root@debian9:~/myDocker# docker ps 
 +CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES 
 +140ecfdd80b7        i2tch/mydocker      "/entrypoint.sh myco…"   About a minute ago   Up About a minute                        myDocker 
 +b3380889eb75        i2tch/mongodb2      "docker-entrypoint.s…"   7 minutes ago        Up 7 minutes        27017/tcp            mongo2 
 +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   38 minutes ago       Up 36 minutes                            mongo 
 +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago    Up About an hour    0.0.0.0:81->80/tcp   suspicious_sanderson 
 +root@debian9:~/myDocker# 
 +root@debian9:~/myDocker# docker logs myDocker | tail 
 +mycommand (18:08:25) 
 +mycommand (18:08:28) 
 +mycommand (18:08:31) 
 +mycommand (18:08:34) 
 +mycommand (18:08:37) 
 +mycommand (18:08:40) 
 +mycommand (18:08:43) 
 +mycommand (18:08:46) 
 +mycommand (18:08:49) 
 +mycommand (18:08:52) 
 +</code>
  
-Cette application peut être mise en place sous docker avec les commandes suivantes :+Arrêtez le conteneur :
  
 <code> <code>
-docker run -d --name=redis redis +root@debian9:~/myDocker# docker stop -t 1 myDocker 
-docker run -d --name=db postgres:9.4 +myDocker 
-docker run -d --name=vote -p 5000:80 --link redis:redis dockersamples/examplevotingapp_vote +root@debian9:~/myDocker# docker ps 
-docker run -d --name=result -p 5001:80 --link db:db dockersamples/examplevotingapp_result +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES 
-docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker+b3380889eb75        i2tch/mongodb2      "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        27017/tcp            mongo2 
 +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   40 minutes ago      Up 38 minutes                            mongo 
 +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:81->80/tcp   suspicious_sanderson
 </code> </code>
  
-Cette solution utilise un réseau de type Bridge. Ce type de réseau est limité aux conteneurs d'un hôte unique exécutant Docker. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieur, il faut configurer le mappage de port.+Démarrez le conteneur :
  
 +<code>
 +root@debian9:~/myDocker# docker start myDocker
 +myDocker
 +root@debian9:~/myDocker# docker ps
 +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
 +140ecfdd80b7        i2tch/mydocker      "/entrypoint.sh myco…"   3 minutes ago       Up 10 seconds                            myDocker
 +b3380889eb75        i2tch/mongodb2      "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       27017/tcp            mongo2
 +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   40 minutes ago      Up 38 minutes                            mongo
 +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:81->80/tcp   suspicious_sanderson
 +</code>
  
-=====LAB #8 - Superviser les Conteneurs=====+Mettez le conteneur en pause :
  
-====Les Journaux====+<code> 
 +root@debian9:~/myDocker# docker pause myDocker 
 +myDocker 
 +root@debian9:~/myDocker# docker ps 
 +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                NAMES 
 +140ecfdd80b7        i2tch/mydocker      "/entrypoint.sh myco…"   3 minutes ago       Up 51 seconds (Paused)                        myDocker 
 +b3380889eb75        i2tch/mongodb2      "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes            27017/tcp            mongo2 
 +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   41 minutes ago      Up 39 minutes                                 mongo 
 +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour         0.0.0.0:81->80/tcp   suspicious_sanderson 
 +</code>
  
-Consultez les logs d'un conteneur :+Supprimez la pause :
  
 <code> <code>
-root@debian9:~# docker logs mongo2 +root@debian9:~/myDocker# docker unpause myDocker 
-root@332aa9930f30:/# ip addr +myDocker 
-bash: ip: command not found +root@debian9:~/myDockerdocker ps 
-root@332aa9930f30:/# ip address +CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES 
-bash: ip: command not found +140ecfdd80b7        i2tch/mydocker      "/entrypoint.sh myco…"   4 minutes ago       Up About a minute                        myDocker 
-root@332aa9930f30:/# ifconfig +b3380889eb75        i2tch/mongodb2      "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       27017/tcp            mongo2 
-bash: ifconfig: command not found +d2ddb4f8ca8a        i2tch/mongodb       "bash"                   42 minutes ago      Up 40 minutes                            mongo 
-root@332aa9930f30:/# ls +c080793965de        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:81->80/tcp   suspicious_sanderson
-bin  boot  core  data  dev  docker-entrypoint-initdb.d entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run sbin  selinux  srv  sys  tmp  usr  var +
-root@332aa9930f30:/# which ip +
-root@332aa9930f30:/# which ifconfig +
-root@332aa9930f30:/# docker run -itd --name centos3 --link centos2:alias centos +
-bash: docker: command not found +
-root@332aa9930f30:/# exit +
-exit+
 </code> </code>
  
-====Les Processus====+Lancez maintenant le conteneur avec un paramètre :
  
-Consultez les processus d'un conteneur :+<code> 
 +root@debian9:~/myDocker# docker rm -fv myDocker 
 +myDocker 
 +root@debian9:~/myDocker# docker run -d --name myDocker i2tch/mydocker "Up and Running" 
 +0cf8c8c1bdf4cb05d9852900ecdf171ad9abad0fce29a9f040d5d8436285db65 
 +root@debian9:~/myDocker# docker logs myDocker 
 +Up and Running (18:13:33) 
 +Up and Running (18:13:36) 
 +Up and Running (18:13:39) 
 +Up and Running (18:13:42) 
 +root@debian9:~/myDocker#  
 +</code> 
 + 
 +Changez la valeur de la variable d'environnement **myVariable** :
  
 <code> <code>
-root@debian9:~# docker top centos3 +root@debian9:~/myDocker# docker rm -fv myDocker 
-UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD +myDocker 
-root                31073               31060                                 10:20               pts/0               00:00:00            /bin/bash+root@debian9:~/myDocker# docker run -d --name myDocker --env myVariable=1 i2tch/mydocker 
 +fbbe3b48c63310e37a3bad5fc962361c39c045a107f47980614efd6b2e8d3981 
 +root@debian9:~/myDocker# docker logs myDocker 
 +mycommand (18:14:47) 
 +mycommand (18:14:48) 
 +mycommand (18:14:49) 
 +mycommand (18:14:50) 
 +mycommand (18:14:51) 
 +mycommand (18:14:52) 
 +mycommand (18:14:53) 
 +mycommand (18:14:54) 
 +mycommand (18:14:55) 
 +mycommand (18:14:56) 
 +mycommand (18:14:57) 
 +root@debian9:~/myDocker# 
 </code> </code>
  
-====L'Activité en Continu====+====2.2 - Bonnes Pratiques liées au Cache====
  
-Pour voir l'activité d'un conteneur, utilisez la commande suivante :+===Opérations Non-Idempotentes=== 
 + 
 +Créez un répertoire **bestp** ainsi que le fichier Dockerfile suivant :
  
 <code> <code>
-root@debian9:~# docker stats centos3 +root@debian9:~/myDockercd .. 
-CONTAINER           CPU %               MEM USAGE LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS +root@debian9:~# mkdir bestp 
-centos3             0.00              0B 0B             0.00%               4.37kB 952B       61.4kB 0B         0+root@debian9:~# cd bestp 
 +root@debian9:~/bestp# vi Dockerfile 
 +root@debian9:~/bestp# cat Dockerfile 
 +FROM ubuntu:latest 
 +RUN date +%N > /tmp/moment 
 +ENTRYPOINT ["more"
 +CMD ["/tmp/moment"]
 </code> </code>
  
-=====LAB #9 - Gestion des Ressources=====+Le fichier Dokerfile contient une opération non idempotente.
  
-La gestion de base des ressources allouées à un conteneur peut être réalisée par l'utilisation de deux options :+<WRAP center round important> 
 +**Important** Une opération idempotente est une opération qui aboutit systématiquement au même résultat quand elle est lancée dans le même contexte. 
 +</WRAP>
  
-  * --memory +Compilez l'image :
-  * --cpu-shares+
  
-====Limiter la Mémoire====+<code> 
 +root@debian9:~/bestp# docker build -t testcache . 
 +Sending build context to Docker daemon  2.048kB 
 +Step 1/4 : FROM ubuntu:latest 
 + ---> 94e814e2efa8 
 +Step 2/4 : RUN date +%N > /tmp/moment 
 + ---> Running in 6c8c677c1549 
 +Removing intermediate container 6c8c677c1549 
 + ---> 66c3c88c57bb 
 +Step 3/4 : ENTRYPOINT ["more"
 + ---> Running in e9658e591172 
 +Removing intermediate container e9658e591172 
 + ---> 81cb68241ec9 
 +Step 4/4 : CMD ["/tmp/moment"
 + ---> Running in 48974dc12faa 
 +Removing intermediate container 48974dc12faa 
 + ---> c55a42a18572 
 +Successfully built c55a42a18572 
 +Successfully tagged testcache:latest 
 +root@debian9:~/bestp# 
 +</code>
  
-Par exemple, exécutez un conteneur à partir de l'image nginx avec une limite de la mémoire fixée à 256 Mo :+Exécuter maintenant un premier conteneur à partir de l'image compilée :
  
 <code> <code>
-root@debian9:~# docker run --p 8081:80 --memory="256m" nginx +root@debian9:~/bestp# docker run --name test1 -it testcache 
-fc8ce16b3ec86433662719ca1f710a0588951d4f4abb8d90159b5953f419eef7+369009216
 </code> </code>
  
-Exécutez ensuite la commande **docker stats** pour visualiser la limite de la mémoire :+Supprimez maintenant le conteneur et relancez la compilation de l'image :
  
 <code> <code>
-CONTAINER ID        NAME                CPU %               MEM USAGE LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS +root@debian9:~/bestp# docker rm test1 
-fc8ce16b3ec8        cool_blackwell      0.00%               1.793MiB 256MiB   0.70%               2.45kB 0B         0B 0B             2+test1 
 +root@debian9:~/bestp# docker build -t testcache . 
 +Sending build context to Docker daemon  2.048kB 
 +Step 1/4 : FROM ubuntu:latest 
 + ---> 94e814e2efa8 
 +Step 2/4 : RUN date +%N > /tmp/moment 
 + ---> Using cache 
 + ---> 66c3c88c57bb 
 +Step 3/4 : ENTRYPOINT ["more"
 + ---> Using cache 
 + ---> 81cb68241ec9 
 +Step 4/4 : CMD ["/tmp/moment"
 + ---> Using cache 
 + ---> c55a42a18572 
 +Successfully built c55a42a18572 
 +Successfully tagged testcache:latest 
 +root@debian9:~/bestp#  
 +</code> 
 + 
 +Lancez un conteneur à partir de l'image re-compilée : 
 + 
 +<code> 
 +root@debian9:~/bestp# docker run --name test1 -it testcache 
 +369009216
 </code> </code>
  
 <WRAP center round important> <WRAP center round important>
-**Important** Notez que la limite définie par **--memory** est une taille absolue tandis que la limite définie par **--cpu-shares** est relative.+**Important** Notez que les deux sorties des conteneurs sont identiques malgré le fait que la valeur de la commande date aurait du modifier le résultat obtenu lors de l'exécution du deuxième conteneur. La raison que ceci n'est pas le cas est l'utilisation dans la deuxième compilation du cacheSi cette commande avait été quelque chose de plus importante telle apt-get upgrade, le résultat pourrait être génant !
 </WRAP> </WRAP>
  
------+Pour contourner ce problème, il est possible d'utiliser l'option **--no-cache**. Malheureusement ceci produirait une compilation complète à chaque fois, même pour les opérations idempotentes. Il est donc conseillé de combiner les opérations non-idempotentes avec des opérations idempotentes dans la même ligne de commande afin d'invalider le cache pour cette ligne de commande seulement :
  
-=====ChangeLog=====+<code> 
 +root@debian9:~/bestp# vi Dockerfile  
 +root@debian9:~/bestp# cat Dockerfile  
 +FROM ubuntu:latest 
 +RUN date +%N > /tmp/moment \ 
 +    && echo "V1.1" > /tmp/version 
 +ENTRYPOINT ["more"
 +CMD ["/tmp/moment"
 +</code>
  
-====2020.01====+Supprimez maintenant le conteneur et relancez la compilation de l'image :
  
-Première version de 2020.+<code> 
 +root@debian9:~/bestp# docker rm test1 
 +test1 
 +root@debian9:~/bestp# docker build -t testcache . 
 +Sending build context to Docker daemon  2.048kB 
 +Step 1/4 : FROM ubuntu:latest 
 + ---> 94e814e2efa8 
 +Step 2/4 : RUN date +%N > /tmp/moment     && echo "V1.1" > /tmp/version 
 + ---> Running in 3d2a5cee6ac8 
 +Removing intermediate container 3d2a5cee6ac8 
 + ---> 75d0498a9676 
 +Step 3/4 : ENTRYPOINT ["more"
 + ---> Running in 88c0cec68659 
 +Removing intermediate container 88c0cec68659 
 + ---> 2aee524c8da4 
 +Step 4/4 : CMD ["/tmp/moment"
 + ---> Running in 82d2162bb701 
 +Removing intermediate container 82d2162bb701 
 + ---> a54c4af89994 
 +Successfully built a54c4af89994 
 +Successfully tagged testcache:latest 
 +</code>
  
-====2020.02====+Lancez un conteneur à partir de l'image re-compilée :
  
-  * **Fixed** - Dead Link : **https://docs.docker.com/engine/userguide/containers/dockervolumes/** **https://docs.docker.com/storage/volumes/** dans la section **Gestion Manuelle d'un Volume** du  **LAB #4 - Gestion des Volumes**.+<code> 
 +root@debian9:~/bestp# docker run --name test1 -it testcache 
 +746997174 
 +</code>
  
-  * **Fixed** - Erreur : **docker run -it --name mongo2 --net none i2tch/mongodb2 bash** > **docker run -it --name mongo2 --network none i2tch/mongodb2 bash** dans la section **None** du **LAB #5 - Gestion du Réseau**. 
-   
 ----- -----
-<html> + 
-<div align="center"> +Copyright © 2022 Hugh Norris.
-Copyright © 2020 Hugh NORRIS +
-</div> +
-</html>+
Menu