Utilisateur d'origine : Axel-HAUGUEL
Hello tout le monde!
Bon, comme la plus part des gens, j'ai fais mes premiers pas avec docker. Le moins que l'on puisse dire, c'est qu'utiliser un container, c'est facile, en créer un, c'est une paire de manches.
J'ai installé docker via ce lien pour ceux que ça intéresse. Mais ça n'est pas la question.
J'ai voulu créer un container docker me permettant de mettre un site web, avec déjà tout d'installé (serveur web, php, phpmyadmin, serveur MySQL, PHP 5.4 ,5.5, 5.6, 7.0, 7.1, 7.2, 7.3 .
Récupération de l'image de Debian (image = système d'exploitation, container = machine virtuelle docker)
J'ai crée un dossier "WebApp" dans mon /root :
$ mkdir /root/WebApp/
J'ai récupéré la dernière image de Debian stable :
$ docker pull debian
J'ai vérifié qu'elle fonctionne :
$ docker run -ti debian:latest bash
root@dyjix:~/WebApp# docker run -ti debian:latest bash
root@169e53dba9ce:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@169e53dba9ce:/# cd /root
root@169e53dba9ce:~# ls
root@169e53dba9ce:~# ifconfig
bash: ifconfig: command not found
root@169e53dba9ce:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@169e53dba9ce:~# exit
exit
You have new mail in /var/mail/root
root@dyjix:~/WebApp#
Jusqu'ici, ok ça fonctionne.
Créer un container docker
D'après ce site, voici les étapes pour créer son propre container :
Créer le fichier « Dockerfile » avec les spécifications de l’image
Créer une image : build
Démarrer un container (instance de l’image) : run
Modifier le container
Enregistrer les modifications du container dans une nouvelle image : commit
1) Je crée le fichier "Dockerfile" :
$ root@dyjix:~/WebApp# echo "FROM debian:jessie" > Dockerfile
2) Je build (écrire uniquement le nom en minuscules)
root@dyjix:~/WebApp# docker build -t webapplication .
Sending build context to Docker daemon 3.072kB
Step 1/1 : FROM debian:jessie
---> 7cd9fb1ee74f
Successfully built 7cd9fb1ee74f
Successfully tagged webapplication:latest
root@dyjix:~/WebApp#
3) On peut voir notre image faite avec la commande suivante :
root@dyjix:~/WebApp# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
webapplication latest 7cd9fb1ee74f 12 days ago 129MB
4) On crée notre container docker "moncontainerdocker" à partir de l'image "webapplication" :
root@dyjix:~/WebApp# docker run -ti --name moncontainerdocker webapplication bash
root@c3d5cbdd19a0:/# exit
root@dyjix:~/WebApp#
5) On voit que notre container existe désormais, mais il est "Exited" :
root@dyjix:~/WebApp# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3d5cbdd19a0 webapplication "bash" 2 minutes ago Exited (0) About a minute ago moncontainerdocker
root@dyjix:~/WebApp#
Si une nouvelle commande de lancement est exécutée, il y aura 2 container dans la liste.
Modifier le contenu du conteneur
1) Démarrer le container docker
root@dyjix:~/WebApp# docker start c3d5cbdd19a0
c3d5cbdd19a0
root@dyjix:~/WebApp# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3d5cbdd19a0 webapplication "bash" 6 minutes ago Up 3 seconds moncontainerdocker
root@dyjix:~/WebApp#
c3d5cbdd19a0 étant l'ID du container, on peut le récupérer avec la commande docker container ls -a
2) Rentrer dans le container docker
root@dyjix:~/WebApp# docker exec -it c3d5cbdd19a0 bash
root@c3d5cbdd19a0:/# apt-get update
Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie Release.gpg [2420 B]
Get:3 http://deb.debian.org jessie Release [148 kB]
Get:4 http://security.debian.org jessie/updates/main amd64 Packages [824 kB]
Get:5 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.1 MB in 13s (752 kB/s)
Reading package lists... Done
root@c3d5cbdd19a0:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@c3d5cbdd19a0:/# exit
3) En tapant "exit", je suis sorti du container mais il tourne toujours. Il ne faut pas oublier de sauvegarder ce qu'on a fait, et de réattribuer le contenu du container à l'image... A chaque nouveau démarrage, le container s'appuiera sur l'image qu'on aura sauvegardé.
root@dyjix:~/WebApp# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3d5cbdd19a0 webapplication "bash" 11 minutes ago Up 5 minutes moncontainerdocker
root@dyjix:~/WebApp# docker commit c3d5cbdd19a0 webapplication
sha256:638777a5965db122bc550765d754ea474993f5f15bdeedfe76ac03a6e7b0685f
root@dyjix:~/WebApp#
On peut appliquer des tags, en faisant par exemple :
root@dyjix:~/WebApp# docker commit c3d5cbdd19a0 webapplication:v1
sha256:638777a5965db122bc550765d754ea474993f5f15bdeedfe76ac03a6e7b0685f
root@dyjix:~/WebApp#
5) Le contenu du container est désormais sauvegardé dans l'image, jusqu'à la prochaine modification
Imaginons qu'on veuille commit de nouveau :
root@dyjix:~/WebApp# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
webapplication latest 638777a5965d About a minute ago 139MB
root@dyjix:~/WebApp# docker commit c3d5cbdd19a0 webapplication
sha256:759ea670618e04cc8fd5470992a89961f1eb1a4b9852ce715c2ef9132d5984f3
root@dyjix:~/WebApp# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
webapplication latest 759ea670618e 2 seconds ago 139MB
root@dyjix:~/WebApp#
Accéder aux fichiers de la machine docker via l'hôte
Je veux monter mon répertoire local /root/WebApp/disque/
dans le dossier /root
du container docker.
root@dyjix:~/WebApp# docker run -it -v /root/WebApp/disque/:/root webapplication
574a5547e11d879f28aeefab7612ed86c519c438f123d74ea655d86aedd7b391
root@dyjix:~/WebApp#
Très bien, on a maintenant monté un dossier de la machine physique vers le container docker.. Mais comment le localiser ?
root@dyjix:~/WebApp# docker inspect 574a5547e11d
[...]
"Mounts": [
{
"Type": "bind",
"Source": "/root/WebApp/disque",
"Destination": "/root",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
[...]
Ainsi les données du répertoire /root/WebApp/disque/
vues par le conteneur se trouvent en réalité sur l’hôte Docker dans le répertoire /root
!
root@dyjix:~/WebApp# docker run -ti -v /root/WebApp/disque/:/root webapplication
root@ace2b5f4da73:/# cd /root
root@ace2b5f4da73:~# ls
test
root@ace2b5f4da73:~# cat test
test ok
root@ace2b5f4da73:~# echo "testttt" > big.sh
root@ace2b5f4da73:~# exit
exit
root@dyjix:~/WebApp# ls /root/WebApp/disque/
big.sh test
root@dyjix:~/WebApp#
Nos fichiers sont bien présents aux deux côtés ! 🙂 On peut tout à fait imaginer monter la racine, mais je n'ai pas encore testé... ça peut être pratique pour mettre les scripts de sauvegarde sur la machine hôte.
Options de docker RUN (Paramétrage de l'IP, redirection de ports...)
docker run
--rm
--detach
--env KEY=VALUE
--ip 10.10.9.75
--publish 3000:3000
--volume my_volume
--name my_container
--tty --interactive
--volume /my_volume
--workdir /app
IMAGE bash
Commandes utiles
Liste des images :
command docker images -a
Supprimer une image :
command docker rmi <image_id>
Supprimer toutes les images :
command docker rmi $(docker images -q)
Liste les id des images :
command docker images -q
Liste des container actifs :
command docker container ls
(anciennement ‘docker ls’)
Liste de tous les container :
command docker ps -a
Supprimer un container :
command docker rm <container_id>
Supprimer tous les container :
command docker rm $(docker ps -a -q)
Appliquer les changements d’un container à une image :
docker commit container_id image_name
Démarrer un container :
docker start [ID]
Stopper un container
docker stop [ID]
Exporter une image docker
docker export red_panda > latest.tar
Importer une image docker
docker import /path/to/exampleimage.tgz