Communication et montage de données Docker notes-conteneur

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

image-20200523211822372

# 进入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 --namespé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 databaseaccé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 --linkpour 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.
image-20200524003642767

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 lspour afficher la configuration du réseau docker

image-20200523220930880
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

image-20200523221137373

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
image-20200523222232729

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.

image-20200523223023655

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.

image-20200523224149832

Comment configurer le volume?

Deux voies

  1. En -vmontant le répertoire hôte

    docker 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 ==>

  2. --volumes-fromPoint 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

Je suppose que tu aimes

Origine blog.csdn.net/vcj1009784814/article/details/106309098
conseillé
Classement