Commit d2f90651 authored by CHAMONT David's avatar CHAMONT David
Browse files

Merge branch 'DockerCompose' into 'master'

revue des plongeons docker, pas finalisée

See merge request !50
parents 4eb445e5 1f50125a
......@@ -48,7 +48,7 @@ int main()
A présent, compilez le et exécutez le au sein d'une machine Docker
`piscineri3/gcc61:3` :
```
```shell
> docker run --rm -it -v <LOCAL>:/piscine piscineri3/gcc61:3 /bin/bash
>> cd /piscine
>> g++ -std=c++14 hello_world.cpp -o hello_world.exe
......
......@@ -46,7 +46,7 @@ int main()
A présent, compilez le et exécutez le au sein d'une machine Docker `piscineri3/gcc61:3` :
```
```shell
> docker run --rm -it -v <LOCAL>:/Piscine piscineri3/gcc61:3 /bin/bash
>> cd /Piscine
>> g++ -std=c++14 hello_world.cpp -o hello_world.exe
......
# Installation de Docker sur une machine sous Linux
Docker est une plateforme qui va vous permettre d'exécuter du code "linux" à
......@@ -18,6 +19,12 @@ quelque secondes et d'être beaucoup plus léger
<img src="img/antoine.png" height=50>
<img src="img/david.jpeg" height=50>
<!---
Some tutorials strongly recommend to put the users in a "docker" group:
sudo usermod -aG docker $(whoami)
-->
---
## Installation de base
......
# Utilisation basique de Docker
Docker est une plateforme qui va vous permettre d'exécuter du code linux à
l'intérieur d'un conteneur, indépendamment de la machine sur laquelle vous êtes.
Un conteneur ressemble à une machine virtuelle sauf qu'il n'embarque pas
tout un système d'exploitation avec lui, ce qui lui permet de s'exécuter en
quelque secondes et d'être beaucoup plus léger
(*source : [Uhsac](http://putaindecode.io/fr/articles/docker/)*).
Docker est une technologie qui vous permet d'exécuter du code linux à
l'intérieur d'un conteneur plus ou moins isolé, indépendamment de la machine
sur laquelle vous êtes. Un conteneur ressemble à une machine virtuelle, sauf
qu'il n'embarque pas nécessairement un système d'exploitation au complet, ce
qui lui permet de se lancer en quelque secondes et d'être plus léger.
Dans ce plongeon, nous allons nous familiariser avec le vocabulaire et apprendre
à créer simplement des conteneurs à partir d'images fournies par d'autres.
* plongeons préalables :
* [Installer Docker sous Linux](Docker_00_Linux/README.md)
......@@ -13,12 +17,11 @@ quelque secondes et d'être beaucoup plus léger
* [Installer Docker sous Windows](Docker_00_Windows/README.md)
* [Installer Docker sur du vieux matériel Apple](Docker_00_MacOld/README.md)
* [Installer Docker sur un vieux Windows](Docker_00_WindowsOld/README.md)
* prérequis : connaissance de Linux.
* prérequis : connaissance basique de Linux.
* hauteur du plongeoir : 1m.
* maître(s) nageur(s) : [Fabrice Jammes](http://informatique.in2p3.fr/?q=user/235),
[David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/fabrice.jpeg" height=50>
<img src="img/david.jpeg" height=50>
* maître(s) nageur(s) : [Fabrice Jammes](http://informatique.in2p3.fr/?q=user/235), [David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/fabrice.jpeg" height=50> <img src="img/david.jpeg" height=50>
---
## Introduction
......@@ -33,7 +36,7 @@ L'isolation entre invité et hôte est excellente, mais se paie cher par l'émul
matériel virtuel et l'exécution d'un système d'exploitation invité complet.
Les conteneurs peuvent être vus comme une variante plus légère : en exploitant plus
directement les couches basses du système hôte, les conteneurs fournissent une
directement les couches basses du système hôte (noyau), les conteneurs fournissent une
isolation presque aussi forte que les machines virtuelles, à un cout en performance
beaucoup moins élevé.
......@@ -43,7 +46,7 @@ Il s'agit d'un ensemble d'outils qui facilitent l'écriture, le partage et le
déploiement d'applications au sein de conteneurs. Les conteneurs Docker sont
originellement dédiés au monde linux. On dispose maintenant de distributions
permettant de faire tourner ces conteneurs également sur des machines hôtes
MacOSX ou Windows.
MacOSX ou Windows, par le biais de machines virtuelles légères.
### Un peu de vocabulaire
......@@ -59,7 +62,10 @@ couches communes.
*Conteneur*
Une machine virtuelle légère, chargée en mémoire, que l'on peut démarrer, arrêter,
redémarrer, détruire. Un conteneur s'instancie à partir d'une image.
redémarrer, détruire. Un conteneur s'instancie à partir d'une image. Si il est
correctement configuré, un conteneur peut-être redémarré sans perdre les modifications
apportées à sons système de fichiers interne. Pour repartir vraiment de l'image
de départ, il faut détruire le conteneur et en recréer un nouveau.
*Registre*
......@@ -68,14 +74,14 @@ local sur votre machine, ou seront stockées toutes les images que vous utilisez
Il existe aussi des registres destinés à partager des images entre utilisateurs,
tel que le registre central officiel de Docker, qui est consultable à l'adresse
http://hub.docker.com/. Chacun peut y créer un compte et y publier ses images
gratuitement, tant qu'elles sont publiques.
gratuitement (tant qu'elles sont publiques).
---
## Premiers pas
Si vous avez installé Docker et vérifié qu'il fonctionnait,
vous avez sans doute déjà exécuté un conteneur "hello-world" :
vous avez sans doute déjà exécuté un conteneur `hello-world` :
```shell
> docker run hello-world
......@@ -83,7 +89,7 @@ vous avez sans doute déjà exécuté un conteneur "hello-world" :
```
Pour lancer ce conteneur, Docker a besoin de l'image correspondante.
Si elle n'est pas dans votre registre local, elle sera préalablement
Si elle n'est pas déjà dans votre registre local, elle sera préalablement
téléchargée depuis le registre officiel Docker (il faut du réseau).
Vous auriez pu le faire explicitement avec cette commande :
......@@ -116,84 +122,215 @@ ajouter l'option `-a` :
ef2db9e71c15 hello-world "/hello" 4 minutes ago Exited (0) 3 minutes ago sad_volhard
```
Surprise, notre conteneur `hello-world`, bien qu'ayant terminé
sa tâche, est toujours là ! Vous pouvez le relancer, avec l'option
`-i` pour que les affichages soient bien redirigés dans le
terminal. Et il ne pas faut utiliser le nom de l'image d'origine,
mais l'identifiant unique du conteneur, ou le nom unique
attribué par Docker (sad_volhard) :
Surprise, notre conteneur `hello-world`, bien qu'ayant terminé sa tâche, est toujours là !
Vous pouvez le relancer, avec l'option `-i` pour que les affichages soient bien redirigés
dans le terminal courant. Et il ne pas faut utiliser le nom de l'image d'origine,
mais l'identifiant unique du conteneur, ou le nom unique attribué aléatoirement par Docker
(ici `sad_volhard`) :
```shell
> docker start -i ef2db9e71c15
...
```
Pour éliminer un conteneur qui n'a plus d'utilité, une
commande "rm" fera l'affaire :
Une image est configurée pour exécuter une certaine commande au
lancement du conteneur. A la fin de la commande, le conteneur s'arrête.
Le conteneur disparait alors de l'affichage de `docker ps`, mais il est
toujours là, et visible par `docker ps -a`.
---
## Canaux d'entrées-sorties
Lorsque la commande principale d'un conteneur a besoin de communiquer sur
les canaux d'entrées-sorties d'un terminal, par exemple si il s'agit d'un
interpréteur de commandes (shell), on utilisera les options `-it` au
lancemetn du conteneur, afin que ce dernier se connecte sur le terminal
courant. Ci-dessous, nous utilisons également l'option `--name` pour choisir
explicitement le nom du nouveau conteneur, et l'image `busybox` qui
fournit un mini linux et lance un interpréteur :
```shell
> docker run -it --name mybusybox busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit
> docker ps
> docker ps -a
7a9275877944 ubuntu "bash" About a minute ago Exited (0) 5 seconds ago mybusybox
```
Si vous reproduisez l'exemple ci-dessus, vous noterez que le conteneur
est toujours là, arrêté. Vous pouvez redémarrer et vous reconnecter sur
ce conteneur avec `start` et `attach` :
```shell
> docker start mybusybox
> docker attach mybusybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit
```
---
## Un peu de ménage
Pour éliminer un conteneur qui n'a plus d'utilité, une commande "rm" fera l'affaire :
```shell
> docker rm mybusybox
> docker rm ef2db9e71c15
...
```
Il faut mettre l'option `-f` ou faire un `docker stop` pour supprimer un
conteneur en cours d'exécution (un conteneur sert souvent à faire tourner
un service).
Il faut ajouter l'option `-f` ou commencer par un `docker stop` pour supprimer un
conteneur encore en cours d'exécution.
Par défaut, lorsque la commande principale d'un conteneur est terminée, ce dernier
est arrêté, mais il n'est pas détruit pour autant. En effet, l'utilisateur pourrait
vouloir le redémarrer et s'y attacher, notamment pour inspecter le contenu de
ses fichiers internes.
Si vous préférez détruire directement un conteneur à la fin de sa commande principale,
afin de ne pas polluer votre ordinateur avec des centaines de conteneurs dormants, vous
pouvez utiliser l'option `--rm` lors du lancement :
```shell
> docker run --rm -it busybox
>> ls
bin dev etc home proc root sys tmp usr var
>> exit
> docker ps -a
```
Et si, à force d'essayer des conteneurs différents, vous finissez par manquer
de place dans votre registre local, il faudra aussi faire du ménage dans
Par ailleurs, à force d'essayer des images différentes, vous finirez par manquer
de place dans votre registre local, et il faudra sans doute faire du ménage dans
les images. Vous connaissez déjà la commande `docker images` qui vous en
dresse la liste. Pour en supprimer une, vous avez `docker rmi` :
dresse la liste. Pour en supprimer une, vous avez `docker rmi`. Essayez :
```shell
> docker images
...
> docker rmi busybox
> docker images
...
```
---
## Utilisateurs au sein d'un conteneur
Dans les exemples ci-dessusavec l'image `busybox`, on se retrouve dans le conteneur
en tant qu'utilisateur `root`, ce qui n'est pas conseillé en production. C'est cette
image qui est faite ainsi, mais pour d'autres images vous pouvez être connecté en tant
qu'utilisateur ordinaire, selon la configuration définie par l'auteur de l'image.
A COMPLETER.
---
## Lancer un conteneur en mode détaché
De même qu'un processus ordinaire, un conteneur peut-être lancé en tâche
de fond, ou mode "détaché", avec l'option `-d`. Dans le cas d'un conteneur lancant
une tâche de type "démon", assurant un service en continu tel qu'un serveur web,
c'est probablement le mode à privilégier.
On peut aussi l'utiliser avec une image qui lance un interpréteur
de commande requiérant des canaux d'entrées-sorties. En supposant que vous avez
fait du ménage, nous pouvons recréer et lancer un conteneur nommé `mybusybox`,
en mode détaché :
```shell
> docker rmi hello-world
> docker run -itd --name mybusybox busybox
...
```
Enfin, avec `hello-world`, nous avons vu un conteneur verrouillé pour
exécuter une commande donnée, mais avec un conteneur équipé d'un interpréteur
de commande tel que `bash`, on peut lancer explicitement le conteneur avec
la commande `bash`, puis exécuter des commandes interactivement au sein
du conteneur. Les options `-it` seront nécessaires :
On peut alors se reconnecter sur le conteneur à l'aide de la
commande `attach`, et se déconnecter par `CTRL-p CTRL-q`.
Vous pouvez essayez plusieurs fois la séquence ci-dessous, en la
parsemant de `docker ps` et `docker ps -a` pour tracer ce qu'il advient :
```shell
> docker run -it ubuntu bash
>> ls
bin boot dev etc home lib lib64...
>> exit
> docker attach mybusybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # CTRL-p CTRL-q
> docker ps
> docker ps -a
7a9275877944 ubuntu "bash" About a minute ago Exited (0) 5 seconds ago elated_lumiere
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a292134057f busybox "sh" 4 minutes ago Up 4 minutes mybusybox
```
Si vous reproduisez l'exemple ci-dessus, vous noterez que le conteneur
est toujours là, arrêté. Vous pouvez redémarrer et vous reconnecter sur
ce conteneur avec `start` et `attach` :
Mais si vous sortez par `exit`, l'interpréteur s'arrête, donc le conteneur
aussi, et il faut le redémarrez avant de pouvoir s'y attacher de nouveau. Essayez
la séquence ci-dessous :
```shell
> docker start 7a9275877944
> docker attach 7a9275877944
>> ls
bin boot dev etc home lib lib64...
>> exit
> docker attach mybusybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit
> docker attach mybusybox
You cannot attach to a stopped container, start it first
> docker start mybusybox
> docker attach mybusybox
/ # ...
```
Lorsque vous préférez détruire un conteneur à la fin d'une commande `run`,
afin de ne pas polluer votre ordinateur avec des centaines de conteneurs
dormants, vous pouvez utiliser l'option `--rm` :
Notez que la sortie par `CTRL-p CTRL-q` ne fonctionne que pour un conteneur
intialement lancé en mode détaché.
---
## S'inviter dans un conteneur en cours d'exécution
Un conteneur, même si il lance initialement une commande principale,
est tout à fait capable d'exécuter d'autres processus concurrents.
Ainsi, à supposer qu'une image dispose de l'interpréteur `bash`, on
peut très bien "s'inviter" dans un conteneur pour aller inspecter le
contenu de son système de fichier, à l'aide de la commande
`docker exec`. Par exemple, avec l'image `nginx` qui lance un serveur web :
```shell
> docker run --rm -it ubuntu bash
>> ls
bin boot dev etc home lib lib64...
>> exit
> docker ps -a
> docker run --name webserver -d nginx
e9061076d8db5948b8c29ced1ffe4267b8ec9a163e5af93c7eec766ed648351d
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e9061076d8db nginx "nginx -g 'daemon off" 7 seconds ago Up 6 seconds 80/tcp, 443/tcp webserver
> docker exec -it webserver bash
# ls /usr/share/nginx/html
50x.html index.html
# exit
> ...
```
Dans ces exemples avec l'image ubuntu, on se retrouve root, ce qui n'est
pas conseillé en production. C'est cette image qui est faite ainsi, mais
pour d'autres images vous pouvez être connecté en tant qu'utilisateur
ordinaire, selon la configuration définie par l'auteur.
Vous pouvez également modifier les fichiers internes du conteneur, mais
n'oubliez pas qu'à moins de vous placez dans un volume spécial, tout ce que
vous allez faire sera perdu quand le conteneur sera détruit.
---
## Communication entre conteneur et hôte
Par défaut, les conteneurs sont isolés de leur système hôte, ce qui peut devenir
un problème dès que l'on veut coordonner un système de plusieurs conteneurs. Vous
avez trois possibilités pour faire circuler de l'information entre hôte et conteneurs :
1. La définition par l'hôte de variables d'environnement qui seront transmises
au conteneur au moment de son lancement.
1. L'utilisation de volumes de données partagés, qui permet à un conteneur
d'interagir directement sur le système de fichiers de son hôte.
1. Le renvoi de ports (port forwarding) permet de reproduire sur l'hôte des ports
réseau des conteneurs.
A COMPLETER
docker cp !!!
---
## Installation et utilisation de MariaDB via Docker
......@@ -278,7 +415,7 @@ docker exec -it mariadbtest bash
apt-get install vim
```
### Se connecter à MariaDB depuis un client MySQL en ligne de commande
### Se connecter à MariaDB depuis un client MySQL s'exécutant dans un autre conteneur
Plus sportif à présent : nous lançons notre client MySQL dans un nouveau
conteneur, qui se lie à celui ou s'exécute le démon MariaDB.
......@@ -287,6 +424,32 @@ conteneur, qui se lie à celui ou s'exécute le démon MariaDB.
docker run -it --link mariadbtest:mysql --rm mariadb bash -c 'mysql -h "$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```
Le lien établi par l'option `--link` fait en sorte que le conteneur `mariadbtest` soit connu
par le nouveau conteneur en tant que `mysql`, et déclare tout un ensemble de variables pour
faciliter le dialogue entre les deux conteneurs :
```shell
> docker run -it --link mariadbtest:mysql --rm mariadb bash
# tail -n 2 /etc/hosts
172.17.0.2 mysql 2a584139fee6 mariadbtest
...
# env | grep MYSQL
MYSQL_ENV_MYSQL_ROOT_PASSWORD=mypass
MYSQL_ENV_MARIADB_VERSION=10.1.17+maria-1~jessie
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_ENV_MARIADB_MAJOR=10.1
MYSQL_ENV_no_proxy=*.local, 169.254/16
MYSQL_NAME=/focused_hamilton/mysql
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_PORT=tcp://172.17.0.2:3306
```
Ce sont ces variables, mises en place par Docker via l'option `--link`,
qui permettent ensuite de réaliser la bonne commande `mysql`.
---
## Sortie de bain
......@@ -305,6 +468,7 @@ Merci d'envoyer quelques commentaires à l'auteur :
* Build, Ship, Run using [Docker](https://www.docker.com/).
* [MariaDB via Docker](https://mariadb.com/kb/en/mariadb/installing-and-using-mariadb-via-docker/).
* [Romin Irani’s Blog](https://rominirani.com/docker-tutorial-series-part-8-linking-containers-69a4e5bf50fb#.u0ap3gdnt).
......
# Manipulation d'images Docker
Docker est une plateforme qui va vous permettre d'exécuter du code linux à
l'intérieur d'un conteneur, indépendamment de la machine sur laquelle vous êtes.
Un conteneur ressemble à une machine virtuelle sauf qu'il n'embarque pas
tout un système d'exploitation avec lui, ce qui lui permet de s'exécuter en
quelque secondes et d'être beaucoup plus léger
(*source : [Uhsac](http://putaindecode.io/fr/articles/docker/)*).
Docker est une technologie qui vous permet d'exécuter du code linux à
l'intérieur d'un conteneur plus ou moins isolé, indépendamment de la machine
sur laquelle vous êtes. Un conteneur ressemble à une machine virtuelle, sauf
qu'il n'embarque pas nécessairement un système d'exploitation au complet, ce
qui lui permet de se lancer en quelque secondes et d'être plus léger.
Dans ce plongeon, nous allons apprendre à construire et manipuler nos propres
images et conteneurs.
* plongeon préalable : [Utilisation Basique de Docker](Docker_01_Run/README.md)
* prérequis : connaissance de Linux.
* hauteur du plongeoir : 3m.
* maître(s) nageur(s) : [Fabrice Jammes](http://informatique.in2p3.fr/?q=user/235),
[David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/fabrice.jpeg" height=50>
<img src="img/david.jpeg" height=50>
* maître(s) nageur(s) : [Fabrice Jammes](http://informatique.in2p3.fr/?q=user/235), [David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/fabrice.jpeg" height=50> <img src="img/david.jpeg" height=50>
---
......
# Interconnexion de conteneurs Docker
Docker est une technologie qui vous permet d'exécuter du code linux à
l'intérieur d'un conteneur plus ou moins isolé, indépendamment de la machine
sur laquelle vous êtes. Un conteneur ressemble à une machine virtuelle, sauf
qu'il n'embarque pas nécessairement un système d'exploitation au complet, ce
qui lui permet de se lancer en quelque secondes et d'être plus léger.
Dans ce plongeon, nous allons apprendre comment Docker fournit des réseaux internes
sur votre machine, par défaut et à votre demande, afin de permettre aux conteneurs
de communiquer entre eux.
* plongeon préalable : [Manipulation d'images Docker](Docker_01_Run/README.md)
* prérequis : connaissance de Linux.
* hauteur du plongeoir : 3m.
* maître(s) nageur(s) : [David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/david.jpeg" height=50>
<!---
Faire des exemples à base de busybox ?
A verifier : You can detach from the container and leave it running with CTRL-p CTRL-q
-->
---
## Les réseaux Docker par défaut
A l'installation de Docker sur votre machine, trois réseaux Docker sont automatiquement créés,
que l'on peut consulter avec la commande
`docker network ls` :
```shell
> docker network ls
NETWORK ID NAME DRIVER
7fca4eb8c647 bridge bridge
9f904ee27bf5 none null
cf03ee007fb4 host host
```
Il s'agit des trois réseaux "historiques" de Docker. Par défaut, à moins
d'utiliser l'option `--network=<NETWORK>` de `docker run`, tout nouveau
conteneur est automatiquement attaché au réseau Docker `bridge`. Au
niveau de la machine hôte, ce réseau est connu en tant que `docker0` :
```shell
> ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:47:bc:3a:eb
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:17 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1100 (1.1 KB) TX bytes:648 (648.0 B)
```
Le réseau Docker `none`, comme son nom l'indique, permet de créer un
conteneur totalement isolé du point de vue réseau. Le réseau `host`
permet à un conteneur de bénéficier des mêmes accès réseau que la
machine hôte.
---
## Le réseau `bridge` par défaut
Tout nouveau conteneur est connecté par défaut à `bridge`. Dans les
commandes ci-dessous, nous créons deux conteneurs, et nous inspectons
le réseau `bridge` avant et après, ce qui permet de constater que les
conteneurs ont bien été connecté à `bridge`, et de voir le numéro IP
qui leur a été attribué :
```shell
> docker network inspect bridge
[
{
"Name": "bridge",
...
"Containers": {},
...
}
]
> docker run -itd --name=container1 busybox
6c413ff7d4411c37a9bfd17d540dae195c8530c33dbb681248d5bda72d600c77
> docker run -itd --name=container2 busybox
3d0d22e7554aac63d135f67480e6f77faf8224ffbf382a3ae9ba206f54c7d323
> docker network inspect bridge
[
{
"Name": "bridge",
...
"Containers": {
"3d0d22e7554aac63d135f67480e6f77faf8224ffbf382a3ae9ba206f54c7d323": {
"Name": "container2",
"EndpointID": "294a765e012333f2060d4059c3319c2eee0b5f3b8dd511945d44fcdf7ddf962d",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"6c413ff7d4411c37a9bfd17d540dae195c8530c33dbb681248d5bda72d600c77": {
"Name": "container1",
"EndpointID": "b647329b8c5fbb90579cf98a125b2a36725f71377880da64829b54073fa67036",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
...
}
]
```
Lors de la dernière inspection, on voit donc apparaitre dans le réseau les conteneurs `container1`
et `container2` avec les numéros ip `172.17.0.2`et `172.17.0.3`. Pour vérifier que les conteneurs
se voient mutuellement, vous pouvez utiliser `docker attach ...` pour vous rendre sur un conteneur, et
"CTRL-p CTRL-q" pour le quitter (attention : cette dernière technique ne fonctionne que pour un conteneur
démarré en mode "detached" par l'option `-d`).
Essayez des commandes `ping` à la fois avec les numéros IP et avec les noms :
```shell
> docker attach container1
# ping -w3 container2
ping: bad address 'container2'
# ping -w3 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.242 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.102 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.150 ms
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.102/0.164/0.242 ms
# CTRL-p CTRL-q
> docker attach container2
# ping -w3 container1
ping: bad address 'container1'
# ping -w3 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.203 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.097 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.156 ms
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.152/0.203 ms
# CTRL-p CTRL-q
```
Vous constaterez que seuls les numéros IP fonctionnent. Les conteneurs
ne se connaissent pas mutuellement par leurs noms.
---
## L'option `--link` historique
Pour faciliter la communication entre conteneurs du réseau `bridge`, on
peut utiliser l'option `--link` qui permet de donner à un conteneur
un nom (alias) dans un autre conteneur (en manipulant son `/etc/hosts`):
```shell
> docker stop container2 container1
> docker rm container2 container1
> docker run -itd --name=container1 --link=container2:c2 busybox
docker: Error response from daemon: Could not get container for container2.
See 'docker run --help'.
> docker run -itd --name=container1 busybox