docker Supporting tagline
Installation
premiere installation
Sur mac, il faut un VM pour avoir un linux, donc j’installe virtualBox :
brew cask install virtualbox
Ensuite, pour creer et communiquer facilement (ligne de commande) avec la VMs qui exécutera mes containeur docker, j’installe boot2docker
brew install boot2docker
puis, je créer ma VM
boot2docker init
et je declare les variables d’environements qui vont bien :
$ eval "$(boot2docker shellinit)"
ma VM se trouve sous :
<HOME>/VirtualBox VMs/boot2docker-vm
.
Elle contient notament toutes les images docker, donc ‘gaffe!!
boot2docker ip
: affiche l’IP de la VM
Voir l’installation pour Mac sur le site docker.
ensuite
$ boot2docker start
.....
$ eval "$(boot2docker shellinit)"
si problème:
boot2docker delete
boot2docker -v init
Eléments principaux de docker
Images Docker
Une image docker est un ensemble de fichiers.
Il existe des images de bases (busybox, ubuntu, debian, …) sur lesquelles nous pouvons construire nos propres images.
Les images sont construites en couches.
Chaque couche ammenant une modification (diff) à la précédente couche.
L’historique d’une image montre les étapes succesives de construction d’une image.
Les images appartiennent à un namespace.
Il y a 3 namespaces :
- Root : pour les images officielles (publiées par Docker-Inc). Elles servent d’image de base pour nos propres images.
Elles sont disponibles dans sur Docker Hub.
ubuntu
(par exemple)
- User: Ces images sont disponibles sur Docker Hub.
Par exemple l’image:
jdantan/java-8
correspond à l’imagejava-8
de l’utilisateurjdantan
.
- Self-hosted : Ces images ne sont pas hébergées sur Docker Hub. Elles sont hébergées soit en local, soit sur un dépot autre que Docker Hub et peuvent être publiques ou privées.
L’image :
localhost:5000/my-private-image
est hébergée surlocalhost
et accessible via le port5000
.
Son nom étantmy-private-image
Quelques commandes
docker images
: affiche les images présentes sur ma machine.
docker pull <image-name>
: charge une image depuis un dépot.
Tags
Les images peuvent (devraient toujours) avoir des tags associés. Ils permettent généralement de préciser une version :
ubuntu:12.04.5
ubuntu:14.04.2
ubuntu:latest
....
sont des exemples de version différente de l’image ubuntu.
Conteneur
Les images docker contiennent les informations décrivant un container. Ce sont des templates.
Les conteneurs sont des processus basés sur des images, ou si on peut dire, un conteneur « contient » des processus s’éxécutant « sur » une image.
Les conteneurs n’ont d’existances qu’au runtime (et sont dans des états tels que : en cours d’exécution, stoppés, …).
Les conteneurs sont démarrer avec la commande docker run ...
(voir ici).
Dockerfiles
les dockerfiles contiennent le serie de commandes ayant été utilisées pour construire une image docker.
Docker engine
le Docker engine est le composant de ocker gérant les conteneur (au runtime ?) sur notre machine.
Docker Hub
Docker Hub est un site internet servant de dépot publique pour de nombreuses images docker.
aprés la 1ere connexion réussie (
docker login
), le fichier de configuration~/.dockercfg
est créer dans le repertoire Home.
Ce fichier contient les informations d’authentification du compte utilisateur sur dockerhub (par exemple https://hub.docker.com/u/jdantan/ en ce qui me concerne), et doit être protégé.
Demarrer un conteneur docker
Syntaxe
docker run [options] image [command][arg ...]
exemples:
docker run busybox echo "hello world"
Démarre un conteneur avec l’image busybox et execute « sur » cette image le processus echo
.
Options
docker run -help
ou
docker run -h
permet d’afficher la liste des options disponibles.
-p
: mapping d’un port du conteneur sur la machine hôte.
-d
: exécute le conteneur en arrière-plan.
-i
: exécution en mode intéractif.
-i -t
: avec pseudo-terminal ( ou -it
en raccourci).
exit
pour quitter le conteneur en mode interactif.
--name=" ..."
: assigne le nom (entre guillemets) au conteneur qu’on démarre.
il est possible de voir les process docker en effectuant un :
docker ps
: affiche les process en cours d’exécution.docker ps -a
: affiche les process terminés et en cours d’exécution.docker ps -q
: n’affiche que l’ID des conteneurs - trés utile dans le scripts sh.
docker commandes
-
docker start [ID / Name]
: Démarre un conteneur existant et arreté L’ID/Name est nécessaire si le serveur s’exécutait en arrière-plan. -
docker attach [ID / Name]
: permet de s’attacher à un conteneur s’exécutant en arrière plan.
Shortcut:
docker start - a [ID / Name]
démarre et s’attache à un conteneur.
-
<CTRL +p> <CTRL + q>
: permet de se détacher d’un conteneur. -
docker stop [ID / Name]
: arrete un conteneur $running*.
L’ID/Name est nécessaire si le serveur s’exécutait en arrière-plan. -
docker rm [-f] [ID / Name]
: détruit/supprime un conteneur.
L’ID/Name est nécessaire si le serveur s’exécutait en arrière-plan.-f
est nécessaire si le serveur est démarré. -
docker log [name]
: affiche les logs du conteneur name lancer en mode détaché. -
docker diff [name]
: affiche les modification effectuées sur le conteneur name depuis son lancement. -
docker cp
: copie des fichier du conteneur vers la machine hôte. -
docker inspect
: affiche des (tonnes) d’informations à propos d’un conteneur.
docker inspect --format=‘’
: permet de n’afficher que certaines valeurs du JSON retourné par la commande inspect. -
docker command $(docker command)
: chainage de commandes
Construire ses images Docker
Dockerfile & « docker build »
-
un Dockerfile contient la définition d’une image.
Il s’agit d’une serie d’intructions indiquant à Docker comment construire l’image. -
la commande
docker build
construit une image à partir d’un Dockerfile.
Syntaxe Dockerfile
# This is a comment
FROM ubuntu:14.04
MAINTAINER Jane miceli <jane@janemiceli.com>
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container ' \
> /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
EXPOSE 80
FROM
: image de dépard de notre image. Doit être la première instruction. L’instructionFROM
marque le début d’une nouvelle image.
MAINTAINER
: qui à créé/s’occupe de cette image (optionnel - mais fortement recommandé).
RUN
: chaque RUN exécute une commande nécessaire à la création de notre image et enregistre les changement (équivalent d’un commit Git). RUN sert à installer des packages, libraries, différents fichiers, … mais ne lance pas de proccessus.
CMD
: commande exécutée par défaut lors du lancement d’un conteneur. 1 seule instance par Dockerfile.
CMD existe sous 2 formes :CMD nginx -g "deamon off;"
: qui s’execute dans le shell.CMD ["nginx","-g","daemon off;"]
: qui s’execute directement, sans traitement du shell.
CMD peut être définie ou surchargée directement en ligne de commande :
docker run ... nginx -g "deamon off;"
ENTRYPOINT
: commeCMD
mais en concatenant les argument passés en ligne de commande à la commande définit par ENTRYPOINT. ENTRYPOINT peut être défini directement en ligne de commande :
docker run --entrypoint nginx .... -g "deamon off;"
EXPOSE
: liste des ports public à ouvrir au lancement du conteneur.
Un port public est accessible à l’intérieur et à l’extérieur du conteneur alors qu’un port privé n’est accessible qu’à l’intérieur du conteneur.
docker run -P ...
ouvre aussi un port, même si le port n’est pas exposé dans le Dockerfile.
Autres instructions utiles
-
ADD
: permet d’ajouter des fichiers/répertoires de la machine hote dans l’image.-
ADD /src/webapp /opt/webapp
:
ajoute le contenu de/src/webapp
dans le répertoire/opt/webapp
de l’image. -
L’instruction ADD peut aussi ajouter des fichiers distants :
ADD http://www.example.com/webapp /opt/
-
-
VOLUME
: monte un répertoire interne d’un conteneur.
à compléter. -
WORKDIR
: définit le repértoire de travail pour les instructions suivantes du Dockerfile.
à compléter. -
ENV
: permet de définir des variables d’environement, disponibles dans tous les conteneurs créer à partir de cette image.
ENV WEBAPP_PORT=8080
docker run -e ...
permet aussi de définir des variables d’environement directement en ligne de commande :
docker run -e WEBAPP_PORT=8080 -e WEBAPP_HOST=www.example.com ...
-
USER
: à compléter. -
ONBUILD
: à compléter.
Construire l’image
docker build -t web .
- le « t » tag l’image construite.
- le « . » définit l’endroit où se trouve le Dockerfile (ici le repertoire courant).
ou:
docker build -t web https://github.com/docker-training/staticweb.git
- si le Dockerfile est sur Github par exemple.
Version
Il est possible d’ajouter un numéro de version lors de la construction d’une image :docker build -t web:0.3.2 .
L’image construite se trouve alors dans notre repository local.
Réseau
Exécutons la commande suivante (demarrant un serveu web):
$ docker run -d -p 80 training/webapp python -m SimpleHTTPServer 80
dfeeb1192993b6489fafc85e04f066df7bc7b87170dd5e536fae29e7fc3f8103
$
Trouver les ports
Pour avoir le port sur la machine hôte correspondant au port 80 du conteneur, faire:
$ docker ps
CONTAINER ID ... PORTS NAMES
dfeeb1192993 5000/tcp, 0.0.0.0:49153->80/tcp pensive_kowalevski
ou
$ docker port dfeeb1 80
0.0.0.0:49153
ou (qui ne marche pas chez moi !!):
$ docker inspect -f "" dfeeb1
map[80/tcp:[map[HostIp: HostPort:]]]`
Pour accéder au serveur web, il suffit d’aller à l’adresse:
http://192.168.59.103:49153/.
192.168.59.103 étant l’IP de la VM boot2docker dans laquelle tourne docker sur mon mac.
Forcer le numéro de port
$ docker run -d -p 8080:80 training/webapp python -m SimpleHTTPServer 80
99ba0cd1fbb6cfb23b144b298b4e9a6abf8a9a9e279bffc29b87202984646177
$
avec -p 8080:80
je peux accéder au serveur à ’adresse:
http://192.168.59.103:8080/.
En forçant le numéro de port sur la machine hôte, je ne peux lancer qu’un seul conteneur - sinon, il y aurait un conflit entre les conteneurs accedant au même port.
…Cannot start container 406088f…: Bind for 0.0.0.0:80 failed: port is already allocated
Trouver l’adresse IP d’un conteneur
$ docker inspect -f "" dfeeb1
172.17.0.17
je peux ping-er mon conteneur :
$ ping 172.17.0.17
PING 172.17.0.17 (172.17.0.17): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Et ça ne marche pas car je suis sur Mac (avec la VM boot2Docker)!!
Travailler avec des volumes
Les volumes sont des répertoires spéciaux à l’intérieur des conteneurs.
Particularités des volumes
- performances I/O natives.
- le contenu des volumes n’est pas commité dans les images.
Déclarer un volume
dans le fichier Dockerfile
VOLUME /var/lib/postgresql
en ligne de commande avec -v path_in_container
:
$ docker run -d -v /var/lib/postgresql trainning/postgresql
Ici, c’est docker qui décide quel répertoire de la machine host correspondra au répertoire
/var/lib/postgresql
du conteneur.
Si on écrit -v path_in_host:path_in_container
$ docker run -d -v /database/postgresql:/var/lib/postgresql trainning/postgresql
on spécifie explicitement le répertoire de la machine host correspondant au volume.
Volume en lecture seule
il suffit d’ajouter :ro
(comme read-only) à la fin de la déclaration:
$ docker run -d -v /data/public:ro jdantan/mylicious
Partage de volume entre conteneurs
--volumes-from [ID / Name]
où ID / Name est l’identifiant du conteneur ayant créé le(s) volume(s).
Les volumes existent indépendament des conteneurs.
Donc même si le conteneur ayant créé les volumes est arrété ou détruit, les autres conteneurs continue à accéder aux volumes partagés.
Conteneurs de données (Data container)
Leur seule fonction est de référencer des volumes
$ docker run --name myData -v /var/lib/data busybox true
busybox true
ne sert à rien, si ce n’est à avoir une syntaxe correcte pour démarrer un conteneur. On peut passer une autre commande, mais celle si à l’avantage d’être extremement « petite ».
Ces conteneurs de données sont utilisés ensuite par d’autre conteneurs en utilisant le paramètre --volumes-from [ID / Name]
.