2024.8.28(docker网络)

跨主机的 容器网络连接 A=>mysql B=>java容器

将A -p3306:3306

一、docker 网络

1、本地网络
1. bridge

所有容器连接到桥就可以使用外网,使用nat让容器可以访问外网,使用ip a s指令查看桥,所有容器连接到此桥,ip地址都是172.17.0.0/16网段,桥是启动docker服务后出现,在centos使用bridge-utils安装

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default   字节不可超过1500

[root@docker ~]# docker run -d -p80:80 centos:nginx
8463b7e49dd5953adb2fa3912fd86ff9f8ddbb3ec622537d04152f3a5c6f9cd5
[root@docker ~]# docker ps

CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                               NAMES
8463b7e49dd5   centos:nginx   "/bin/sh -c /usr/sbi…"   4 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   objective_lumiere
1.1 查看ip地址

[root@docker ~]# docker inspect 846
[root@docker ~]# docker inspect 846 | grep IPAdd

[root@docker ~]# yum -y install bridge-utils
[root@docker ~]# brctl show

bridge name    bridge id        STP enabled    interfaces
docker0        8000.02429fd57a3f    no        veth4232f18
1.2 使用docker network 查看桥

[root@docker ~]# docker network --help
[root@docker ~]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
e5da4820eef5   bridge    bridge    local
d170345c072d   host      host      local
16c435acb5e9   none      null      local

每一台dcoker host上的docker0所在网段完全一样,但是会造成跨主机的容器无法通信, 

2. host

与主机共享网络,可让容器连接外网

所有容器与docker主机在同一个网络中,容器和外网相互访问

主机名同真机,网络也同真机

优点:可以直接访问容器

缺点:端口占用,多容器同时运行一个服务,不建议,在测试环境中使用

[root@docker ~]# docker run -it centos:latest /bin/bash
[root@e367bab67073 /]# [root@docker ~]# 
[root@docker ~]# docker inspect e36

2.1 绑定hosts主机网络

[root@docker ~]# docker run -it --network host centos:latest /bin/bash
[root@docker /]# 

[root@docker ~]# docker ps

CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
ba0135dcfd56   centos:latest   "/bin/bash"   56 seconds ago   Up 55 seconds             friendly_solomon

e55d5cb190f3   centos:latest   "/bin/bash"   12 seconds ago   Up 12 seconds             practical_lumiere

e367bab67073   centos:latest   "/bin/bash"   3 minutes ago    Up 3 minutes              thirsty_napier

[root@docker ~]# docker inspect ba0    //没有ip

[root@docker ~]# docker run -it --network host centos:yum /bin/bash
[root@docker /]# ls
[root@docker /]# yum -y install iproute
[root@docker /]# ip a s
[root@docker /]# yum -y install httpd
[root@docker /]# httpd -k start
[root@docker /]# curl localhost
=============
[root@docker ~]# curl 192.168.8.168
=============

3. none

容器仅仅有lo网卡,不能与外界链接,在高级应用中使用,lo网卡,无法链接外网

2、联盟网络 容器网络

 共享网络命名空间

3、跨主机容器之间通讯
1. 工具
 1.1 pipwork
 1.2 flannel

overlay覆盖型网络,不支持路由转发,通过数据etcd数据库保存子网信息以及网络分配信息,给每台主机分配一个网段,通过udp传输数据包

主机容器主机容器
AA1 172.20.0.2 mysqlBB1 172.20.0.3 java
A2 172.20.0.3B2 172.20.0.5
A3 172.17.0.4B3 172.17.0.4
主机名ip功能软件
node1192.168.8.175主控主机etcd flannel docker
node2192.168.8.174被控主机etcd docker

flannel的思路:

FlEnnel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。但在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的"IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

Flannel实质上是一种“覆盖网络(overlay network)",即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和identifiers(标识)做映射来资源定位。也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式

原理:

每个主机配置一个ip段和子网个数。例如,可以配置一个爱盖网络使用10.10.0.0/16段。因此主机A可以接受10.10.1.0/24,主机B可以接受10.10.2.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel使用udp来封装ip数据报,转发到远程主机。选择UDP作为转发协议是因为他能穿透防火墙。

安装flannel etcd

[root@node1 ~]# yum -y install etcd
[root@node1 ~]# yum -y install flannel

[root@node2 ~]# yum -y install flannel

配置启动etcd

[root@node1 ~]# vim /etc/etcd/etcd.conf

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.8.175:2379,http://192.168.8.175:4001"

 [root@node1 ~]# systemctl start etcd

[root@node1 ~]# netstat -lnput | grep 2379        
[root@node1 ~]# netstat -lnput | grep 4001

tcp6       0      0 :::2379                 :::*                    LISTEN      1361/etcd   
tcp6       0      0 :::4001                 :::*                    LISTEN      1361/etcd      

设置开机启动

[root@node1 ~]# systemctl enable etcd

测试数据库功能

[root@node1 ~]# etcdctl set testdir/testkey0 1000
1000
[root@node1 ~]# etcdctl get testdir/testkey0
1000

 测试集群健康

[root@node1 ~]# etcdctl -C http://192.168.8.175:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.8.175:2379
cluster is healthy

修改flanneld配置文件

[root@node1 ~]# vim /etc/sysconfig/flanneld 

FLANNEL_ETCD_ENDPOINTS="http://192.168.8.175:2379"

 向数据库中存入网段信息

[root@node1 ~]# etcdctl mk /atomic.io/network/config '{ "Network" : "172.20.0.0/16" }'
{ "Network" : "172.20.0.0/16" }
[root@node1 ~]# etcdctl get /atomic.io/network/config
{ "Network" : "172.20.0.0/16" }        指定容器的ip地址从此开始

启动并设置开机启动

[root@node1 ~]# systemctl start flanneld.service 
[root@node1 ~]# systemctl enable flanneld.service 

查看IP

[root@node1 ~]# ip a s

安装docker

[root@node1 ~]# bash docker.sh
[root@node1 ~]# systemctl start docker
[root@node1 ~]# ip a s

 查看flannel的子网ip

[root@node1 ~]# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.3.1/24
FLANNEL_MTU=1472      //最大字节数
FLANNEL_IPMASQ=false

 配置daemon.json文件

[root@node1 ~]# scp root@192.168.8.168:/etc/docker/daemon.json /etc/docker/
[root@node1 ~]# vim /usr/lib/systemd/system/docker.service

[root@node1 ~]# systemctl daemon-reload

[root@node1 ~]# systemctl restart docker

[root@node1 ~]# vim /etc/docker/daemon.json 

{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ],

        "hosts": [
                "tcp://0.0.0.0:2375",
                "unix:///var/run/docker.sock"
        ],
        "insecure-registries":[
                "http://192.168.8.175:5000"
        ],
        "bip" : "172.20.3.1/24",
        "mtu" : 1472
        
}

[root@node1 ~]# systemctl restart docker

[root@node1 ~]# ip a s

拉取镜像,创建容器

[root@node1 ~]# docker pull centos

[root@node1 ~]# docker run -it centos:latest /bin/bash
[root@bc9611f40b84 /]# [root@node1 ~]# 
[root@node1 ~]# docker inspect bc9 | grep IPAdd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.20.3.2",
                    "IPAddress": "172.20.3.2",

node2 安装docker,修改flanneld文件

[root@node2 ~]# vim /etc/sysconfig/flanneld 

FLANNEL_ETCD_ENDPOINTS="http://192.168.8.175:2379"

[root@node2 ~]# systemctl start flanneld
[root@node2 ~]# ip a s
 

[root@node2 ~]# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.73.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
[root@node2 ~]# source docker.sh
[root@node2 ~]# systemctl start docker
[root@node2 ~]# ip a s

将网段写入daemon.json文件

[root@node2 ~]# scp root@192.168.8.175:/etc/docker/daemon.json /etc/docker/
[root@node2 ~]# vim /etc/docker/daemon.json 

{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ],

        "hosts": [
                "tcp://0.0.0.0:2375",
                "unix:///var/run/docker.sock"
        ],
        "insecure-registries":[
                "http://192.168.8.175:5000"
        ],
        "bip" : "172.20.73.1/24",
        "mtu" : 1472

}

[root@node2 ~]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd 

[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker

[root@node2 ~]# ip a s

拉取一个centos镜像

[root@node2 ~]# docker pull centos

[root@node2 ~]# docker run -it centos:latest /bin/bash

ping node1 中容器的ip地址

[root@895f8b11ce4a /]# ping 172.20.3.2
PING 172.20.3.2 (172.20.3.2) 56(84) bytes of data.
64 bytes from 172.20.3.2: icmp_seq=1 ttl=60 time=0.821 ms
64 bytes from 172.20.3.2: icmp_seq=2 ttl=60 time=0.562 ms
^C
--- 172.20.3.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.562/0.691/0.821/0.132 ms

node1 容器ping node2容器的ip地址

[root@node1 ~]# docker attach bc9
[root@bc9611f40b84 /]# ping 172.20.73.2
PING 172.20.73.2 (172.20.73.2) 56(84) bytes of data.
64 bytes from 172.20.73.2: icmp_seq=1 ttl=60 time=0.749 ms
64 bytes from 172.20.73.2: icmp_seq=2 ttl=60 time=0.723 ms
64 bytes from 172.20.73.2: icmp_seq=3 ttl=60 time=0.706 ms
^C
--- 172.20.73.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.706/0.726/0.749/0.017 ms

总结,工作原理

1.使用flanner为docker主机(宿主)分配网段

2.网段的信息以及ip的信息保存在etcd数据库中

3.当flanner开始运行的时候,会从etcd数据库中读取{"Network":"172.20.0.0/16"}随机为当前的主机添加一个flannel0网课172.20.78.0

4.配置docker的daemon文件,让docker0网卡变成和flannel的网段一致,之后docker下创建的容器的ip就在flannel的网段控制之内

1.3 weave

Weave的思路:

在每个宿主机上布置一个特殊的route的容器,不同宿主机的route容器连接起来。route拦截所有普通容器的ip请求,并通过udp包发送到其他宿主机上的普通容器。这样在跨机的多个容器端看到的就是同一个扁平网络。

weave解决了网络问题,不过部署依然是单机的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值