English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Connexion des conteneurs Docker

Nous avons réalisé auparavant l'accès aux services exécutés dans des conteneurs Docker via des ports réseau.

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

下面我们来实现通过端口连接到一个 docker 容器。

网络端口映射

我们创建了一个 python 应用的容器。

w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

我们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。

w3codebox@w3codebox:~$ docker ps
CONTAINER ID    IMAGE               COMMAND            ...           PORTS                     NAMES
fce072cc88ce    training/webapp     "python app.py"    ...     0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。

  • -p : 是容器内部端口绑定到指定的主机端口。

w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...           PORTS                     NAMES
33e4523d30aa        training/webapp     "python app.py"   ...   0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp   grave_hopper

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...     PORTS                                NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp		"python app.py"		...		0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

de cette manière, nous pouvons accéder 127.0.0.1:5001 pour accéder au conteneur 5000 port.

Dans l'exemple ci-dessus, le port TCP par défaut est lié, si vous souhaitez lier un port UDP, vous pouvez ajouter /udp

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
w3codebox@w3codebox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

docker port 该命令可以让我们快捷地查看端口的绑定情况。

w3codebox@w3codebox:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Docker 容器互联

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 使用标识来命名容器,例如:

w3codebox@w3codebox:~$ docker run -d -P --name w3codebox training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 使用命令来查看容器名称。

w3codebox@w3codebox:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           …    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   w3codebox

Nouveau réseau

Créons d'abord un nouveau réseau Docker.

$ docker network create -d bridge test-net

Explication des paramètres :

-d:paramètre spécifiant le type de réseau Docker, il existe bridge, overlay.

L'un des types de réseau overlay est utilisé pour le mode Swarm, que vous pouvez ignorer dans cette section.

Connecter le conteneur

Exécutez un conteneur et connectez-le au test nouvellement créé-net réseau:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

Ouvrez un nouveau terminal et exécutez un conteneur et ajoutez-le à test-net réseau:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

Cliquez sur l'image pour afficher la grande image :

Nous allons utiliser ping pour prouver que test1 Le conteneur et test2 Les conteneurs ont établi une relation de communication.

Si test1、test2 Si vous n'avez pas de commande ping dans le conteneur, exécutez les commandes suivantes pour installer ping (à utiliser immédiatement : vous pouvez l'installer dans un conteneur, le pousser dans l'image, puis redémarrer les deux conteneurs avec cette nouvelle image).

apt-get update
apt install iputils-ping

Dans test1 Le conteneur doit exécuter la commande suivante :

Cliquez sur l'image pour afficher la grande image :

De même dans test2 Le conteneur réussira également à se connecter à :

Cliquez sur l'image pour afficher la grande image :

De cette manière, test1 Le conteneur et test2 Les conteneurs ont établi une relation de communication.

Si vous avez plusieurs conteneurs qui doivent se connecter entre eux, il est recommandé d'utiliser Docker Compose, ce qui sera expliqué plus tard.

Configurer le DNS

Nous pouvons configurer le DNS sur l'hôte principal, /etc/docker/Ajoutez le contenu suivant au fichier daemon.json pour configurer le DNS pour tous les conteneurs :

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

Après la configuration, le DNS du conteneur sera automatiquement configuré comme suit : 114.114.114.114 et 8.8.8.8。

Après la configuration, vous devez redémarrer Docker pour que les modifications prennent effet.

Pour vérifier si le DNS du conteneur est fonctionnel, vous pouvez utiliser la commande suivante, qui affichera les informations DNS du conteneur :

$ docker run -it --rm  ubuntu  cat etc/resolv.conf

Cliquez sur l'image pour afficher la grande image :

Configurer manuellement la configuration du conteneur

Si vous ne souhaitez configurer le DNS que dans le conteneur spécifié, vous pouvez utiliser la commande suivante :

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

Explication des paramètres :

--rm: Nettoyer automatiquement le système de fichiers interne du conteneur lors de la sortie du conteneur。

-h HOSTNAME ou --hostname=HOSTNAME: Définir le nom d'hôte du conteneur, qui sera écrit dans le /etc/hostname et /etc/hosts。

--dns=IP_ADDRESS: Ajouter un serveur DNS au conteneur /etc/Dans resolv.conf, faire utiliser ce serveur pour résoudre tous les noms de domaine qui ne sont pas /etc/nom de l'hôte dans hosts.

--dns-search=DOMAIN: Définir le domaine de recherche du conteneur, lorsque le domaine de recherche est défini sur .example.com, lors de la recherche d'un hôte nommé host, le DNS ne recherche pas seulement host, mais aussi host.example.com.

Cliquez sur l'image pour afficher la grande image :

Si le conteneur n'est pas spécifié au démarrage --dns et --dns-search,Docker utilisera par défaut celui du hôte principal /etc/Configurer le DNS du conteneur avec resolv.conf.