docker 网络
1. 基础命令 network
Usage: docker network COMMAND
COMMAND:
Commands | Description |
---|---|
connect | 将容器连接到网络 |
create | 创建一个网络 |
disconnect | 从网络中断开容器 |
inspect | 显示一个或多个网络的详细信息 |
ls | 列出所有网络 |
prune | 删除所有未使用的网络 |
rm | 删除一个或多个网络 |
2. 创建一个网络
docker network create [OPTIONS] NETWORK
选项 | 描述 |
---|---|
--attachable | 启用手动容器附加 |
--aux-address map | 网络驱动使用的辅助IPv4或IPv6地址(默认 map[]) |
--config-from string | 从指定网络复制配置 |
--config-only | 创建仅配置网络 |
-d, --driver string | 管理网络的驱动(默认 "bridge") 有一下可选项 1. bridge:桥接 2. host:主机模式 3. overlay : 4. macvlan 5. none:禁止网络功能 6.Network plugins :可以使用第三方的network 插件 |
--gateway strings | 主子网的IPv4或IPv6网关 |
--ingress | 创建Swarm路由网状网络 |
-_internal | 限制对网络的外部访问 |
--ip-range strings | 从子范围分配容器IP |
--ipam-driver string | IP地址管理驱动(默认 "default") |
--ipam-opt map | 设置IPAM驱动特定的选项(默认 map[]) |
--ipv6 | 启用或禁用IPv6网络 |
--label list | 在网络上设置元数据 |
-o, --opt map | 设置驱动特定的选项(默认 map[]) |
--scope string | 控制网络的作用域 |
--subnet strings | 表示网络段的CIDR格式子网 |
2.1. 示例1
# 创建一个名为mynet网络
root@jelly-linux:~$ docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
root@jelly-linux:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9bff9486f6f1 1panel-network bridge local
16a3e973aa57 bridge bridge local
7941e1dba795 host host local
2ef6da23de3b mynet bridge local
32e73cf88f35 none null local
# 创建两个toncat容器并且将两个容器的网络都设置为mynet
root@jelly-linux:~$ docker run -it -d -P --name tomcat01 --network mynet tomcat
d6b87df02702b0b2170d62f2a74e0abec25289e96671d1d9078849ac1f02bb25
root@jelly-linux:~$ docker run -it -d -P --name tomcat02 --network mynet tomcat
3ba23d840a8aa8ca8668a45b21195ca62f744a28c6795e0f8bd4c1e779669bad
root@jelly-linux:~$
# 查看网络配置
root@jelly-linux:~$ docker network inspect mynet
[
{
"Name": "mynet",
"Id": "2ef6da23de3bbacb2138a1bf8de1dea9bdbd6367a922df73ae979cf43fc771bd",
"Created": "2024-07-09T16:57:35.148780539+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
## 这里可以看到将两个tomcat容器都配置到了这里
"Containers": {
"3ba23d840a8aa8ca8668a45b21195ca62f744a28c6795e0f8bd4c1e779669bad": {
"Name": "tomcat02", # 后面容器之间可以直接通过这个名字通信
"EndpointID": "6223a12128c1749070b4a543fa514be5daaf3fba929f52f87b0ad64340383a8d",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"d6b87df02702b0b2170d62f2a74e0abec25289e96671d1d9078849ac1f02bb25": {
"Name": "tomcat01",
"EndpointID": "b202a8ce42a19d8ff5e6267e8570882fabffb0af8b6c1c780778a02570c088dc",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 在tomcat01中ping tomcat02
root@jelly-linux:~$ docker exec -it tomcat01 /bin/bash
root@d6b87df02702:/usr/local/tomcat$ ping tomcat02
PING tomcat02 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=0.124 ms
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.124 ms
2.2. 示例2
如下图:
如图一所示,在这网络中容器A、B可以互相通信,容器c、d可以互相通信,那么容器A、C或A、D能不能通信呢,很显然是不能的。荣国network可以看出来它们在两个不同网络中,很明显是不能通信的。如果如果A、D需要通信哪怎么实现呢。
在docker network中有一个connect命令可以将一个容器连接到一个网络上如下图(图二)所示。我们可以将容器二加入到network2中这样就相当于A、C、D容器处于同一个网络就可以通信了。
示例命令实现
# 创建两个虚拟网卡
root@jelly-linux:~$ docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 network1
f0ac8a5ef880ffb81d4437a11d802860fda95e0c26c538d6f174cceea69ccc15
root@jelly-linux:~$ docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 network2
e241a4a87f502b933a998fce0034a1da3fa64dcf088b030fa3f45d5b3470a8dd
# 创建容器
root@jelly-linux:~$ docker run -it -d -P --name tomcatA --network network1 tomcat
6285dd0f563891942edebdbe430c6ea8601e291b6a437eeb2fd0ebe777213761
root@jelly-linux:~$ docker run -it -d -P --name tomcatB --network network1 tomcat
317f4c35c537a59c42d7c29db22f28d550d8dd92ba6498771eab76f793298008
root@jelly-linux:~$ docker run -it -d -P --name tomcatC --network network2 tomcat
7bc52fbdd39c39e46fede78510dd71970f1089a111f07987e387a2e609165988
root@jelly-linux:~$ docker run -it -d -P --name tomcatD --network network2 tomcat
a1fef7e9650c1701ad668edaf2bc2a4c99e138db2e98249cc79a869d54e45d66
# 由于容器中没有ping命令所以先安ping命令
root@jelly-linux:~$ docker exec -it tomcatA /bin/bash
root@6285dd0f5638:/usr/local/tomcat$ apt-get update
root@6285dd0f5638:/usr/local/tomcat# apt install iputils-ping # 安装ping命令
root@6285dd0f5638:/usr/local/tomcat# apt install -y iproute2 #安装ip命令
# ping测试AB通信,
root@jelly-linux:~# docker exec tomcatA ping tomcatB
PING tomcatB (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatB.network1 (192.168.0.3): icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from tomcatB.network1 (192.168.0.3): icmp_seq=2 ttl=64 time=0.088 ms
# ping测试AD通信
root@jelly-linux:~$ docker exec tomcatA ping tomcatD
ping: tomcatD: Temporary failure in name resolution # 可以看出来A 、D是不通的
# 将A添加到network2网络中
root@jelly-linux:~# docker network connect network2 tomcatA
# 再次ping测试AD通信
root@jelly-linux:~# docker exec tomcatA ping tomcatD
PING tomcatD (192.168.1.3) 56(84) bytes of data.
64 bytes from tomcatD.network2 (192.168.1.3): icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from tomcatD.network2 (192.168.1.3): icmp_seq=2 ttl=64 time=0.085 ms
# 查看一下A容器中网络信息
root@jelly-linux:~$ docker exec tomcatA ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
60: eth0@if61: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
68: eth1@if69: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:01:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.4/24 brd 192.168.1.255 scope global eth1
valid_lft forever preferred_lft forever
# 可以可以看到A中有eth0@if61 eth1@if69,网卡分别对应网络1网络2.多以connect实际就是给容器加入指定的网卡。
评论区