docker
Docker est un projet open source qui automatise le déploiement d'applications dans des conteneurs logiciels.
Docker a été développé comme un projet interne de dotCloud par Solomon Hykes (Politech Lyon !).
- images Docker : https://hub.docker.com/explore/
- Commandes en vrac :
#recherche d'image centos, fedora docker search centos ... ... docker search fedora #telechargement de l'image nommée centos docker pull centos #execution d'un bash dans l'image précédemment chargé sudo docker run -i -t centos /bin/bash #exec d'une commande dans un container docker exec -it puppetSystem cat /etc/puppetlabs/puppet/puppet.conf docker exec -it puppetAppli ls -l /etc/puppetlabs/puppet docker exec -it puppetSystem \ "/var/lib/puppet/puppet-enc/puppet_enc.py -c /etc/puppetlabs/puppet/puppet-enc-system.ini -n pv5srv195008" #si modif faite sur l'image centos, on peut sauvegarder les changements (bof, bof...) docker commit xxxxxx centos #bricolage sur un containeur #lancer et recuperer id containeur ID1=$(docker run -d centos /bin/bash) #log du containeur docker logs $ID1 #arret containeur docker stop $ID1 #voir les containeurs qui tournent docker ps docker ps -a # activité d'un conteneur docker top mynginx # @ip d'un conteneur docker inspect --format "{{.NetworkSettings.IPAddress}}" # suppression containeur docker rm $ID1 docker rm id_a_rallonge #plus dangereux docker rm $(docker ps -a -q) #gestion des images - liste des images docker images docker images -a - suppression docker rmi id docker rmi nom_image #copie fichier d'un container vers mon serveur - container : docker-nginx - fic source : /etc/nginx/conf.d/default.conf - fic dest : default.conf docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
- Lancement d'un serveur Nginx (depuis image docker.io/nginx) :
docker run --name mynginx \ -v ~/documents/docker/cornilyon.fr:/var/www/cornilyon.fr:ro \ #-v : partage de repertoire -v ~/documents/docker/nginx:/etc/nginx \ -v ~/documents/docker/letsencrypt:/etc/letsencrypt \ -P -d docker.io/nginx # -P : mappage automagique des ports (80 et 443) #Connexion sur un container en cours d'execution docker exec -it mynginx /bin/bash
Ps : on peut préciser le mappage de port . Ex : -p 80:80 ou -p 8080:80 ...
- Partage de repertoire (html) avec un container nginx :
source : https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04
- repertoire source (sur mon serveur) : home/xxx/documents/docker/html
- repertoire dest (dans le container) : /usr/share/nginx/html
-
creation du container <docker-nginx> avec ouverture port 80 et partage du repertoire html
sudo docker run --name docker-nginx -p 80:80 -d \ -v /home/xxx/documents/docker/html:/usr/share/nginx/html nginx
Nb : il est obligatoire de positionner les bons droits selinux sur le repertoire d'origine ( proprietaire du repertoire : httpd_sys_content_t
chcon -Rt httpd_sys_content_t html/
- Partage de volume :
-
volume 'host:conteneur':
sudo docker run --name docker-nginx -p 80:80 -d \ -v /home/xxx/documents/docker/html:/usr/share/nginx/html \ -v ~/documents:/var/documents nginx
Nb : une maj dans le repertoire /home/xxx/documents/docker/html est automagiquement dispo dans le container.
-
volume “conteneur:conteneur” :
source : https://www.metal3d.org/ticket/docker-arretez-d-utiliser-des-conteneurs-data-only
Une image va definir un volume qui pourra être montée dans d'autres conteneurs.-
création à partir d'une image qui contiendra un volume
#fichier Dockerfile FROM alpine # on déclare un volume VOLUME /opt/data # pas la peine le de le laisser tourner # les volumes sont accessibles même # quand le conteneur ne tourne plus CMD ["true"]
-
création/démarrrage de l'image
# création à l'emplacement du fic Dockerfile docker build -t dataexample . # lancement du container depuis l'image docker run -it -d --name mydata dataexample
-
utilisation du volume dans un nouveau conteneur
docker run --rm -it --volumes-from mydata alpine sh > touch /opt/data/foo > exit
-
nouveau conteneur utilisant aussi le volume définit ci-dessus :
docker run --rm -it --volumes-from data alpine sh > ls /opt/data > foo
-
- Création de volume :
Ps : les données copiées dans le local seront disponibles dans le/les conteneur(s)
# création du volume var_www en local docker volume create --name var_www # utilisation du volume dans un conteneur docker run --rm -it -v var_www:/var/www nginx # volume local docker volume inspect var_www [ { "Name": "var_www", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/var_www/_data" } ] # lancement de nginx avec mes repertoires de config docker run -it -v var_www:/var/www -v etc_nginx:/etc/nginx -v etc_letsencrypt:/etc/letsencrypt --name mynginx -P -d nginx Attention : - etc_nginx alimenté par 'cp -r nginx/* /var/lib/docker/volumes/etc_www/_data' (sinon on ecrase pas le /etc/nginx du conteneur) - etc_letsencrypt : pareil (sinon on obtient /etc/letsencrypt/letsencrypt sur le conteneur) - var_cornilyon.fr peut etre copié entierement car il n'existe pas sur le conteneur 'cp -rp cornilyon.fr /var/lib/docker/volumes/var_www/_data' [root@paulo volumes]# tree -L 3 /var/lib/docker/volumes/ /var/lib/docker/volumes/ ├── etc_letsencrypt │ └── _data │ ├── accounts │ ├── archive │ ├── csr │ ├── keys │ ├── live │ └── renewal ├── etc_nginx │ └── _data │ ├── conf.d │ ├── default_org │ ├── fastcgi_params │ ├── hostname │ ├── hosts │ ├── koi-utf │ ├── koi-win │ ├── mime.types │ ├── naxsi_core.rules │ ├── naxsi.rules │ ├── nginx.conf │ ├── proxy_params │ ├── resolv.conf │ ├── scgi_params │ ├── sites-available │ ├── sites-enabled │ ├── ssl │ ├── uwsgi_params │ └── win-utf └── var_www └── _data └── cornilyon.fr
- Raspberry-nginx-pluxml :
-
utilisation de l'image 'docker.io/richarvey/nginx-php-fpm'
docker pull docker.io/richarvey/nginx-php-fpm
-
création d'un volume avec le contenu de mon pluxml
# creation du volume docker volume create --name pluxml # cp des données dans le volume sudo cp -rp documents/docker/cornilyon.fr/* /var/lib/docker/volumes/pluxml/_data/
-
lancement du conteneur
# creation conteneur avec volume créé ci-dessus pointant vers /var/www/html du conteneur docker run -it -v temp:/var/www/html --name mynginx -P -d docker.io/richarvey/nginx-php-fpm
- Portainer : https://hub.docker.com/r/portainer/portainer/
Interface Web pour le moteur Docker (gestion conteneur, templates, images, volumes...)
# installation docker pull portainer/portainer # lancement du conteneur avec persistence data et config proxy (permet de visu les 'apps-templte' docker run -d -p 9000:9000 -e HTTPS_PROXY=monproxy.paulo:3128 \ # attention http_proxy ne fonctionne pas --name paulo-portainer --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ # dossier portainer_data obligatoire portainer/portainer
Nb : l'ajout d'un endpoint sur l'interface d'admin de portainer n'est possible que si on rajoute l'option suivante dans '/etc/sysconfig/docker' du conteneur client '--signature-verification=false -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock''
grep OPTIONS /etc/sysconfig/docker OPTIONS='--selinux-enabled --log-driver=journald \ --signature-verification=false \ -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'
- test puppet agent :
-
telechargement d'un client minimum
docker pull puppet/puppet-agent-alpine
-
testage du puppet agent en lui affectant le bon reseau
docker run --net puppetv5_default --link puppetAppli puppet/puppet-agent-alpine
- Gros bazar en vrac :
----------------------------------
Acceder au Docker Hub sur mon PdT
----------------------------------
Ajouter dans fichier /etc/sysconfig/docker :
- http_proxy='http://monproxy.paulo:3128'
- https_proxy='http://monproxy.paulo:3128'
- no_proxy=sauron
---------------------------
Installer images sur Sauron
---------------------------
1 - telecharger l'image sur mon PdT (internet)
docker pull puppet/puppetserver
2 - tagger l'image
docker image tag /puppet/puppetserver sauron:5000/puppet/puppetserver
3 - pusher l'image sur Sauron
docker push sauron:5000/puppet/puppetserver
4 - puller l'image sur Sauron
docker pull sauron:5000/puppet/puppetserver
-------------------------------------------
Utiliser Sauron comme fournisseur d'images
-------------------------------------------
Sur le client :
Avant --> docker -v pull sauron:5000/puppet/puppetexplorer
Using default tag: latest
Trying to pull repository sauron:5000/puppet/puppetexplorer ...
Get https://sauron:5000/v1/_ping: http: server gave HTTP response to HTTPS client
Aprés avoir modifié le fichier /etc/docker/daemon.json et relancé le démon docker :
- cat /etc/docker/daemon.json
{ "insecure-registries":["sauron:5000"] }
- systemctl restart docker
- docker -v pull sauron:5000/puppet/puppetexplorer
Using default tag: latest
Trying to pull repository sauron:5000/puppet/puppetexplorer ...
latest: Pulling from sauron:5000/puppet/puppetexplorer
754b3735c39c: Pull complete
0fe9a086e27f: Pull complete
ea0916b50eff: Pull complete
3aaaca11d43d: Pull complete
dd70dcc11e2b: Pull complete
ca9880a96349: Pull complete
b4633de379d1: Pull complete
e6b995a8fb6d: Pull complete
Digest: sha256:965d3457c0c7a1151d1caf8f7fe2147d6a4303dc4dead3b36d4d36a8e24c2f57
Status: Downloaded newer image for sauron:5000/puppet/puppetexplorer:latest
-----------------------------------------------------
Partage de repertoire (html) avec un container nginx
-----------------------------------------------------
source : https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04
- il est obligatoire de positionner les bons droits selinux sur le repertoire d'origine ( proprietaire du repertoire : httpd_sys_content_t
chcon -Rt httpd_sys_content_t html/
- repertoire source (sur mon serveur) : home/paulo/documents/docker/html
- repertoire dest (dans le container) : /usr/share/nginx/html
- creation du container <docker-nginx> avec ouverture port 80 et partage du repertoire html
sudo docker run --name docker-nginx -p 80:80 -d -v /home/paulo/documents/docker/html:/usr/share/nginx/html nginx
------------------------------------------------
Connexion sur un container en cours d'execution
------------------------------------------------
docker exec -it docker-nginx /bin/bash
-----------------------------------------------
Copie fichier d'un container vers mon serveur
-----------------------------------------------
- container : docker-nginx
- fic source : /etc/nginx/conf.d/default.conf
- fic dest : default.conf
docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
------------------
Partage de volume
------------------
- volumes “host:conteneur”
-----------------------
sudo docker run --name docker-nginx -p 80:80 -d -v /home/paulo/documents/docker/html:/usr/share/nginx/html -v ~/documents:/var/documents nginx
-------------------------------
- volumes “conteneur:conteneur”
-------------------------------
source : https://www.metal3d.org/ticket/docker-arretez-d-utiliser-des-conteneurs-data-only
Une image va definir un volume qui pourra être montée dans d'autres conteneurs.
1 - création,à partir d'une image simple, une image qui contiendra un volume
- fichier Dockerfile :
FROM alpine
# on déclare un volume
VOLUME /opt/data
# pas la peine le de le laisser tourner
# les volumes sont accessibles même
# quand le conteneur ne tourne plus
CMD ["true"]
- création d'une image
docker build -t dataexample .
- démarrage de l'image créé ci-dessus
docker run -it -d --name data dataexample
- lien du volume de ce conteneur dans un nouveau conteneur
docker run --rm -it --volumes-from data alpine sh
> touch /opt/data/foo
> exit
- nouveau conteneur qui monte le volume du conteneur data
docker run --rm -it --volumes-from data alpine sh
> ls /opt/data
> foo
-----------------
Commandes en vrac
-----------------
# ps -a avec uniquement le nom des containeurs
ps -a --format "{{.Names}}"
# kill de tous les containers qui tournent
docker ps -a --format "{{.Names}}"
# infos détaillées sur une image
docker image inspect docker.io/puppet/puppetserver
# lancer un seul container avec docker-compose
docker-compose up -d openldap
docker logs -f (pour suivre les logs)
-------------------------------
Docker Portainer derriere proxy
-------------------------------
docker run -d -p 9000:9000 -e HTTPS_PROXY=monproxy.paulo:3128 \ # declaration var env
--name portainer --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer