Ajouter Docker sur GNU Linux

De Wiki Amis SH
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 paquet docker.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 localhost
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 update
apt install php
apt install php-curl
Sauf 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
# Supprimer
docker rmi Image Image Image
# Supprimer en forçant
docker 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 commande man 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 PARTAGER

Bienvenue 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 WIKI

Soutenir 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 NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.