容器技术—docker网络

docker网络类型

创建容器的时候可以通过—network命令来指定容器的网络,网络类型有以下四种

  • 主机
  • 没有
  • 容器网络或联盟网络

1、桥

    桥接网络是指容器通过桥接的方式将容器网卡桥接到宿主机的docker0网桥,然后在通过宿主机防火墙的NAT表实现与外网的联系。

宿主机docker0网桥:Docker启动的时候会在主机上自动创建一个docker0网桥,实际上是一个Linux网桥,所有容器的启动如果在docker run的时候没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。

[root@node1 ~]# ifconfig 
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:dff:feaf:3294  prefixlen 64  scopeid 0x20<link>
        ether 02:42:0d:af:32:94  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 438 (438.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

容器网卡:每创建一个桥接网络的容器就会生成一个对应的网卡

[root@node1 ~]# ip add show
14: veth91d5b94@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether b6:20:5f:1c:54:6e brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::b420:5fff:fe1c:546e/64 scope link 
       valid_lft forever preferred_lft forever

注意:
    这里的veth91d5b94@if13指的就是容器网卡,V代表虚拟网卡的意思,eth 以太网卡,91d5b94网卡编号,if13指的是宿主机网桥(docekr0)的一个端口,对应容器的网卡编号加一。所以容器内的网卡编号应该是 eth0@if14

进入容器查看网卡

[root@node1 ~]# docker exec centos_8 ip add show
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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

docker0 与容器网卡桥接

通过brctl show命令可以看到容器网卡和docker0网卡的桥接信息

[root@node1 ~]# yum -y install bridge-utils
[root@node1 ~]# brctl show
bridge name  	bridge id		    STP enabled	    interfaces
docker0		   8000.02420daf3294	no		        veth91d5b94		vethb214bb6

创建一个网络为bridge类型的容器,不指定默认也是这个类型

[root@node1 ~]# docker run -d --network bridge --name centos1 nginx
15e0f0eeab3c6c3f2f2dfecbf3b1b8f4f78c6a81b97bbf4410e9aaa269f0ab35
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS             PORTS     NAMES
15e0f0eeab3c   nginx          "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds       80/tcp    centos1

2、主机

    容器和真机共用网卡及对应的端口,缺点就是同一个端口只能宿主机或者某个容器使用,其他容器不能用

创建一个网络类型host的容器

[root@node1 ~]# docker run -id --network host --name nginx nginx:latest
f127c8a98c3a53a123fca8c2cc56cb5b5f5b5087247b8e314a13e17438345cd6
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS     NAMES
f127c8a98c3a   nginx:latest   "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds                 nginx

3、没有

    容器仅有lo网卡,是一个不能联网的本地容器

[root@node1 ~]# docker run -d --network none --name centos9 centos

4、实现网桥网络

目的:不同的服务容器组应用不同的网桥,避免同一网络内容器太多,保持容器网络独立性。

关于新网桥联网问题:创建网桥后,宿主机会自动帮你做NAT,所以不用担心联网问题

查看网络-ls

[root@node1 ~]# docker network ls

说明:

  • NETWORK ID:网桥ID   
  • NAME:名称
  • DRIVER:网络类型  
  • SCOPE:作用范围

创建网桥

[root@node1 ~]# docker network create -d bridge --subnet 192.168.3.0/24 --gateway 192.168.3.1 mydocker0
6cbeeaa6475b90bd7854723f5639971aa034245091de1ddc410454354190376b
[root@node1 ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
438729acc809   bridge      bridge    local
daf2847269ca   host        host      local
6cbeeaa6475b   mydocker0   bridge    local
b3c38e1cca61   none        null      local

修改docker网桥名字

[root@node1 ~]# ip link set dev br-6cbeeaa6475b down              #关闭新建网桥
[root@node1 ~]# ip link set dev br-6cbeeaa6475b name mydocker1    #修改名字
[root@node1 ~]# ip link set dev mydocker0 up                      #重启网桥
[root@node1 ~]# systemctl restart docker                          #重启docker服务

删除未使用的网桥-prune

[root@node1 ~]# docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
mydocker0

删除指定的网桥-rm,不能是活动容器占用的

[root@node1 ~]# docker network rm mydocker0 
mydocker0

容器连接到网桥,前提是该容器是桥接网络

[root@node1 ~]# docker network connect mydokcer0 centos 
[root@node1 ~]# docker exec centos ip add show
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
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
30: eth1@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:03:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.3.2/24 brd 192.168.3.255 scope global eth1
       valid_lft forever preferred_lft forever

注意:发现centos容器多了一块网卡,使用的正是mydocker0的网段。

容器断开网桥

[root@node1 ~]# docker network disconnect mydokcer0 centos 
[root@node1 ~]# docker exec centos ip add show
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
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

常见故障

问题1:使用改名后的新网桥的容器可能无法解析域名

  • 原因:没有配置新网桥的DNS
  • 解决方法:为容器手动配置一个DNS地址即可

问题2:联网将不起作用

  • 解决方法:
[root@node1 ~]# echo "net.ipv4.ip_forward=1" >>  /usr/lib/sysctl.d/00-system.conf  #打开转发
[root@node1 ~]# systemctl restart network                                          #重启网络

不同主机间的容器通信

macvlan

是 Docker 网络模型中的一种,并且是一种跨主机的网络模型,作为一种驱动启用,Docker macvlan 只支持桥模式

macvlan 需要一块独立的网卡来进行使用,所以我们需要新添加一块网卡
[root@node1 ~]# docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1  -o parent=eth2  mtacvlan-1
c39ebcc76f2e1d4b0d2995bff94cfbae45003a0cef5e2a9ae8b8ce8fbf4cbb2d
[root@node1 ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
29ee228b96cf   bridge       bridge    local
daf2847269ca   host         host      local
c39ebcc76f2e   mtacvlan-1   macvlan   local

注意:

  • -o parent=网卡名称,指定用来给 macvlan 网络使用的物理网卡
  • 要在所有需要运行 macvlan 的主机上执行这条命令
  • 要记得更改网关的地址,避免造成IP冲突

指定macvlan网络

[root@node1 ~]# docker run -itd --network mtacvlan-1 centos /bin/bash
4ab0917864673a203f868537411cbf628b990af477a2db019aa941bb2a55b600
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
4ab091786467   centos    "/bin/bash"   4 seconds ago    Up 3 seconds              strange_brahmagupta

Overlay Network:叠加网络

    是一种跨主机的全局网络模型,有一个数据库专门的来存储网络分配信息,避免 IP 冲突,同时内部还有一个小型的 DNS 我们可以直接通过主机名进行访问

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值