Répertoire d'articles
Communication unidirectionnelle entre les conteneurs
Dans l'environnement docker, la communication est souvent requise entre les conteneurs. Par exemple, un conteneur tomcat déploie un service Web. Ce service Web doit accéder au service mysql et mysql est déployé dans un autre conteneur. À ce stade, la communication entre les conteneurs est requise. Cet exemple est une communication unidirectionnelle entre les conteneurs.
Alors, qu'est-ce que la communication à sens unique? Autrement dit, le conteneur tomcat accède unilatéralement au service MySQL pour l'accès aux données, et MySQL n'a pas besoin de connaître l'existence de Tomcat. Autrement dit, Tomcat a une perception de MySQL et MySQL n'a aucune perception de Tomcat, ce que l'on appelle unidirectionnel.
Dans l'environnement Docker, chaque fois qu'un conteneur est créé, une adresse IP virtuelle est attribuée au conteneur. Cette adresse IP n'est valide que dans l'environnement Docker et n'est pas accessible de l'extérieur. Dans l'environnement Docker, chaque conteneur peut communiquer entre eux via une adresse IP virtuelle.
Comment vérifier l'adresse IP virtuelle du conteneur
docker insepct 容器id
La figure ci-dessous est l'adresse IP virtuelle du conteneur tomcat
# 进入tomcat容器
docker exec -it 容器id /bin/bash
# 进去后
ping 172.17.0.3 # 172.17.0.3 是mysql容器的ip
# 发现能够ping通
Mais vous ne pouvez pas compter sur l'adresse IP virtuelle du conteneur pour communiquer entre les conteneurs. (Si vous comptez sur une adresse IP virtuelle pour la communication, c'est-à-dire dans le conteneur Tomcat, enregistrez l'adresse IP virtuelle du conteneur MySQL. Lorsque vous avez besoin d'accéder au conteneur MySQL, vous pouvez y accéder directement en fonction de cette adresse IP virtuelle). Mais parce que l'adresse IP virtuelle du conteneur est allouée dynamiquement lorsque docker crée le conteneur. Si un conteneur MySQL est redémarré, son adresse IP virtuelle est susceptible de changer, vous devez donc modifier l'adresse IP du conteneur MySQL auquel il souhaite accéder dans le conteneur tomcat, ce qui est extrêmement gênant.
Une meilleure façon est de nommer le conteneur et de terminer la communication unidirectionnelle entre les conteneurs en spécifiant le nom du conteneur auquel accéder. De cette façon, tant que le nom du conteneur ne change pas, docker nous aidera automatiquement à trouver le conteneur avec le nom correspondant, quelle que soit la façon dont l'IP virtuelle du conteneur change.
Lors du démarrage du conteneur, vous pouvez --name
spécifier le nom du conteneur via le paramètre, s'il n'est pas spécifié, un sera automatiquement généré de manière aléatoire.
docker run -d --name database mysql
# 通过 --link 命令,指定mysql容器的名称,将tomcat和mysql进行关联
docker run -p 7000:8080 -d --link database --name web tomcat
De cette façon, vous pouvez database
accéder au conteneur mysql par ce nom
Remarque
#若直接使用如下命令创建一个centos容器,容器运行后会自动退出
docker run centos
#若要centos容器一直保持运行,可以用如下命令
# 用交互模式运行/bin/bash,并让他在后台运行
docker run -d -it centos /bin/bash
Résumé :
Lors du démarrage du conteneur, donnez un nom à chaque conteneur, puis si le conteneur A veut communiquer avec le conteneur B unidirectionnel, lors du démarrage du conteneur A, ajoutez des paramètres --link 容器B的名字
, vous pouvez
Communication bidirectionnelle entre les conteneurs
Il peut être utilisé deux fois lors du démarrage de deux conteneurs --link
pour terminer la communication bidirectionnelle des conteneurs. Cependant, en plus de cela, vous pouvez également utiliser le pont Bridge pour regrouper plus facilement des conteneurs, et une communication bidirectionnelle peut être effectuée entre les conteneurs du même groupe
=> Qu'est-ce qu'un pont?
Le pont est un composant de l'environnement docker pour communiquer avec le monde extérieur, et c'est un pont virtuel. Son objectif principal est de connecter l'environnement docker et l'environnement hôte externe afin que l'environnement docker puisse communiquer avec l'extérieur. Vous pouvez essayer d'envoyer un ping à l'adresse de Baidu à l'intérieur d'un certain conteneur, et il peut être ping. Dans ce processus, le pont du docker est impliqué. Le pont peut transmettre les paquets de données à l'intérieur du docker à la carte réseau physique de la machine hôte, ou peut recevoir les paquets de données de la carte réseau physique de la machine hôte, puis les transmettre au docker.
Le pont docker peut également regrouper des conteneurs au niveau du réseau. Les conteneurs appartenant au même groupe peuvent communiquer entre eux dans deux directions. Autrement dit, chaque conteneur peut être lié à un pont spécifique et tous les conteneurs liés au même pont peuvent communiquer dans deux directions.
Tout d'abord, utilisez docker network ls
pour afficher la configuration du réseau docker
Selon la figure ci-dessus, docker fournira un pont par défaut, qui est responsable de la communication entre docker et le monde extérieur.
Pour réaliser une communication bidirectionnelle entre certains conteneurs, nous pouvons créer un nouveau pont nommé my_bridge via la commande suivante
docker network create -d bridge my_bridge
Ensuite, liez le conteneur qui doit communiquer avec ce pont
docker network connect my_bridge web
docker network connect my_bridge database
Cette réalisation du web et de la base de données et my_bridge deux conteneurs liés
mais je veux pouvoir obtenir une commande, le nom derrière l'augmentation de plusieurs conteneurs, a été testée et il semble ne
pas voir docker network connect --help
, selon la syntaxe, on ne peut que trouver une commande à a Le conteneur et le pont sont connectés
De cette façon, les deux conteneurs web et base de données appartiennent au groupe my_bridge, et ils peuvent communiquer entre eux.
Résumé :
En créant une nouvelle connexion réseau de type pont, puis en liant les conteneurs qui doivent être interconnectés les uns aux autres avec cette connexion pont. Les conteneurs liés à la même connexion de pont peuvent être considérés comme appartenant au même groupe de réseaux.
Partage de données entre conteneurs
Si deux conteneurs tomcat sont déployés avec le même ensemble de fichiers Web, si les fichiers Web sont modifiés, les deux conteneurs doivent être modifiés à leur tour, ce qui est très gênant.
Par conséquent, un espace de volume peut être créé sur l'hôte et plusieurs conteneurs peuvent partager ce volume. Le conteneur ne contient plus de fichiers Web spécifiques et les fichiers Web sont stockés dans ce volume sur l'hôte. Tant que le volume sur l'hôte est mis à jour, tous les conteneurs prendront effet.
Comment configurer le volume?
Deux voies
-
En
-v
montant le répertoire hôtedocker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名 # 例子如下 docker run --name web -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat
De cette façon, une mauvaise écriture de chemin entraînera l'échec du montage. Et si plusieurs conteneurs doivent monter le même répertoire hôte, chaque conteneur doit écrire le répertoire qui doit être monté au démarrage, ce qui est gênant et sujet aux erreurs. Le répertoire hôte à monter peut-il donc être déclaré en tant que variable partagée, et d'autres conteneurs peuvent terminer le montage en référençant cette variable? Regardez le chemin 2 ==>
-
--volumes-from
Point de montage via un conteneur partagé# 1. 先创建共享容器 # 这个容器只是为了声明要挂载的宿主机目录,从而能够被其他容器引用 docker create --name webpage -v /webapps:/tomcat/webapps tomcat # 2. 共享容器挂载点 # 通过 --volumes-from 指定从webpage容器读取挂载点 docker run --volumes-from webpage --name web -d tomcat
Le soi-disant conteneur de page Web définit simplement un point de montage, et d'autres conteneurs peuvent réutiliser ce point de montage.
Cela facilite la gestion unifiée de tous les montages