文章目录
- 1.容器间的通信方式
- 2.IP通信
- 3.Docker DNS Server:容器通过容器名进行通信
- 4.Joined容器
1.容器间的通信方式
- IP通信
- Docker DNS server
- Joined容器
2.IP通信
- 满足条件:
两个容器要能通信,必须要属于同一个网络的网卡
因为部署过后再指定应用的ip很麻烦,所以ip通信方式就不再过多赘述。
3.Docker DNS Server:容器通过容器名进行通信
(1)Docker daemon内嵌DNS server,只要启动时用 --name为容器命名。
(2)步骤如下:
1.首先创建bridge网络,步骤如下:
通过brige驱动创建bridge网络my_net2,指定- -subnet和- -gateway参数
(1)首先查看自己的路由表的设置情况,然后依据路由表的信息来创建bridge网络
root@ubuntu:/home/jiwangreal# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.13.2 0.0.0.0 UG 100 0 0 ens33
link-local * 255.255.0.0 U 1000 0 0 ens33
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
192.168.13.0 * 255.255.255.0 U 100 0 0 ens33
(2)创建成功会出现下面的结果
root@ubuntu:/home/jiwangreal# docker network create --driver bridge --subnet 192.168.13.0/24 --gateway 192.168.13.2 my_net2
8c703de3f949b0057b274d18b7200e3e74da7cbfa1317de6bda2b2f230ccb5c0
(3)查看网络配置
root@ubuntu:/home/jiwangreal# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "8c703de3f949b0057b274d18b7200e3e74da7cbfa1317de6bda2b2f230ccb5c0",
"Created": "2020-01-31T17:08:12.450218138+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.13.0/24",
"Gateway": "192.168.13.2"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
2.接着:
Docker daemon内嵌DNS server,只要启动时用 --name为容器命名。
步骤:
① 启动 bbox1 和 bbox2两个容器:
② docker run -it --network=my_net2 --name=bbox1 busybox
③ docker run -it --network=my_net2 --name=bbox2 busybox
④ 验证bbox2可以ping到bbox1。
⑤ 在bbox2容器中输入:ping –c 3 bbox1
注意:
(1)此时可以查看bridge网络的设置情况,如下所示。
而我只能在bbox2的容器中ping -c 3 192.168.13.3是没有问题的,直接ping主机名并未成功.。。目前不知道为什么。。DNS没管用。。
root@ubuntu:/home/jiwangreal# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "8c703de3f949b0057b274d18b7200e3e74da7cbfa1317de6bda2b2f230ccb5c0",
"Created": "2020-01-31T17:08:12.450218138+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.13.0/24",
"Gateway": "192.168.13.2"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"43d8a72796538cc9dc0192c14fb554cd0212097318716dbf2d98e4624a5b2470": {
"Name": "bbox1",
"EndpointID": "97feeafa5b0b4c1112d925b885aa6667994e5caf9acfda1a99bd355f3fbbecbf",
"MacAddress": "02:42:c0:a8:0d:01",
"IPv4Address": "192.168.13.1/24",
"IPv6Address": ""
},
"665f6025690771523c119325e5d0822c6038166d908be5a39c6a89dac4ad3afa": {
"Name": "bbox2",
"EndpointID": "b28e1913a98f732c3df11e247715c34efd4936b3104caf8629d1e142f81fbf88",
"MacAddress": "02:42:c0:a8:0d:03",
"IPv4Address": "192.168.13.3/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
(2)
使用 docker DNS 有个限制: 只能在 user-defined 网络中使用。
默认的 bridge 网络是无法使用 DNS 的。
下面验证一下:
步骤:
创建 bbox3 和 bbox4,均连接到 bridge 网络。
docker run -it --name=bbox3 busybox
docker run -it --name=bbox4 busybox
bbox4是无法ping到bbox3的.
在容器bbox4中输入:ping –c 3 bbox3,即:
/ # ping -c 3 bbox3
ping: bad address 'bbox3'
/ #
4.Joined容器
joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息, joined 容器之间可以通过 127.0.0.1直接通信
步骤:
(1)创建一个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd
(2)创建 busybox 容器。
docker run –it --network=container:web1 busybox
说明:
--network=container:web1:指定Joined容器为web1
直接在busybox容器中输入:ip a,就可以看到web1容器的网路配置,
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
接着输入ctrl p+q,查看httpd的网络配置情况,
输入docker exec -it web1 bash,
ip a
busybox和web1的网卡的mac地址都是一样的(但是在我的ubuntu机器上是没有显示出来的。。。但应该是一样的,因为(3)表明了这一点)
(3)访问web1的htpp服务。
在busybox容器中输入:wget 127.0.0.1,得到:
/ # wget 127.0.0.1
Connecting to 127.0.0.1 (127.0.0.1:80)
saving to 'index.html'
index.html 100% |*************************************************************************************************************************************| 45 0:00:00 ETA
'index.html' saved