Ajouter Docker sur GNU Linux
Aller à la navigation
Aller à la recherche
Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack
Installer Docker sur GNU/Linux
Installation officielle pour Docker
Get started : https://www.docker.com/get-started Installation officielle sous GNU/Linux : https://docs.docker.com/engine/installation/linux/
Docker sur Debian 8 Jessie
# Sous Debian 8, il est possible d'installer Docker directement grâce au paquetdocker.io
disponible dans les dépôts Debian :apt-get update
apt-get install docker.io
service docker start
Docker sur Debian 9 Stretch
Installation
Autre proposition d'installation fonctionnelle sur un VPS OVH avec Debian Jessie mis à jour pour Debian Stretch. apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" apt-get update apt-get install docker-ce systemctl enable docker
Sécuriser docker
Docker déconseille de lancer les conteneurs en tant que root. L'installation crée déjà un group docker. On doit juste rattacher votre utilisateur standard au group docker. Ensuite bien penser a lancer vos conteneurs avec cet utilisateur. J’appelle ici mon utilisateur demo. usermod -aG docker demo
Installer alors docker-compose à jour : https://www.admin-systeme.com/docker/installation-de-docker-sous-debian/ Source complémentaire : https://blog.touret.info/2018/09/26/installer-docker-ce-sur-debian-9/
Hello Docker
Test de docker : docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
Docker sur Ubuntu et Linux Mint
Les pré-requis
Passer en tant que root : sudo -s Installer le paquet Apparmor : apt-get install apparmor Installer le paquet linux-image-extra : apt-get install linux-image-extra-$(uname -r)
Plus d'informations sur apparmor : https://doc.ubuntu-fr.org/apparmor
Installation
Ajout du dépôt : ...
Instalation de Docker : apt-get install docker-engine Démarrage de Docker : service docker start Test de docker : docker run hello-world
Docker sur Arch Linux et Manjaro
Installation de Docker : sudo pacman -S docker Démarrage de Docker : sudo systemctl start docker Tes de Docker : sudo docker run hello-world
Désinstaller Docker
Pour supprimer Docker : docker rm $(docker ps -a -q) docker rmi $(docker images -q) apt-get remove --purge docker*
Supprimer les fichiers résiduels. Conteneurs et images : rm -rf /var/lib/docker
Certificats et fichiers de configurations liées à Docker : rm -rf /etc/docker rm /etc/systemd/system/docker.service rm /etc/init/d/docker
Pour finir et repartir sur de bonnes bases : apt-get autoremove && apt-get autoclean
Groupe Docker
Sous Linux, n'oubliez pas d'ajouter votre utilisateur au groupe docker : https://docs.docker.com/engine/installation/linux/ubuntulinux/#/create-a-docker-group. Sinon, vous devrez bénéficier des privilèges root pour pouvoir lancer la commande docker
Créer sa propre image Docker
Les images Docker sont créées à l'aide d'un fichier de configuration nommé Dockerfile. Renseigner les informations pour la création de l'image qui serviront à lancer les containers Docker. La base de tout Dockerfile est l'entrée FROM qui indique l'image de base à utiliser pour servir de support. La base de la plupart des images officielles sont des images de système d'exploitation comme par exemple Ubuntu.
Ces images ne contiennent que ce qui est nécessaire pour faire tourner le système d'exploitation. Par exemple, lancer la commande suivante pour rentrer dans un container Ubuntu : docker run --rm -it ubuntu:16.04 /bin/bash Essayer de faire un 'nano Bonjour'. Essayer alors d'installer la commande nano.
How to Create a Docker Image : https://www.linux.com/blog/learn/intro-to-linux/2018/1/how-create-docker-image
L'image
Une image, c'est un instantané d'un système à un instant t. C'est à partir d'une image que l'on peut lancer un container et donc un service.
DockerFile : Fichier source qui contient les instructions, éléments à installer, c'est un fichier de configuration.
Une image peu être dupliquée en alias.
Construire l'image sur l'hôte
Exemple 1.1 Source : https://blog.lmilcent.com/docker-comment-ca-marche/
Récupérer une image existante dans les dépôts officiels pour Docker
Pour trouver une image LAMP, lancer une recherche dans les dépôts Docker : docker search lamp Pour trouver une image Nginx, lancer une recherche dans les dépôts Docker : docker search Nginx Pour trouver une image DemocracyOS, lancer une recherche dans les dépôts Docker : docker search DemocracyOS
Chercher dans le Hub : https://hub.docker.com Survoler la liste : https://gist.github.com/carmark/89f9de6356f39149317968ccafe226a6 Choisir un DockerFile qui est régulièrement contrôlé. Ne pas prendre un dépôt sans documentation.
Installer une image Docker Debian
Télécharger l'image Docker de Debian
Utilisation de l'image de Debian GNU/Linux 9.3 Importer l'image avec la commande : docker pull debian Aller dans le shell de Debian : docker run --tty --interactive debian Démarrer Debian en écoute du port 80 : docker run --name Debian -p 80:80 -t -i debian /bin/bash Cette image peut être modifiée puis sauvegardée a un état personnalisé.
Commandes supportées et liens Dockerfile respectifs : https://store.docker.com/images/debian
Installer un serveur web dans le conteneur de l'image Docker Debian
Procédure d'installation depuis Github : https://github.com/ZerooCool/Linux-Search-Engine-Optimisation/wiki/Installer-et-utiliser-Docker
Installer une image de Docker Gitea
Dépôt officiel sur Github : https://github.com/go-gitea/gitea/tree/master/docker
nano docker-compose.yml
# Installer Gitea par défaut. version: "2" networks: gitea: external: false services: server: image: gitea/gitea:latest environment: - USER_UID=1000 - USER_GID=1000 restart: always networks: - gitea volumes: - ./gitea:/data ports: - "3000:3000" - "222:22"
docker-compose up -d
Gitea est accessible depuis le navigateur : http://localhost:3000 L'installer avec les options proposées par défaut.
Créer un compte administrateur. Gitea est fonctionnel.
Source officielle en français : https://docs.gitea.io/fr-fr/install-with-docker/ Source officielle en anglais : https://docs.gitea.io/en-us/install-with-docker/ Ressource complémentaire : https://www.howtoforge.com/tutorial/install-gitea-using-docker-on-ubuntu/
Appliquer une mise à jour : docker image pull gitea/gitea Puis dans le répertoire du docker-compose : make down; make up;
Installer une image de Docker Joomla
https://hub.docker.com/_/joomla/
Installer une image Docker lamp
Importer une image Docker lamp
Utilisation de la distribution Ubuntu 14.04.5 LTS avec l'image Docker tutum/lamp Importer l'image avec la commande : docker pull tutum/lamp Démarrer LAMP : docker run -d -p 80:80 -p 3306:3306 tutum/lamp Cette image peut être modifiée puis sauvegardée a un état personnalisé.
Voir le lien suivant pour plus d'informations : https://hub.docker.com/r/tutum/lamp/
Lancer une image Docker lamp
# Le démarrage d'un container s'effectue grâce à docker run. # Ce container écoute sur deux ports : le 80 pour le HTTP, le 3306 pour les connexions MySQL. # On peut alors accéder à notre serveur web lamp : docker run -d -p 80:80 -p 3306:3306 tutum/lamp
# Dans le cas d'une image sauvegardée : docker run -d -p 80:80 -p 3306:3306 8d876406448a
Démarrer le navigateur et aller sur http://localhost
Entrer dans le shell de Docker lamp
# Ouvrir un second terminal et afficher les conteneurs démarrés ainsi que les ids de status associés. docker ps
La console affiche le message suivant : CONTAINER ID | IMAGE | COMMAND | ... 479cd5744ea8 | c1d0dc8367a4 | "/run.sh" | ...
# Entrer dans le bash de Nginx avec l'id de status du conteneur. docker exec -it c1d0dc8367a4 bash
La console affiche le message suivant : root@c1d0dc8367a4:/#
Les fichiers du site par défaut une fois connecté à l'image Docker
/var/www/html# ls LICENSE README.md index.php logo.png phpinfo.php
Installer curl
apt install curl (Facultatif, ou, suffisant ? Par la suite j'installe php5-curl). apt install nano
# Tester si curl fonctionne. # Ajouter le code php pour savoir si curl est activé ou désactivé : # Savoir si curl est activé ou désactivé. /var/www/html# touch curl.php /var/www/html# nano curl.php
Affiche depuis le navigateur localhost/curl.php : Curl : Disabled Le paquet curl ne suffit pas a installer php-curl
# Ici c'est la version php5 de curl qui va être installée apt-get install php5-curl Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libapache2-mod-php5 php5-cli php5-common php5-mysql php5-readline Suggested packages: php-pear
Tester la présence de curl en ligne de commande : curl http://localhost
Redémarrer apache2 pour la prise en compte de php5-curl
sudo /etc/init.d/apache2 restart
Affiche depuis le navigateur localhost/curl.php : Curl : Enable Curl est maintenant fonctionnel sur une image Docker lamp.
On regrette que l'image de php ne soit pas php 7 mais php 5.
Sauvegarde de l'image Docker LAMP modifiée
Commiter le conteneur Docker LAMP (PHP5) et cURL pour générer un état à sauvegarder. Ouvrir à nouveau le terminal pour ne pas être dans le shell Docker de l'image. Identifier le conteneur a commiter avec la commande : `docker ps -a`
`docker ps -a` `CONTAINER ID | IMAGE | COMMAND ...` `479cd5744ea8 | c1d0dc8367a4 | "/run.sh" ...`
Lancer le commit du conteneur avec la commande type : `docker commit -a "Auteur" -m "message optionnel" <ID du conteneur ou nom> <Tag à donner à l'image>` Lancer le commit du conteneur avec la commande : `docker commit -a "kalamity" -m "sauvegarde" 479cd5744ea8 lamp`
Trouver le nom ou l'ID de l'image a sauvegarder avec la commande : `docker images -a` `docker images -a`
`lamp | latest | 4eedb51afd9b | 3 minutes ago | 913MB` `none | none | c1d0dc8367a4 | 11 days ago | 787MB`
Sauvegarder l'image Docker LAMP et cURL `docker save -o /home/seo/lamp-curl.tar lamp`
Installer une image Docker Nginx
Importer une image Docker Nginx
docker pull nginx
Lancer une image Docker Nginx
docker run --name docker-nginx -p 80:80 nginx
Entrer dans le shell de Docker Nginx
# Ouvrir un second terminal.
# Voir tous les conteneurs démarrés et les ids de status associés. docker ps # Entrer dans le bash de Nginx avec l'id de status du conteneur. docker exec -it d98fa742e13d bash
# Installer nano pour pouvoir éditer les fichiers de configuration. apt update apt install nano
Accéder aux fichiers de configurations de Docker Nginx
# Le dossier principale. cd /etc/nginx/
cd /etc/nginx/conf.d /etc/nginx/conf.d# ls default.conf
# Ouvrir le fichier de configuration par defaut de Docker Nginx. nano default.conf # Le fichier de configuration default.conf affiche entre autre l'emplacement des fichiers qui sont affichés depuis localhost. location / { root /usr/share/nginx/html; index index.html index.htm; }
Modifier la page par défaut index.html de Docker Nginx
cd /usr/share/nginx/html nano index.html
Ajouter par exemple le code meta utf-8 pour accepter les accents lors de l'affichage du fichier index.html <meta charset="utf-8">
Afficher le rendu de la page d'accueil index.html
Depuis le navigateur lancer localhost pour arriver sur la page d'accueil du serveur Docker Nginx.
Note Lors de la visite de localhost, le terminal affiche la connexion locale : 172.17.0.1 - - [08/Jan/2018:01:28:48 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"
KO - Installer PHP curl sur une image Docker Nginx
Je n'arrive pas à ajouter curl avec la configuration actuelle sur le l'image Docker de Nginx. Le fichier .php ne s'affiche pas quand il est appelé mais propose d'être enregistré.
apt updateapt install phpapt install php-curlSauf que les paquets sont installés pour Apache.
apt install curl curl http://127.0.0.1/ affiche le code de la page HTML de Nginx. curl https://www.visionduweb.eu affiche le code de Aesecure. curl https://www.google.fr affiche le code de la page HTML de Google.
Depuis le navigateur, la page chargée par Docker Nginx http://127.0.0.1/curl.php me propose de télécharger la page HTML car le code PHP n'est pas interprété.
/etc/php/7.0# ls apache2 cli mods-available /etc/php/7.0# cd mods-available/ /etc/php/7.0/mods-available# ls calendar.ini curl.ini fileinfo.ini gettext.ini json.ini pdo.ini posix.ini shmop.ini sysvmsg.ini sysvshm.ini ctype.ini exif.ini ftp.ini iconv.ini opcache.ini phar.ini readline.ini sockets.ini sysvsem.ini tokenizer.ini /etc/php/7.0/mods-available# nano curl.ini /etc/php/7.0/mods-available# cd .. /etc/php/7.0# ls apache2 cli mods-available /etc/php/7.0# cd apache2/ /etc/php/7.0/apache2# ls conf.d php.ini /etc/php/7.0/apache2# nano php.ini /etc/php/7.0/apache2# /etc/init.d/apache2 restart
KO - Installer PHP avec Nginx (et Docker)
Je n'arrive pas à ajouter php avec la configuration actuelle sur le l'image Docker de Nginx. Le fichier .php ne s'affiche pas quand il est appelé mais propose d'être enregistré.
apt install php-common php-cli php-fpm
cd /etc/nginx rm sites-enabled/default rm: cannot remove 'sites-enabled/default': No such file or directory
/etc/php/7.0/fpm/ nano php.ini
Ajouter :
cgi.fix_pathinfo=0
cd /etc/nginx/ mkdir sites-available cd sites-available/ touch default nano default
Ajouter dans defaut :
location ~ \\.php$ { fastcgi_split_path_info ^(.+\\.php)(/.+)$; # NOTE: You should have \cgi.fix_pathinfo = 0;\ in php.ini # With php5-fpm: fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; #Unremark the following for Ubuntu15 #include fastcgi.conf; }
Importer une image Docker richarvey/nginx-php-fpm
Au dernier essai, l'image ne charge pas. Soit un problème de DNS avec l'hôte, ajouter 8.8.8.8, sinon, réinstaller Docker. Ici, j'ai encore changé les paramètres de réseau pour la machine virtuelle, puis, je suis revenu en NAT. J'ai pu lancer une recherche d'image, puis, importer mon image.
Importer et démarrer
Avec l'image précédente, je n'arrive pas a configurer php et curl.
L'image de richarvey/nginx-php-fpm semble prendre en compte php et peut être curl mais une fois installé, ça ne semble pas fonctionner.
docker pull richarvey/nginx-php-fpm Digest: sha256:6786b7a9b849573534ff6d83668d9df32b4d63e0e9cfdf23a4b13e2d640fe1c5 Status: Downloaded newer image for richarvey/nginx-php-fpm:latest
docker run --name Tester -p 80:80 richarvey/nginx-php-fpm
Docker nginx-php-fpm devrait pourtant permettre d'utiliser directement PHP7. Retester ! Voir alors : https://hub.docker.com/r/amontaigu/nginx-php/ Voir aussi : http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/
Appliquer la même configuration que précédemment
# Entrer dans le shell de Docker Nginx # Ouvrir un second terminal. # Voir tous les conteneurs démarrés et les ids associées. docker ps # Entrer dans le bash de Nginx avec l'id de status du conteneur. docker exec -it d98fa742e13d bash # Installer nano pour pouvoir éditer les fichiers de configuration. apt update apt install nano # Accéder aux fichiers de configurations de Docker Nginx # Le dossier principale. cd /etc/nginx/ cd /etc/nginx/conf.d /etc/nginx/conf.d# ls default.conf # Ouvrir le fichier de configuration par defaut de Docker Nginx. nano default.conf # Le fichier de configuration default.conf affiche entre autre l'emplacement des fichiers qui sont affichés depuis localhost. location / { root /usr/share/nginx/html; index index.html index.php index.htm; } Modifier la page par défaut index.html de Docker Nginx cd /usr/share/nginx/html nano index.html Ajouter par exemple le code meta utf-8 pour accepter les accents lors de l'affichage du fichier index.html <meta charset="utf-8"> Afficher le rendu de la page d'accueil index.html Depuis le navigateur lancer localhost pour arriver sur la page d'accueil du serveur Docker Nginx. Le fichier .php ne s'affiche pas quand il est appelé.
/etc/init.d/apache2 restart [....] Restarting Apache httpd web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down AH00015: Unable to open logs Action 'start' failed. The Apache error log may have more information. failed! root@5c012df77bf4:/usr/share/nginx/html# /etc/init.d/apache2 stop [ ok ] Stopping Apache httpd web server: apache2. root@5c012df77bf4:/usr/share/nginx/html# /etc/init.d/apache2 start [....] Starting Apache httpd web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down AH00015: Unable to open logs Action 'start' failed. The Apache error log may have more information.
Voir pour l'image tutm/curl
docker pull tutum/curl Au dernier essai, l'image ne charge pas.
Parsoid
# Installer Parsoid : ...
# Lancer Parsoid : docker run -d -p 8180:8100 -e PARSOID_DOMAIN_localhost=http://localhost/w/api.php thenets/parsoid:0.10
Installer une image Docker mysql
docker pull mysql
Séparer le Volume qui contiens des datas, de l'image. Obtenir des backups de datas, sans faire de backup de toute l'image. Utiliser le même volume de datas avec plusieurs images. Mettre a jour les images sans toucher à l’intégrité des datas. Simple, ouvert, sécurisé.
docker run --name toto-mysql -p 3306:3306 -v /var/users/toto/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=toto -e MYSQL_PASSWORD=password -e MYSQL_ONETIME_PASSWORD=root -d -e MYSQL_DATABASE=toto mysql:latest
Ici, on indique l'emplacement du volume. Le dossier "/var/users/toto/mysql" doit exister. /var/users/toto/mysql === /var/lib/mysql du container
Ensuite on peut utiliser ce conteneur (qui est en fait un volume) avec d'autres conteneurs.
En bon français : On lance docker avec l'image de mysql. On spécifie le port d'écoute. On utilise un volume. On donne l'emplacement du volume ? On renseigne les mots de passe. On renseigne l'utilisateur et la base de données. On reprécise qu'on est sur la dernière image de mysql.
Installer une image Docker Mongo
# Tester l'image de MongoDB. docker pull mongo-express
docker run --name demos1 -p 8081:8081 mongo-express Welcome to mongo-express ------------------------
Server is open to allow connections from anyone (0.0.0.0) basicAuth credentials are "admin:pass", it is recommended you change this in your config.js! Mongo Express server listening at http://0.0.0.0:8081
/node_modules/mongodb/lib/server.js:265 process.nextTick(function() { throw err; }) ^ MongoError: failed to connect to server [mongo:27017] on first connect at Pool.<anonymous> (/node_modules/mongodb-core/lib/topologies/server.js:326:35) at emitOne (events.js:96:13) at Pool.emit (events.js:188:7) at Connection.<anonymous> (/node_modules/mongodb-core/lib/connection/pool.js:270:12) at Connection.g (events.js:292:16) at emitTwo (events.js:106:13) at Connection.emit (events.js:191:7) at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:175:49) at Socket.g (events.js:292:16) at emitOne (events.js:96:13)
Installer une image Docker phpmyadmin
docker pull phpmyadmin/phpmyadmin
Installer une image Docker democracyos
# Production-ready image for running Democra... Dans le cas du dépôt pour DemocracyOS : docker pull democracyos/democracyos
# Démarrer Democracyos docker run --name demos -p 3000:3000 democracyos/democracyos
Le message d'erreur suivant est affiché :
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): undefined events.js:160 throw er; // Unhandled 'error' event ^ MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017] at Pool.<anonymous> (/usr/src/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:328:35) at emitOne (events.js:96:13) at Pool.emit (events.js:188:7) at Connection.<anonymous> (/usr/src/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:280:12) at Connection.g (events.js:292:16) at emitTwo (events.js:106:13) at Connection.emit (events.js:191:7) at Socket.<anonymous> (/usr/src/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:177:49) at Socket.g (events.js:292:16) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) at emitErrorNT (net.js:1281:8) at _combinedTickCallback (internal/process/next_tick.js:80:11) at process._tickCallback (internal/process/next_tick.js:104:9)
Un ticket est ouvert : https://github.com/DemocracyOS/democracyos/issues/1478
Installer une image Docker Apache PHP7
Installer une image Docker Apache PHP7. https://hub.docker.com/r/nimmis/apache-php7/
Installer une image Joomla
Installer une image Joomla. Source : https://hub.docker.com/r/bitnami/joomla/
Installer une image Redmine
Source : https://github.com/sameersbn/docker-redmine
Monter un serveur multimédia avec Emby
Source : https://blog.lmilcent.com/tutoriel-monter-un-serveur-multimedia-facilement-avec-docker/
Ce tutoriel aide à la compréhension des volumes et de permet de ne pas avoir besoin de sauvegarder un conteneur Docker en entier ce qui est lourd et parfois long. En utilisant des volumes le conteneur Emby pourra être supprimé et re-créé tout en conservant ses paramètres. Il n'aura pas besoin d'être réinstallé a chaque fois que le conteneur est supprimé.
Installer 20 conteneurs pour votre bureau et le web
Source : https://linoxide.com/how-tos/20-docker-containers-desktop-user/
Avec un script bash
echo -e "\n\t Arret du reverse proxy nginx \n" docker stop nginx-proxy # Arret du container docker rm nginx-proxy # Suppression du container
echo -e "\n\t Mise à jour de l' image \n" docker pull jwilder/nginx-proxy:latest # :latest n'est pas obligatoire. On peut passer ici une version précise si elle existe.
echo -e "\n\t Lancement du reverse proxy nginx \n" docker run -d \ # -d pour lancer le service comme un daemon --restart=always \ # En cas d'arrêt, docker essayera de relancer le container -p 80:80 -p 443:443 \ # Exposition des ports --name nginx-proxy \ # Nom que je donne au container --env 'DEFAULT_HOST=www2.lmilcent.com' \ # Variable d'environnement SPECIFIQUE au container --env 'MAX_UPLOAD_SIZE=200M'\ # Idem -v /path/to/directory/conf.d \ # Exposer le dossier contenant les configurations -v /etc/nginx/vhost.d \ # idem : autre fichier de conf -v /usr/share/nginx/html \ # idem : fichiers d'erreurs html -v /path/to/directory/certs:/etc/nginx/certs:ro \ # <Dossier hôte où sont les certificats pour le https>:<dossier du container>:<lecture seule (read only)> -v /var/run/docker.sock:/tmp/docker.sock:ro \ # Authorise toutes les connexions locales (utilisé pour joindre les autres services) -v /path/to/directory/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro \ # idem : autre fichier de conf jwilder/nginx-proxy # L'image utilisée pour créer le container
En utilisant docker-compose.yml
Installer le paquet docker-compose
Tenter le lancement depuis des docker-compose.yml A suivre pour DemocracyOS.
Conteneurs
Exécution d'une image, mise en conteneur d'une image. Un conteneur est créé à partir d'une image. Les conteneurs comprennent l’applicatif et ses dépendances. Ils sont isolés du système hote.
Au moment où l'image Docker est lancée, on peut la nommer en indiquant un nom : docker run --name MonNom ImageDocker
Lister les conteneurs arrêtés avec -a
docker ps -a
Arrêter ou démarrer un conteneur
# Démarrer un conteneur.
docker start <container-id-ou-container-name>
# Arrêter un conteneur.
docker stop <container-id-ou-container-name>
# Arrêter tous les conteneurs.
docker stop $(docker ps -a -q)
# Redémarrer un conteneurs
docker restart <container-id-ou-container-name>
Lister les conteneurs démarrés
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9eced4642ec9 tutum/lamp "/run.sh" 26 minutes ago Up 26 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:3306->3306/tcp dreamy_meitner
CONTAINER ID : Identifiant du container. IMAGE : Identifiant nominatif de l'image du container, avec notamment la version comme ici "latest" puisque c'est la plus récente. COMMAND : Commande passée en paramètre lorsque le container a été créé. CREATED : Date de création du container, ici "Il y a 5 heures". STATUS : État du container, ici "En cours d'exécution depuis 5 heures". PORTS : Les différentes redirections de ports configurées, rappelez-vous l'option -p... NAMES : Nom aléatoire donné au conteneur, ceci est personnalisable grâce à l'option -name lors de l'exécution docker run.
Supprimer un conteneur
# Supprimer tous les conteneurs stoppés.
docker rm $(docker ps -a -q)
# Tuer tous les conteneurs qui tournent. docker kill $(docker ps -q)
# Supprimer un container avec son ID. Il faut que le container soit arrêté.
# Forcer avec docker rm -f <conteneur>
docker rm ID-ou-nom-du-conteneur ID-ou-nom-du-conteneur ID-ou-nom-du-conteneur
Supprimer tous les conteneurs arrêtés depuis plus d’une semaine : docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm
Lancer un conteneur éphémère avec la commande run --rm NomImage pour le supprimer automatiquement à sa fermeture. L’option --rm de la commande run permet de supprimer automatiquement un conteneur quand il s’arrête. Cette option est incompatible avec l’option -d, (detach, pour faire tourner le conteneur comme un “démon”.
Ajouter l’option -v pour sélectionner les volumes utilisés par le conteneur et les supprimer avec rm. docker rm -fv conteneur
Supprimer les conteneurs abandonnés. Lister les conteneurs exited avec la commande docker ps -a -f status=exited Supprimer les conteneurs exited avec la commande docker rm $(docker ps -a -f status=exited -q)
Supprimer des conteneurs avec plusieurs filtres. Lister : docker ps -a -f status=exited -f status=created Supprimer : docker rm $(docker ps -a -f status=exited -f status=created -q)
Supprimer un conteneur à l'aide d'un motif. Lister avec la commande docker ps -a | grep "pattern” Supprimer avec la commande docker ps -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
Supprimer container, image, volume : https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes Supprimer images et conteneurs : https://tecadmin.net/remove-docker-images-and-containers/#
Supprimer les conteneurs arrêtés avec system prune
Utiliser la commande docker system prune
pour supprimer :
Tous les conteneurs stoppés
Tous les volumes qui ne sont pas utilisés par au moins un conteneur.
Tous les networks qui ne sont pas utilisés par au moins un conteneur.
Toutes les images 'dangling'.
Supprimer toutes les images qui n'ont pas au moins un conteneur associé lancé.
docker image prune -a
Complément d'informations pour les options de system prune : https://docs.docker.com/engine/reference/commandline/system_prune/#options
Sauvegarder un conteneur
Persistance des données
Lorsqu'un conteneur est créé et lancé, il peut arriver d'y faire des modifications. Quand le conteneur est effacé, ces modifications disparaissent ! Pour les conserver, ou créer des sauvegardes à un instant T de l'état d'un conteneur, Docker fournit une possibilité de faire des commit.
# Lister les conteneurs.
docker ps -a
# Créer une nouvelle image à partir du conteneur actuel.
docker commit -a "Auteur" -m "message optionnel" <ID du conteneur ou nom> <Tag à donner à l'image>
# Exemple :
docker commit -a "seo" -m "upgrade" 1ae044ce139a "lamp-update"
Exporter une image vers un dossier
# Lister les images existantes dans le conteneur et leur id.
docker images -a
# Exporter cette nouvelle image pour la déplacer vers un autre serveur, ou faire des tests dans un environnement de développement.
# Cette commande va créer un fichier .tar.
docker save -o <chemin> <id ou nom de l'image>
docker save -o /home/seo/nomauchoix.tar [id de l'image]
Importer une image
Charger une image exportée dans docker pour l'utiliser à nouveau.
docker load -i /home/seo/dockercurl.tar
Ressources utilisées par conteneur
Il est pratique de connaitre la consommation de chaque service dans un conteneur, voire de la limiter. Cette commande permet d'afficher en temps réel la consommation de tous les conteneurs qui tournent. docker stats $(docker ps | awk '{if(NR>1) print $NF}')
Supprimer une image
# Permet de visualiser la mémoire libre sur le disque (-m pour afficher en mégaoctets).
df -m
# Afficher les images locales.
docker images
# Lister toutes les images existantes.docker images -a
# Supprimerdocker rmi Image Image Image
# Supprimer en forçantdocker rmi -f Image
# Effacer toutes les images. docker rmi $(docker images -q)
# Supprimer les images <none>. docker rmi $(docker images -f "dangling=true" -q)
# Supprimer toutes les images "dangling". # Efface les couches (layers) qui ne mènent à aucune image définitive ayant été sauvegardée. docker rmi $(docker images -q -f dangling=true)
# Lister les images avec un motif. docker images -a | grep "pattern"
# Supprimer une image avec un certain motif. docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
Supprimer les images dangling avec prune
docker image prune
Volumes
Introduction aux volumes
Les volumes Docker sont là pour stocker les données qui doivent être persistantes, le contenu de la base de données et les configurations. L'idée est de stocker la base de données et les fichiers du site dans une zone accessible et de l'hôte du conteneur, et du ton conteneur.
En théorie, la partie solution logicielle (Joomla! et PHPMyAdmin) est contenue dans l'image Docker et peut être supprimée et relancée sans problème. Il suffit de relancer les services avec en paramètre les volumes Docker contenant les configurations et données.
Voir au début de la page du sous-forum docker les actus concernant quoi de neuf docker et les vidéos sur les volumes. La doc officielle : https://docs.docker.com/storage/volumes/
Lister les volumes
docker volume ls
Supprimer un volume
Les couches et les volumes sont des éléments qu’il faut monitorer et superviser. Rester vigilant sur la gestion des volumes. Un environnement Docker ne doit pas contenir de données résiduelles sensibles si elles ne sont plus utiles.
Supprimer un volume avec la commande sudo docker volume rm volume_name
Supprimer les volumes dangling Lister les volumes dangling avec la commande docker volume ls -f dangling=true Supprimer les volumes avec la commande docker volume prune
Effacer les volumes qui ne sont liés à aucun container. docker volume rm $(docker volume ls -qf dangling=true)
Exécuter un shell interactif
Dans un nouveau conteneur Docker
# L'image debian chargée au départ est nommée Debian. docker run --name Debian -p 80:80 -t -i debian /bin/bash
# L'image importée à l'aide d'une sauvegarde est nommée Debian et chargée avec son ID. docker run --name Debian -p 80:80 -t -i f4e36cb1884b /bin/bash
En cas de sortie avec exit, on ne peut pas relancer le shell du nom de Debian car il existe déjà. On peut relancer un autre shell, du nom de Debian2 mais les changements effectués sur la base de données ne seront pas présents. Pour relancer le shell et utiliser les données de Debian, utiliser la commande docker ps -a pour lister les conteneurs disponibles. Utiliser une des commandes ci-dessous pour redémarrer le serveur ( Apache2 et MySQL ) depuis le conteneur de Debian. Les données de la base de données sont à nouveau accessibles.
Dans un container Docker
# Rappel pour lister les conteneurs existants. docker ps -a
# Obtenir un shell dans un conteneur. docker exec -ti <nom ou ID du container> sh docker exec -ti <nom ou ID du container> bash
# Malgré la fermeture du terminal, le serveur est toujours accessible avec cette commande. docker exec -ti <nom ou ID du container> /bin/sh docker exec -ti <nom ou ID du container> /bin/bash docker exec -ti <nom ou ID du container> <commande à exécuter>
Les logs
# Déboguer un container ou simplement connaître son état. # Voir les logs en temps réel en ajoutant l'option -f. docker logs <nom ou ID du container>
# Les layers indiquent pourquoi l'image prend du volume. # Voir l'historique avec la commande suivante : docker history nom
La gestion des réseaux
Créer un réseau interne
Dans ce cas, le réseau créé n'aura pas accès à internet,ou le réseau de l'hôte, et sera cantonné à docker. docker network create --internal <nom>
Créer un réseau avec accès externe
Ici, le réseau créé aura accès à l'extérieur. docker network create <nom>.
Supprimer un réseau
docker network ls docker network ls | grep "bridge" docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')
Installer Docker sous Windows
Il ne fonctionne pas tout à fait de la même façon sous Windows et Mac que sous Linux. Une VM est nécessaire sur Windows et Mac.
Installation officielle sous Windows : https://docs.docker.com/engine/installation/windows/ (https://www.docker.com/products/docker-toolbox)
Télécharger Docker Toolbox https://www.docker.com/toolbox Installer le programme. Virtualbox ne doit pas être lancé!
Avant de pouvoir lancer un conteneur Docker vous devez créer ou lancer une machine virtuelle existante. Source du tutoriel pour installer Docker sous Windows : https://www.noobunbox.net/virtualisation/installer-docker-sous-windows
Nginx sur Windows en 5 minutes ou moins avec Docker : https://distinctplace.com/2017/04/24/nginx-on-windows-in-5-minutes-or-less-with-docker/
Voir aussi la documentation de Docker pour Windows : https://docs.docker.com/docker-for-windows/
Hyper V
https://docs.microsoft.com/fr-fr/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v https://docs.docker.com/toolbox/overview/ https://docs.docker.com/toolbox/toolbox_install_windows/#step-3-verify-your-installation
Installer Docker sous Mac
Il ne fonctionne pas tout à fait de la même façon sous Windows et Mac que sous Linux. Une VM est nécessaire sur Windows et Mac. Installation officielle sous Mac : https://docs.docker.com/engine/installation/mac/ (https://www.docker.com/products/docker-toolbox)
Complément
Créer des alias pour utiliser Docker
# ~/.bash_aliases # Kill all running containers. alias dockerkillall='docker kill $(docker ps -q)' # Delete all stopped containers. alias dockercleanc='printf "\n>>> Deleting stopped containers\n\n" && docker rm $(docker ps -a -q)' # Delete all untagged images. alias dockercleani='printf "\n>>> Deleting untagged images\n\n" && docker rmi $(docker images -q -f dangling=true)' # Delete all stopped containers and untagged images. alias dockerclean='dockercleanc || true && dockercleani'
Redimensionner l'espace disque d'une machine virtuelle Docker
docker-machine create --driver virtualbox --virtualbox-disk-size "40000" default
Docker pour utiliser Mediawiki
Source : hub.docker.com/r/synctree/mediawiki/
Pousser image vers Docker Cloud
Créer un conteneur Docker avec Dockerfile et le publier sur DockerHub : http://sysadmin.cyklodev.com/creer-un-conteneur-docker-avec-dockerfile-et-le-publier-sur-dockerhub/ Push images to Docker Cloud :https : // docs . docker . com/docker-cloud/builds/push-images/
En savoir plus sur Docker
Docker est développé avec le langage Go. Pour en savoir plus, lire les fichiers man :man docker
mais également le man de chaque commandeman docker run
.
Localiser l'emplacement de stockage des fichiers de Docker en local sous GNU/Linux. /var/lib/docker
En savoir plus : https://docs.docker.com/glossary/?term=Docker Les commandes CLI de Docker : https://docs.docker.com/engine/reference/commandline/cli/
Bibliographie
Pris en compte dans le tutoriel
Rejoindre Slack : https://blog.docker.com Hub Docker pour Ubuntu : http://hub.docker.com/_/ubuntu/ Le forum officiel pour Docker : https://forums.docker.com Docker community : https://www.docker.com/docker-community Nettoyer Docker : http://damiengustave.fr/nettoyer-docker/ Docker - Comment ça marche : https://blog.lmilcent.com/docker-comment-ca-marche/ StackOverFlow docker : https://stackoverflow.com/search?tab=newest&q=docker Docker commandes de nettoyage : https://www.calazan.com/docker-cleanup-commands/ Installer Docker sur GNU/Linux : https://memo-linux.com/installer-docker-sur-gnulinux/ Installer Docker sur Debian 8 : https://www.it-connect.fr/debuter-avec-docker-et-les-containers-sous-debian-8 Libérer l'espace disque pris par Docker : http://blog.lecacheur.com/2016/01/06/liberer-lespace-disque-pris-par-docker/ Libérer l’espace disque pris par Docker - Le retour : http://blog.lecacheur.com/2016/02/17/liberer-lespace-disque-pris-par-docker-le-retour/ How to remove Docker images containers and volumes : https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes Docker - How to cleanup (unused) resources : https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430
En complément
Docker et la sécurité : https://www.developpez.net/forums/d1790503/systemes/virtualisation/docker/tutoriel-video-quoi-neuf-docker-explique-securiser-conteneurs/#post9852738 Docker Security Scanning : https://www.developpez.com/actu/98661/Docker-devoile-Docker-Security-Scanning-son-outil-de-scan-de-vulnerabilites-au-sein-des-containers-Docker/ Comment sauvegarder Docker sans prendre trop de poids : https://www.developpez.net/forums/d1812349/systemes/virtualisation/docker/sauvegarder-conteneur-docker-prendre-poids Tutoriel complémentaires : https://my.pcloud.com/publink/show?code=kZI9RP7Z9YqDWj7Ue8Ya90pqy5yCXFdqVaoV&fbclid=IwAR3CY-UAzynTk6qecdb_cuteXMaf2Fpa0n9g1kNCfZ1GbvH6OTBaJgRItqU Copying files from Docker container to host : https://stackoverflow.com/questions/22049212/copying-files-from-docker-container-to-host Why you don't need to run SSHd in your Docker containers : https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/ Analyser les logs Apache avec ELK et Docker : http://blog.lecacheur.com/2016/01/21/analyser-les-logs-apache-avec-elk-et-docker/ Sauvegarder restaurer ses conteneurs Docker : https://blog.lmilcent.com/sauvegarder-restaurer-ses-conteneurs-docker/ Documentation pour démarrer avec son image Docker : https://www.wanadev.fr/24-tuto-docker-demarrer-docker-partie-2/ Volume / Alpine / Docker / MariaDB : https://duckduckgo.com/?q=docker+volume+alpine+mariadb&t=lm&ia=images Nginx reverse proxy server Docker : http://littlebigextra.com/install-nginx-reverse-proxy-server-docker/ https://stackoverflow.com/questions/29696656/finding-the-layers-and-layer-sizes-for-each-docker-image Utiliser et installer Docker Cloud Agent : https://docs.docker.com/docker-cloud/infrastructure/byoh/ Source : https://www.itzgeek.com/how-tos/linux/debian/how-to-install-docker-on-debian-9.html DockerFile : https://linuxfr.org/news/docker-tutoriel-pour-manipuler-les-conteneurs Container Builder de Google : https://cloud.google.com/container-builder/ http://blog.arungupta.me/show-layers-of-docker-image/ Lire la documentation officielle de Docker : https://docs.docker.com Aide mémoire Docker : https://blogoflip.fr/aide-memoire-docker Exemple de script pour Docker : https://pastebin.com/v33bW1Lf Docker sur Ubuntu : https://doc.ubuntu-fr.org/docker http://damiengustave.fr/nettoyer-docker/ https://doc.ubuntu-fr.org/docker_lamp
Ressources complémentaires sur Nginx
Astuces Nginx Docker 2015 : https://blog.docker.com/2015/04/tips-for-deploying-nginx-official-image-with-docker/ https://www.howtoforge.com/tutorial/installing-nginx-with-php-fpm-and-mariadb-lemp-on-debian-jessie/ https://www.sitepoint.com/setting-up-php-behind-nginx-with-fastcgi/ https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-web-server-and-reverse-proxy-for-apache-on-one-ubuntu-14-04-droplet Nginx webserver : https://docs.docker.com/kitematic/nginx-web-server/ https://vexxhost.com/resources/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-16-04/ Tutoriel pour Ubuntu 14. Créer une page web pour le serveur Nginx : https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04#step-5-%E2%80%94-building-a-web-page-to-serve-on-nginx How to commit changes to a Docker image : https://www.techrepublic.com/article/how-to-commit-changes-to-a-docker-image/ Nginx as a proxy : https://www.digitalocean.com/community/tutorials/docker-explained-how-to-containerize-and-use-nginx-as-a-proxy October 22, 2014 - Deploying NGINX and NGINX Plus with Docker : https://www.nginx.com/blog/deploying-nginx-nginx-plus-docker/ Docker container Nginx Node Redis example : http://anandmanisankar.com/posts/docker-container-nginx-node-redis-example/ How install and use Docker Linux : https://www.linux.com/learn/intro-to-linux/2017/11/how-install-and-use-docker-linux Docker Cheat Sheet : https://medium.com/statuscode/dockercheatsheet-9730ce03630d Docker Cheat Sheet : https://dockercheatsheet.painlessdocker.com/ https://ops.tips/blog/inspecting-docker-image-without-pull/ https://forums.docker.com/t/docker-ubuntu-then-nginx-and-php-cannot-start-web-server/32894 https://www.tutorialspoint.com/docker/docker_setting_nginx.htm https://hub.docker.com/r/gvergne/nginx/ https://www.php-geek.fr/installer-redmine-docker-nginx-proxy.html https://www.techrepublic.com/article/how-to-run-nginx-as-a-docker-container/ https://www.digitalocean.com/community/questions/nginx-issue-curl-work-but-request-from-the-browser-doesn-t
Sécurité
Avec Trivy, c’est trivial d’identifier les vulnérabilités de vos conteneurs : https://blog.octo.com/avec-trivy-cest-trivial-didentifier-les-vulnerabilites-de-vos-conteneurs/
Notes complémentaires
Sauvegarder vers l'hôte : Duplicity avec B2.
NAVIGATION
PARTICIPER ET PARTAGERBienvenue sur le wiki de Amis SH. De nombreuses pages sont partagées sur ce wiki. Créer un compte utilisateur pour participer sur le wiki. Les pages présentées sur le wiki évoluent tous les jours. Certaines recherches sont peu abouties et incluent des erreurs. Utiliser la recherche interne du wiki pour trouver votre contenu. La page de discussion de Amis SH vous permet de poser vos questions. Consulter le site amis-sh.fr pour installer votre propre serveur web. Améliorer le contenu des pages avec vos retours depuis l'onglet discussion. Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique. Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité. |
SOUTENIR CE WIKISoutenir le wiki avec un don en monnaie numérique : AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash OBTENIR DE LA MONNAIE NUMERIQUEObtenir gratuitement de la monnaie numérique : Miner de la cryptomonnaie. |