侧边栏壁纸
博主头像
爱探索

行动起来,活在当下

  • 累计撰写 42 篇文章
  • 累计创建 11 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

docker-网络

jelly
2024-07-10 / 0 评论 / 0 点赞 / 52 阅读 / 0 字

docker 网络

1. 基础命令 network

Usage: docker network COMMAND

COMMAND:

CommandsDescription
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 stringIP地址管理驱动(默认 "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

如下图:

docker通信图1.png

如图一所示,在这网络中容器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实际就是给容器加入指定的网卡。


0

评论区