企业运维----Docker-网络( 原生网络, 自定义网络, 容器通信)


原生网络

三种网络bridge、host、none

[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5e5795e54bd1        bridge              bridge              local
bfa2410c5e3f        host                host                local
9e0b3e5e44f4        none                null                local

  1. bridge

运行一个容器

[root@server1 ~]# docker run -d --name demo nginx
9ae9ea680fafbd75dfd216b1d73c72a1fe0b3c43f7327734c061c351c9f727f4
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9ae9ea680faf        nginx               "/docker-entrypoint.…"   18 seconds ago      Up 16 seconds       80/tcp              demo

网桥连接


[root@server1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242d1d9d203	no		veth433938f

veth433938f桥接到docker0上

在server1上ping容器


[root@server1 ~]# docker inspect demo
                    "IPAddress": "172.17.0.2",
[root@server1 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.045 ms

再开一个容器

[root@server1 ~]# docker run -d --name demo2 nginx
30ed0671ad3f965da91f07f8efe183c13ae9f950393dda485a0649b1ffcd630c
[root@server1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242d1d9d203	no		veth14cdfa5
							            veth433938f

新的容器会自动桥接到接口

  1. host

删除所有容器
运行一个容器,并且对容器的network做说明 使用host

[root@server1 ~]# docker run -it --rm --network host busybox
/ # ip addr
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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 52:54:00:24:de:51 brd ff:ff:ff:ff:ff:ff
    inet 172.25.12.1/24 brd 172.25.12.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe24:de51/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:d1:d9:d2:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d1ff:fed9:d203/64 scope link 
       valid_lft forever preferred_lft forever


  1. none
[root@server1 ~]# docker run -it --rm --network none busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ip addr
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
/ # ^C

自定义网络

三种自定义网络驱动:
bridge
overlay
macvlan

  1. 自定义网桥

现在创建一个网络名为mynet1且driver为bridge的网络:(默认创建的就是bridge)

[root@server1 ~]# docker network  create mynet1
fbf299ccc03631140b04985d25c4028d0192ae0ee3fdf580c57d8d9757dbd6fd
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5e5795e54bd1        bridge              bridge              local
bfa2410c5e3f        host                host                local
fbf299ccc036        mynet1              bridge              local
9e0b3e5e44f4        none                null                local

可以看到我们创建的mynet1的driver是bridge

  1. 用mynet1创建一个demo1一个demo2
[root@server1 ~]# docker run -d --name demo1 --network mynet1 busybox
509e058ff953b1cf28a5e2341b57a9c53232431fc11561526df049db38f04ac3
[root@server1 ~]# docker run -d --name demo2 --network mynet1 busybox
0512e6d0f2384bf616fb22d5d6d34f53cb9c706ad482d976e8c6d
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

509e058ff953        busybox             "sh"                23 seconds ago      Up 22 seconds                           demo2
0512e6d0f238        busybox             "sh"                32 seconds ago      Up 31 seconds                           demo1

[root@server1 ~]# docker inspect demo1 | grep '"IPAddress"'
            "IPAddress": "",
                    "IPAddress": "172.22.0.2",
[root@server1 ~]# docker inspect demo2 | grep '"IPAddress"'
            "IPAddress": "",
                    "IPAddress": "172.22.0.3",

并且可以看到他们的ip分别是172.22.0.2和172.22.0.3

进入demo1 ping demo2

[root@server1 ~]# docker attach demo1
/ # ip addr
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
243: eth0@if244: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.2/16 brd 172.22.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping demo2
PING demo2 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.092 ms
64 bytes from 172.22.0.3: seq=1 ttl=64 time=0.091 ms
^C
  1. 自定义网段

在创建时指定参数:–subnet 、–gateway

[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1dd3fbd23551        bridge              bridge              local
59c0518887a4        harbor_harbor       bridge              local
655003c309d7        host                host                local
e3b37c15a2fd        none                null                local
[root@server1 ~]#  docker network  create --subnet  172.20.0.0/24 --gateway  172.20.0.1 mynet1
d1197bdb695f22dd20828f1da287ffe8125ff0b0804dc0f9baebf17dc7795188
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1dd3fbd23551        bridge              bridge              local
59c0518887a4        harbor_harbor       bridge              local
655003c309d7        host                host                local
d1197bdb695f        mynet1              bridge              local
e3b37c15a2fd        none                null                local
[root@server1 ~]# docker network inspect mynet1 | grep Gateway
                    "Gateway": "172.20.0.1"
[root@server1 ~]# docker network inspect mynet1 | grep Subnet
                    "Subnet": "172.20.0.0/24",

[root@server1 ~]# docker run -d --name test1 --network mynet1  nginx:latest
219a6a25cca4e8be741e4340daf6aa2c1aa7afcfe0bff2a87515662b0ca8ea37
[root@server1 ~]# docker inspect test1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.2",

可以ping通


[root@server1 ~]# docker tag busybox:latest localhost:5000/busybox:latest
[root@server1 ~]# docker run -it --rm  --network mynet1  localhost:5000/busybox:latest
/ # ip addr
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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/24 brd 172.20.0.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.139 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.087 ms
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.085 ms
^C
--- 172.20.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.085/0.103/0.139 ms
/ # [root@server1 ~]# 

  1. 令不同网桥的容器互通
[root@server1 ~]# docker network  create --subnet  172.19.0.0/24 --gateway  172.19.0.1 mynet2
82783161d267dfafbc5fb89390286392a00170a81f5267026fc9bac72574c113
[root@server1 ~]# docker inspect test1  | grep Gateway
            "Gateway": "",
            "IPv6Gateway": "",
                    "Gateway": "172.20.0.1",
                    "IPv6Gateway": "",
[root@server1 ~]# docker inspect test1  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.2",
[root@server1 ~]# docker network  connect  mynet2  test1 
[root@server1 ~]# docker inspect test1  | grep Gateway
            "Gateway": "",
            "IPv6Gateway": "",
                    "Gateway": "172.20.0.1",
                    "IPv6Gateway": "",
                    "Gateway": "172.19.0.1",
                    "IPv6Gateway": "",
[root@server1 ~]# docker inspect test1  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.2",
                    "IPAddress": "172.19.0.2",
[root@server1 ~]# docker run -it --rm  --network mynet2  localhost:5000/busybox:latest
/ # ip addr
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
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.3/24 brd 172.19.0.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.131 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.103 ms
^C
--- 172.19.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.103/0.117/0.131 ms
/ # [root@server4 ~]# 

容器通信

容器之间还可以使用名称通信,dns解析必须在自定义网络内使用

[root@server1 ~]#  docker run -d --name test1 --network mynet1  nginx:latest
[root@server1 ~]# docker run -it --rm --network mynet1  localhost:5000/busybox:latest
/ # ping test1
PING test1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.420 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.188 ms
^C
--- test1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.188/0.304/0.420 ms
/ # cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.20.0.4	f461900d19a4
/ # 

容器访问外网

[root@server1 docker run -d --name test2 -p 80:80 nginx:latest
96559e8ac7b17de2bebb0f6533aa3c7c539666ce658cd2a06ae0a2d00646e786
[root@server1 ~]# docker port test2
80/tcp -> 0.0.0.0:80
[root@server1 ~]# netstat -anltp | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      15539/docker-proxy  

外网访问容器使用了docker-proxy和iptables DNAT
宿主机访问容器使用的是iptables DNAT
主机访问容器和容器之间的访问是docker-proxy实现
在这里插入图片描述

未完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值