English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 会自动对它进行命名。另外,我们也可以使用 --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
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.
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.
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.