如何让Docker容器在我的本地主机上运行时相互交谈

如何让Docker容器在我的本地主机上运行时相互交谈

简介

Docker容器中的连接可以通过各种方式进行。本文对其中的一些进行了解释。使用命令行界面和docker-compose的Docker网络。这种联网导致了容器之间的通信。

前提条件

在执行命令之前,请安装以下先决条件。

  • Docker引擎

  • Docker compose

方法

这些方法很简单,容易在本地机器上实现。

  • 使用CLI命令

  • 使用Docker Compose

使用命令行界面

在这里,我们将创建两个不同的容器,并使用docker网络功能连接它们。

第1步:创建一个Docker网络

$ docker network create --driver bridge test_network
729f7d54a28063daaaef68693de94e5bd52fe9d65ec2c662021712be2d198511

检查驱动类型为 “bridge “的新网络 “test_network “是否被创建。

$ docker network ls

输出

NETWORK ID    NAME      DRIVER   SCOPE
0bfc15d4d317 bridge      bridge  local
db9d7d7d4e55 host        host    local
6f035e31161b minikube    bridge  local
dd1341a489b9 mynetwork   bridge  local
574f05aae08a none        null    local
729f7d54a280 test_network bridge local

第2步:创建第一个Docker容器

在这里,我们创建了第一个Docker容器,并将其与我们在上一步创建的网络 “test_network “相连。

$ docker run -itd --name container1 --network test_network ubuntu:latest

输出

dbf034ade04f36fd30609552c22af78ef1be64e32c8629ec1a0737e9af0982b8

第3步:创建第二个Docker容器

~$ docker run -itd --name container2 --network test_network ubuntu:latest

输出

ff0626f1459207871b60514bdd841957d18589e2299a68703f97ec075edcdfae

第4步:网络检查

检查两个容器是否都是在 “test_network “驱动下创建的。

$ docker network inspect test_network

输出

[
   {
      "Name": "test_network",
      "Id": "729f7d54a28063daaaef68693de94e5bd52fe9d65ec2c662021712be2d198511",
      "Created": "2022-12-22T15:45:53.424766976+05:30",
      "Scope": "local",
      "Driver": "bridge",
      "EnableIPv6": false,
      "IPAM": {
         "Driver": "default",
         "Options": {},
         "Config": [
            {
               "Subnet": "172.19.0.0/16",
               "Gateway": "172.19.0.1"
            }
         ]
   },
   "Internal": false,
   "Attachable": false,
   "Ingress": false,
   "ConfigFrom": {
      "Network": ""
   },
   "ConfigOnly": false,
   "Containers": {
      "dbf034ade04f36fd30609552c22af78ef1be64e32c8629ec1a0737e9af0982b8": {
         "Name": "container1",
         "EndpointID":
         "530321af4739e56e5d243586aa8aaed9c1889405c6163ecf886e9f053b978dd4",
         "MacAddress": "02:42:ac:13:00:02",
         "IPv4Address": "172.19.0.2/16",
         "IPv6Address": ""
      },
      "ff0626f1459207871b60514bdd841957d18589e2299a68703f97ec075edcdfae": {
            "Name": "container2",
            "EndpointID":
            "6f3f02ded90f7e52301a4de7c23df14b4953b999d02e9232335d883ab64e4c1a",
            "MacAddress": "02:42:ac:13:00:03",
            "IPv4Address": "172.19.0.3/16",
            "IPv6Address": ""
         }
      },
      "Options": {},
      "Labels": {}
   }
]

因此,”container1“和”container2“都在同一个网络上。

第5步:检查连接性

进入其中一个容器,并尝试Ping另一个容器。如果输出显示积极的迹象,那么我们就与另一个容器成功地进行了通信。

$ docker exec -it container1 /bin/bash

现在我们在container1里面了。但首先要安装命令。

root@dbf034ade04f:/# apt install iputils-ping

输出

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
   libcap2-bin libpam-cap
The following NEW packages will be installed:
   iputils-ping libcap2-bin libpam-cap
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 76.8 kB of archives.
After this operation, 280 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

现在Ping容器2。

root@dbf034ade04f:/# ping container2

输出

PING container2 (172.19.0.3) 56(84) bytes of data.
64 bytes from container2.test_network (172.19.0.3): icmp_seq=1 ttl=64
time=59.1 ms
64 bytes from container2.test_network (172.19.0.3): icmp_seq=2 ttl=64
time=0.217 ms
64 bytes from container2.test_network (172.19.0.3): icmp_seq=3 ttl=64
time=0.104 ms
64 bytes from container2.test_network (172.19.0.3): icmp_seq=4 ttl=64
time=0.213 ms
^C
--- container2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 0.104/14.896/59.051/25.492 ms

成功地能够与容器进行通信,并且没有丢失数据包。你甚至可以不使用容器名称,而使用容器的IP地址。类似地,进入 ” container2 ” 并 ping ” container1 ” 来从另一边检查。

使用Docker Compose

在这里,我们将创建一个带有两个容器服务的Docker Compose文件。这些服务将被相互链接,这种链接将有助于容器之间的相互交流。

第1步:创建Docker Compose文件

version: '3'
services:
   busybox1:
      image: busybox:latest
      container_name: busybox_container_1
      command: sh -c 'ping busybox2'
   links:
      - busybox2
   busybox2:
      image: busybox:latest
      container_name: busybox_container_2
      command: sleep infinity

容器 ” busybox_container_1 _ ” 使用 _links 标签被链接到 ” _busybox_container_2 _ ” 。在命令标签中,我们使用ping来与另一个容器通信。

第2步:启动容器化进程

在这里,我们将看到我们是否得到Ping输出。Ping将连接到另一个容器并发送/接收数据包。

$ docker-compose up

输出

Creating network "test_default" with the default driver
Creating busybox_container_2 ... done
Creating busybox_container_1 ... done
Attaching to busybox_container_2, busybox_container_1
busybox_container_1 | PING busybox2 (172.27.0.2): 56 data bytes
busybox_container_1 | 64 bytes from 172.27.0.2: seq=0 ttl=64 time=0.162 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=1 ttl=64 time=0.137 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=2 ttl=64 time=0.212 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=3 ttl=64 time=0.104 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=4 ttl=64 time=0.231 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=5 ttl=64 time=0.170 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=6 ttl=64 time=0.313 ms
busybox_container_1 | 64 bytes from 172.27.0.2: seq=7 ttl=64 time=0.277 ms
^CGracefully stopping... (press Ctrl+C again to force)
Stopping busybox_container_1 ... done
Stopping busybox_container_2 ... done

因此,ping的工作很正常,容器也被连接了。ping命令的输出也可以在上面的Docker Compose输出中看到。

结论

我们成功地连接到本地主机上存在的Docker容器并进行通信。这些方法是业内最常用和最受欢迎的。一旦建立了连接,我们就可以用连接的容器做多个任务。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程