\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{dim. mars 13 18:01:37 CET 2016}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={docker-run},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Lancer une commande dans un nouveau conteneur},
CreationDate={D:20160313180137},
ModDate={D:20160313180137},
Keywords={docker;containers;lxc}
}}
\begin{document}
 
\begin{center}
{\Huge docker-run }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Lancer une commande dans un nouveau conteneur}
 
\vspace{10mm}
 
\hspace{1mm}  Lance un processus dans un nouveau conteneur, avec son propre système de fichier, son propre réseau, et sa propre arborescence isolée. l'image qui démarre le processus peut définir des défaut qui sont liés au processus qui sera lancé dans le conteneur, le réseau à exposer, et plus, mais docker run donne un contrôle final à l'opérateur ou d'administrateur qui a lancé le conteneur depuis l'image. Pour cette raison, docker run a plus d'options que d'autres commande docker. Si l'image n'est pas déja chargée, elle est téléchargée, et toutse les dépendences, depuis le dépot, de la même manière que docker pull.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge OPTIONS }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -a, --attach=\texttt{[}\texttt{]}]{Attache à STDIN, STDOUT ou STDERR. En mode foreground.}
\item[\hspace{1mm} --add-host=\texttt{[}\texttt{]}]{Ajoute un mappage host-to-IP personnalisé (host:ip). Ajoute une ligne à /etc/hosts. peut être spécifié plusieurs fois.}
\item[\hspace{1mm} --blkio-weight=0]{Poid IO entre 10 et 1000}
\item[\hspace{1mm} --blkio-weight-device=\texttt{[}\texttt{]}]{Poid IO au format DEVICE\_NAME:WEIGHT}
\item[\hspace{1mm} --cpu-shares=0]{Partage CPU}
\item[\hspace{1mm} --cap-add=\texttt{[}\texttt{]}]{Ajouter des capabilities Linux}
\item[\hspace{1mm} --cap-drop=\texttt{[}\texttt{]}]{Supprimer de capabilities Linux}
\item[\hspace{1mm} --cgroup-parent=""]{Chemin des cgroups sous lesquels créer le conteneur. Si le chemin n'est pas absolu, le chemin est relatif aux cgroups du processus init.}
\item[\hspace{1mm} --cidfile=""]{Écrit l'ID de conteneur dans le fichier}
\item[\hspace{1mm} --cpu-period=0]{Limite la période CFS}
\item[\hspace{1mm} --cpuset-cpus=CPUSET-CPUS]{CPU dans lesquels autoriser l'exécution}
\item[\hspace{1mm} --cpuset-mems=""]{Nœuds mémoire autorisés.}
\item[\hspace{1mm} --cpu-quota=0]{Limite le quota CPU CFS}
\item[\hspace{1mm} -d, --detach=true|false]{Lance de conteneur en tâche de fond et affiche l'ID du conteneur. défaut: false}
\item[\hspace{1mm} --detach-keys=""]{Change la séquence de touche pour détacher le conteneur. Défaut: CTRL-p CTRL-q.}
\item[\hspace{1mm} --device=\texttt{[}\texttt{]}]{Un périphérique hôte pour le conteneur (ex --device=/dev/sdc:/dev/xvdc:run)}
\item[\hspace{1mm} --device-read-bps=\texttt{[}\texttt{]}]{Limite le taux de lecture d'un périphérique ( ex --device-read-bps=/dev/sda:1mb)}
\item[\hspace{1mm} --device-read-iops]{Limite le taux de lecture d'un périphérique (ex --device-read-iops=/dev/sda:1000)}
\item[\hspace{1mm} --device-write-bps=\texttt{[}\texttt{]}]{Limite le taux d'écriture d'un périphérique ( ex --device-write-bps=/dev/sda:1mb)}
\item[\hspace{1mm} --device-write-iops]{Limite le taux d'écriture d'un périphérique (ex --device-write-iops=/dev/sda:1000)}
\item[\hspace{1mm} --dns-search=\texttt{[}\texttt{]}]{Définis les domaines de recherche DNS.}
\item[\hspace{1mm} --dns-opt=\texttt{[}\texttt{]}]{Définis les options DNS}
\item[\hspace{1mm} --dns=\texttt{[}\texttt{]}]{Définis les serveurs DNS}
\item[\hspace{1mm} -e, --env=\texttt{[}\texttt{]}]{Définis des variables d'environnement.}
\item[\hspace{1mm} --entrypoint=""]{Remplace l'ENTRYPOINT de l'image}
\item[\hspace{1mm} --env-file=\texttt{[}\texttt{]}]{Line un fichier de variables d'environnements}
\item[\hspace{1mm} --expose=\texttt{[}\texttt{]}]{Expose un port, une une plage de ports informant Docker que le conteneur écoute sur les ports spécifiés. Docker utilise cette information pour interconnecter les conteneurs en utilisant des liens et pour définir la redirection de port dans le système hôte.}
\item[\hspace{1mm} --group-add=\texttt{[}\texttt{]}]{Ajoute des groupes additionnels à lancer}
\item[\hspace{1mm} -h, --hostname=""]{nom d'hôte du conteneur}
\item[\hspace{1mm} -i, --interactive=true|false]{Garde STDIN ouvert même s'il n'est pas attaché. défaut: false}
\item[\hspace{1mm} --ip=""]{Définis l'adresse IPv4 de l'interface du conteneur, uniquement avec --net pour les réseaux utilisateurs}
\item[\hspace{1mm} --ip6=""]{Définis l'adresse IPv6 de l'interface du conteneur, uniquement avec --net pour les réseaux utilisateurs}
\item[\hspace{1mm} --ipc=""]{Créé un espace de nom IPC privé pour le conteneur}
\item[\hspace{1mm} --isolation="default"]{spécifique le type de technologie d'isolation utilisée par les conteneurs}
\item[\hspace{1mm} -l, --label=\texttt{[}\texttt{]}]{Définis les métadonnées du conteneur (ex: --label com.example.key=value)}
\item[\hspace{1mm} --kernel-memory=""]{Limit la mémoire kernel. (0 = illimité)}
\item[\hspace{1mm} --label-file=\texttt{[}\texttt{]}]{Lit un fichier de labels}
\item[\hspace{1mm} --link=\texttt{[}\texttt{]}]{Ajoute un lien vers un autre conteneur sous la forme <nom ou id>:alias.}
\item[\hspace{1mm} --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|none"]{Pilote de logging pour le conteneur. La commande docker logs ne fonctionne que pour les pilotes json-file et journald.}
\item[\hspace{1mm} --log-opt=\texttt{[}\texttt{]}]{options spécifique au pilote de logging}
\item[\hspace{1mm} -m, --memory=""]{Limite mémoire}
\item[\hspace{1mm} --memory-reservation=""]{Limite soft}
\item[\hspace{1mm} --memory-swap="LIMIT"]{Une valeur limite égale à la mémoire plus le swap. Doit être utilisé avec -m.}
\item[\hspace{1mm} --mac-address=""]{L'adresse mac de conteneur}
\item[\hspace{1mm} --name=""]{Assigne un nom au conteneur au format UUID long, UUID court, ou un nom.}
\item[\hspace{1mm} --net="bridge"]{Définis le mode réseau pour le conteneur (bridge, none, container:<name|id>, host, <network-name>|<network-id>}
\item[\hspace{1mm} --net-alias=\texttt{[}\texttt{]}]{ajoute un alias réseau pour le conteneur}
\item[\hspace{1mm} --oom-kill-disable=true|false]{Active ou non le OOM Killer pour le conteneur}
\item[\hspace{1mm} --oom-score-adj=""]{Ajustement OOM de l'hôte pour le conteneur (-1000 à 1000)}
\item[\hspace{1mm} -P, --publish-all=true|false]{Publie tous les ports exposés aux ports aléatoire dans les interfaces de l'hôte. Défaut: false}
\item[\hspace{1mm} -p, --publish=\texttt{[}\texttt{]}]{Publie le port d'un conteneur, ou une plage de port, à l'hôte (Format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort)}
\item[\hspace{1mm} --pid=host]{Définis de mode PID pour le conteneur (host: utilise l'espace de nom PID de l'hôte, non sécurisé)}
\item[\hspace{1mm} --uts=host]{Définis le mode UTS pour le conteneur (host: utilise l'espace de noms UTS dans le conteneur, non sécurisé)}
\item[\hspace{1mm} --privileged=true|false]{Donne des priviléges étendus à ce conteneur. Défaut: false}
\item[\hspace{1mm} --read-only=true|false]{Mounte le système de fichier racine du conteneur en lecture seule.}
\item[\hspace{1mm} --restart="no"]{Stratégie de redémarrage quand le conteneur se termine. (no, on-failure[:max-retry], always, unless-stopped)}
\item[\hspace{1mm} -rm=true|false]{Supprime automatiquement le conteneur quand il se termine. incompatible avec -d. défaut: false}
\item[\hspace{1mm} --security-opt=\texttt{[}\texttt{]}]{Options de sécurité}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} "label:user:USER"]{Définis le label utilisateur pour le conteneur}
\item[\hspace{6mm} "label:role:ROLE"]{Définis le label rôle pour le conteneur}
\item[\hspace{6mm} "label:type:TYPE"]{Définis le label type pour le conteneur}
\item[\hspace{6mm} "label:level:LEVEL"]{Définis le label level pour le conteneur}
\item[\hspace{6mm} "label:disable"]{Désactive le confinement de label pour le conteneur}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} --stop-signal=SIGTERM]{Signal pour stopper un conteneur}
\item[\hspace{1mm} --shm-size=""]{Taille de /dev/shm. format: <number><unit>}
\item[\hspace{1mm} --sig-proxy=true|false]{signaux proxy reçus au processus (mode non-TTY uniquement). SIGCHLD, SIGSTOP, SIGKILL ne sont pas proxifiés. Défaut: true}
\item[\hspace{1mm} --memory-swappiness=""]{Comportement de la memory swappiness du conteneur (0 à 100)}
\item[\hspace{1mm} -t, --tty=true|false]{Alloue un pseudo-TTY. défaut: false}
\item[\hspace{1mm} --tmpfs=\texttt{[}\texttt{]}]{Créé un montage tmpfs}
\item[\hspace{1mm} -u, --user=""]{Définis le username ou l'UID utilisé et optionnellement le group ou GID pour la commande spécifiée}
\item[\hspace{1mm} --ulimit=\texttt{[}\texttt{]}]{Options ulimit}
\item[\hspace{1mm} -v|--volume\texttt{[}=\texttt{[}\texttt{[}HOST-DIR:\texttt{]}CONTAINER-DIR\texttt{[}:OPTIONS\texttt{]}\texttt{]}\texttt{]}]{Créé un montage. avec -v /HOST-DIR:/CONTAINER-DIR, Docker monte /HOST-DIR dans l'hôte dans /CONTAINER-DIR dans le conteneur. Si HOST-DIR est omis, Docker créé un nouveau volume dans l'hôte. par défaut, les montages sont privés (non-visibles dans l'hôte). Peut être spécifié plusieurs fois.}
\item[\hspace{1mm} --volume-driver=""]{Pilote de volume du conteneur. Ce pilote créé les volumes spécifié soit avec l'instruction VOLUME du dockerfile, ou depuis l'option -v.}
\item[\hspace{1mm} --volumes-from=\texttt{[}\texttt{]}]{Monte les volumes depuis les conteneurs spécifiés.}
\item[\hspace{1mm} -w, --workdir=""]{Répertoire de travail dans le conteneur}
\end{description}
 
\vspace{1cm}{\huge Code de sortie }
 
\
 
\hspace{1mm}  Le code de sortie de docker run donne des information sur la raison de l'erreur du conteneur ou pourquoi il s'est terminé.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} 125]{Si l'erreur vient du service Docker lui-même}
\item[\hspace{1mm} 126]{Si la commande dans le conteneur ne peut être lancée}
\item[\hspace{1mm} 127]{Si la commande dans le conteneur ne peut être trouvée}
\item[\hspace{1mm} Autres code]{Contient le code de sortie de la commande}
\end{description}
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} Lancer un conteneur en mode lecture seule: \\
\hspace{1mm} \textbf{docker run --read-only --tmpfs /run --tmpfs /tmp -i -t fedora /bin/bash} \\
\hspace{1mm} Exposer les messages de log du conteneur dans les logs de l'hôte: \\
\hspace{1mm} \textbf{docker run -v /dev/log:/dev/log -i -t fedora /bin/bash} \\
\hspace{1mm} Attacher un ou plusieurs STDIN, STDOUT, STDERR: \\
\hspace{1mm} \textbf{docker run -a stdin -a stdout -i -t fedora /bin/bash} \\
 
\vspace{1cm}{\huge Lier les conteneurs }
 
\
 
\hspace{1mm} Cette section décrit comment lier les conteneur sur le réseau par défaut. La fonctionnalité link permet à plusieurs conteneurs de communiquer entre eux. Par exemple, un conteneur dont Dockerfile a exposé le port 80 peut être lancés comme suit: \\
\hspace{1mm} \textbf{docker run --name=link-test -d -i -t fedora/httpd} \\
\hspace{1mm} Un second conteneur, dans ce cas nommé linker, peut communiquer avec le conteneur httpd: \\
\hspace{1mm} \textbf{docker run -t -i --link=link-test:lt --name=linker fedora /bin/bash} \\
\hspace{1mm} Maintenant le conteneur linker et lié au conteneur link-test avec l'alias lt. Lancer la commande env dans le conteneur linker montre les valiables d'environnement: \\
\hspace{1mm} \textbf{\# env} \\
\hspace{1mm} \textbf{HOSTNAME=668231cb0978} \\
\hspace{1mm} \textbf{TERM=xterm} \\
\hspace{1mm} \textbf{LT\_PORT\_80\_TCP=tcp://172.17.0.3:80} \\
\hspace{1mm} \textbf{LT\_PORT\_80\_TCP\_PORT=80} \\
\hspace{1mm} \textbf{LT\_PORT\_80\_TCP\_PROTO=tcp} \\
\hspace{1mm} \textbf{LT\_PORT=tcp://172.17.0.3:80} \\
\hspace{1mm} \textbf{PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin} \\
\hspace{1mm} \textbf{PWD=/} \\
\hspace{1mm} \textbf{LT\_NAME=/linker/lt} \\
\hspace{1mm} \textbf{SHLVL=1} \\
\hspace{1mm} \textbf{HOME=/} \\
\hspace{1mm} \textbf{LT\_PORT\_80\_TCP\_ADDR=172.17.0.3} \\
\hspace{1mm} \textbf{\_=/usr/bin/env} \\
 
\vspace{1cm}{\huge Mapper les ports pour une utilisation externe }
 
\
 
\hspace{1mm} Le port exposé d'une application peut être mappée sur un port hôte en utilisant le flag -p. Par exemple, le port 80 peut être mappé au port 8080: \\
\hspace{1mm} \textbf{docker run -p 8080:80 -d -i -t fedora/httpd} \\
 
\vspace{1cm}{\huge Créer et monter un volume }
 
\
 
\hspace{1mm} De nombreuses application nécessitent le partage de données persistantes entre de nombreux conteneurs. Docker permet de créer un Data Volume Container que d'autres conteneurs peuvent monter. Par exemple, créer un conteneur qui contient les répertoires /var/volume1 et /tmp/volume2. L'image doit contenir ces répertoires, donc des instructions mkdir sont nécessaires: \\
\hspace{1mm} \textbf{docker run --name=data -v /var/volume1 -v /tmp/volume2 -i -t fedora-data true} \\
\hspace{1mm} \textbf{docker run --volumes-from=data --name=fedora-container1 -i -t fedora bash} \\
\hspace{1mm} Plusieurs --volumes-from vont monter les volumes de données. Et il est possible de monter les volumes qui vient d'un conteneur DATA dans un autre conteneur: \\
\hspace{1mm} \textbf{docker run --volumes-from=fedora-container1 --name=fedora-container2 -i -t fedora bash} \\
 
\vspace{1cm}{\huge Monter des volumes externes }
 
\
 
\hspace{1mm} Pour monter un répertoire hôte comme volume conteneur, spécifier le chemin absolue: \\
\hspace{1mm} \textbf{docker run -v /var/db:/data1 -i -t fedora bash} \\
\hspace{1mm} En utilisant SELinux, vérifier que l'hôte n'a pas connaissance de la stratégie SELinux du conteneur. Dans l'exemple suivant, SELinux est enforced, le répertoire /var/db n'est pas en écriture pour le conteneur. Au moment d'écrire ce man, la commande suivante doit être lancée pour que la stratégie SELinux soit attachée correctement au répertoire de l'hôte. \\
\hspace{1mm} \textbf{chcon -Rt svirt\_sandbox\_file\_t /var/db} \\
 
\vspace{1cm}{\huge Utiliser un labeling de sécurité alternatif }
 
\
 
\hspace{1mm} --security-opt permet de changer le schéma de labelisation par défaut pour chaque conteneur. Par exemple, on peut spécifier un niveau NCS/MLS. Spécifier le niveaux dans la commande suivante permet de partager le même contenu entre les conteneurs: \\
\hspace{1mm} \textbf{docker run --security-opt label:level:s0:c100,c200 -i -t fedora bash} \\
\hspace{1mm} Un exemple MLS peut être: \\
\hspace{1mm} \textbf{docker run --security-opt label:level:TopSecret -i -t rhel7 bash} \\
\hspace{1mm} Pour désactiver le labeling de sécurité pour ce conteneur: \\
\hspace{1mm} \textbf{docker run --security-opt label:disable -i -t fedora bash} \\
\hspace{1mm} Pour resserrer la stratégie de sécurité sur les processus dans un conteneur: \\
\hspace{1mm} \textbf{docker run --security-opt label:type:svirt\_apache\_t -i -t centos bash} \\
\end{flushleft}
\end{document}
