docker

Rédigé par Paulo Aucun commentaire
Classé dans : Virtualisation Mots clés : docker

https://www.docker.io/static/img/docker-top-logo.png

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                          

 

sudo docker pull centos
sudo docker pull centos
sudo docker pull centos
sudo docker pull centos
sudo docker pull centos
sudo docker pull centos

Les commentaires sont fermés.