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.
image layers

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’image java-8 de l’utilisateur jdantan .

  • 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 sur localhost et accessible via le port 5000.
Son nom étant my-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’instruction FROM 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: comme CMD 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]

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].

Connexion entre conteneurs



Published

11 April 2015

Tags