如何让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容器并进行通信。这些方法是业内最常用和最受欢迎的。一旦建立了连接,我们就可以用连接的容器做多个任务。