Utiliser Docker sous Debian

From Tuxunix
Jump to: navigation, search

Test effecuté sur Debian 7

Docker3.jpg

Pré-requis

  • un noyau récent (>= 3.8)

Install Kernel from wheezy-backports (source Docker doc) Add the following line to your /etc/apt/sources.list

deb http://http.debian.net/debian wheezy-backports main

then install the linux-image-amd64 package (note the use of -t wheezy-backports)

$ apt-get update
$ apt-get install -t wheezy-backports linux-image-amd64

Installation

Install Docker using the get.docker.com script:

curl -sSL https://get.docker.com/ | sh
  • Prendre une Debian sur le dépôt officiel de Docker :
#> docker pull debian
  • Lister les images disponibles sur le registre :
#> docker search debian
#> docker search mysql
  • Liste des images importés en local et dispo :
#> docker images (--all)
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
committest          latest              5198d48cd1b8        24 hours ago        85.01 MB
mysql               latest              0beee7f478c8        3 weeks ago         282.8 MB
debian              latest              c90d655b99b2        5 weeks ago         85.01 MB
  • Se connecter dessus
#> docker run -h nomConteneur  -i -t debian /bin/bash
  • Information sur les derniers changement de l'image :
#> docker history nomImage

Commandes utiles

Démarrer

Démarrer un conteneur :

#> docker start cranky_poitras

TTY (terminal)

Entrer dans le terminal du conteneur :

#> docker attach cranky_poitras

ou

#> docker exec -i -t cranky_poitras bash

Sortir du conteneur sans arreter celui-ci

#> ^P^Q (Ctrl+p+Ctrl+q)

Creer image

Creer une image :

#> docker commit 9f36d4fab32f demo/lamp1

Les conteneurs sont mis en pause quand un commit est lancé, pour éviter cela "docker commit --pause=false <container_id>".

Arrêt

Arreter un conteneur :

#> docker stop cranky_poitras

Suppression

Suppression :

#> docker rm    ->    Remove one or more containers
#> docker rmi    ->   Remove one or more images

Renommer

#> docker rename XXxxXXxxxXX testChangeNamev1

Surveillance

  • Liste les conteneurs en marche
#> docker ps
  • Liste tous les conteneurs
#> docker ps -a
  • Affiche l'entrée standard du conteneur
#> docker logs
  • Affiche les consommations temps réél du containeur (CPU/MEM/NET)
#> docker stats NOMCONTAINER
CONTAINER           CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
XxxxxxxXXXxX        0.00%               0 B/1.963 GiB       0.00%               1.986 KiB/648 B

Information générale

#> root@saf-dckr-1:~# docker -D info
Containers: 3
Images: 4
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 10
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 4
Total Memory: 1.963 GiB
Name: saf-dckr-1
ID: FF63:UP7J:JE6J:M3ZX:NZGB:X6GV:PS6P:MP77:OHDH:A6CW:6IOR:O752
Debug mode (server): false
Debug mode (client): true
Fds: 19
Goroutines: 22
EventsListeners: 0
Init Path: /usr/bin/docker
Docker Root Dir: /var/lib/docker
WARNING: No memory limit support
WARNING: No swap limit support

Affiche les informations de configuration d'un conteneur ou images :

#> docker inspect XxxxxxXXxxxXX
[{
   "AppArmorProfile": "",
   "Args": [],
   "Config": {
       "AttachStderr": true,
       "AttachStdin": false,
       "AttachStdout": true,
       "Cmd": [
           "/bin/bash"
       ],
       "CpuShares": 0,
       "Cpuset": "",
       "Domainname": "",
       "Entrypoint": null,
       "Env": [
           "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
       ],

Configuration des conteneurs

Ressources

  • Limite des ressources (m => memory/c => cpu):
#> docker run -h nomConteneur -m 1g -c 2 nomImage

Configuration Réseau

Fonctionnement par defaut

  • docker-proxy : permet de faire du NAT/PAT entre la machine hôte et les conteneurs (gestion automatique par docker).

L'interface réseau docker0 est créé à l'installation de docker, elle permet la communicatin avec les interfaces réseau des conteneurs nommé "vethXXXX" (lorsque le conteneur est démarré).

  • A savoir :

Docker choisit au hasard une adresse et sous-réseau de la gamme privé (défini par le RFC 1918) qui ne sont pas en cours d'utilisation sur la machine hôte comme cette plage : 172.17.42.1/16, ce qui fait : 65 534 adresses de la machine hôte et de ses conteneurs.

L'adresse MAC est généré en utilisant l'adresse IP attribuée au récipient pour éviter les collisions ARP, en utilisant une gamme de 02:42:ac:11:00:00-02:42:ac:11:FF:FF.


Affecter une IP public a un containeur

Pour affecter une IP publique à un containeur, nous allons utiliser le mode "host" de docker, il faut donc en prérequis bridger une interface par ex : "eth1".

ATTENTION ce mode impose qu'un service écoute sur une seule IP uniquement ! (attention donc au configuration par defaut apache/mysql etc..., il faut modifier le bind pour chaque service afin que le service écoute uniquement sur l'IP attribué pour le containeur)

  • Mode bridge interface et docker :
#> apt-get install bridge-utils
#> brctl addbr br0
#> brctl addif br0 eth1
#> brctl show
root@saf-dckr-2:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.005056a974af       no              eth1
docker0         8000.56847afe9799       no              veth602075d
#> vi /etc/network/interface
auto eth1
iface eth1 inet static

# bridge for the docker containers network to connect to main
auto br0
iface br0 inet static
       address X.X.X.X
       netmask X.X.X.X
       network X.X.X.X
       broadcast X.X.X.X
       gateway X.X.X.X
       # dns-* options are implemented by the resolvconf package, if installed
       dns-nameservers 8.8.8.8
       bridge_ports eth1
       bridge_stp off
       bridge_fd 0
       bridge_maxwait 0
#> ifup br0
  • Configuration container :
#> docker run -h nomConteneur -i --net=host -e PUBLIC_IP_ADDR=X.X.X.X -t debian /bin/bash
#> echo "testIPpublic" >/etc/hostname
#> echo "nameserver 8.8.8.8" > /etc/resolv.conf
#> echo "X.X.X.X testIPpublic" >>/etc/hosts

Conteneur avec SSH

#> docker run -h nomConteneur -p 2222:22 -t -i testsshv1
#> ssh root@localhost -p 2222
root@localhost's password:
Linux minas-morgul 3.16.5-gentoo #1 SMP Fri Oct 24 15:50:40 PDT 2014 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright. 

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Mar  9 17:29:25 2015 from 172.17.42.1

Manipuler des conteneurs

Exporter/Importer

  • Exporter un conteneur :
#> docker export sisi_panda > conteneurLAMP.tar

Ou

#> docker save test > conteneurSave.tar
  • Importer un conteneur (depuis un fichier local) :
#> cat conteneurLAMP.tar | sudo docker import - exampleimagelocal:new

Ou

#> docker load test < conteneurSave.tar

Docker avec une interface web

Une image appelé dockerUI permet d'avoir une interface web pour l'administration de conteneur. Attention les fonctionnalités sont très basique, et c'est plutot utile pour de la supervision.

Télécharger l'image et l'installer

#> docker pull dockerui/dockerui

Démarrer le conteneur

#> docker run -h nomConteneur -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock dockerui/dockerui -e /docker.sock

Accès par un navigateur

http://hostname:9000

DockerUI.jpg

Créer son registre Docker (privé)

Le conteneur existe déjà dans la liste des images dispo!

#> docker pull registry

Lancer registry :

- Version : ex simple

#> docker run -h nomConteneur -d -p 5000:5000 registry

- Version : ex avancée

#> docker run \
        -d \
        -h nomConteneur \
        -e PUBLIC_IP_ADDR=X.X.X.X \
        -e SETTINGS_FLAVOR=s3 \
        -e AWS_BUCKET=mybucket \
        -e STORAGE_PATH=/registry \
        -e AWS_KEY=myawskey \
        -e AWS_SECRET=myawssecret \
        -e SEARCH_BACKEND=sqlalchemy \
        -p 5000:5000 \
        registry

Il y a une version (voir plusieurs) UI :

#> docker pull atcol/docker-registry-ui && docker run -p 8080:8080 atcol/docker-registry-ui

Pousser l'image vers notre dépôt

Pré-requis

Machine ou ce trouve les conteneurs !!

  • Ajouter le nouveau "registry" auprès de docker.
#> docker login -u mybucket -p myawskey localhost:5000
  • Tagger notre image vers le nouveau registre, sinon le push enverra par défaut au dépot officiel.
#> docker tag testsshv1:latest registry_host:5000/testsshv1

Pousser l'image

#> docker push registry_host:5000/testsshv1

Lister les images de notre registre

#> docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry_host:5000/testsshv1      latest              3fc9c0ad281e        21 hours ago        120.5 MB

Creer un conteneur (packagé)

Fichier (le nom par defaut est dockerfile), ici nous l'avons appelé "dockerfileLAMP" :

# LAMP
# Pour Debian Wheezy
#
# VERSION 0.0.1
#

FROM debian:wheezy
MAINTAINER Pierrot "mail@mail.fr"

ENV DEBIAN_FRONTEND interactive

#ENTRYPOINT

# Depots, mises a jour et installs de Apache/PHP5
RUN echo "deb http://ftp.debian.net/debian/ wheezy main"> /etc/apt/sources.list
RUN echo "nameserver 8.8.8.8"> /etc/resolv.conf
RUN echo "testautodeployconteneur"> /etc/hostname
RUN (apt-get clean && apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove)
RUN apt-get install -y vim ssh apache2 libapache2-mod-php5 php5-cli php5-mysql
RUN apt-get update && apt-get install -y mysql-server
#RUN service mysql start
#RUN mysql -v -uroot -e 'UPDATE user SET host = "%" WHERE user = "root"  LIMIT 1; DELETE FROM user WHERE user = "root"  AND host != "%" ' mysql
#RUN service mysql stop

# Config de Apache

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

RUN echo "NameVirtualHost IPFIXE:80 \
Listen IPFIXE:80 \
\
<IfModule mod_ssl.c> \
   Listen IPFIXE:443  \
</IfModule> \
\
<IfModule mod_gnutls.c> \
   Listen IPFIXE:443 \
</IfModule>" > /etc/apache2/ports.conf

 
EXPOSE 80 22
# EXPOSE 3306

CMD [ "/bin/bash"]
  • Créer le conteneur :
#> docker build -f dockerfileLAMP -t testautodeployconteneur .
  • Le démarrer avec les paramètres IP fixe :
#> docker run -i --net=host -e PUBLIC_IP_ADDR=IPFIXE -t testautodeployconteneur /bin/bash