docker 网络

打印 上一主题 下一主题

主题 580|帖子 580|积分 1740

一、docker网络
1、当地网络
bridge
全部容器连接到桥就可以利用外网,利用nat让容器可以访问外网,利用ip a s指令检察桥,全部容器连接到此桥,ip地址都是172.17.0.0/16网段,桥是启动docker服务后出现,在centos利用bridge-utils安装
host
与主机共享网络,可让容器连接外网
全部容器与docker主机在同一个网络中,容器和外网相互访问
主机名同真机,网络也同真机
优点:可以直接访问容器
缺点:端口占用,多容器同时运行一个服务,不建议,在测试情况中利用none
none
容器仅仅有lo网卡,不能与外界链接,在高级应用中利用,lo网卡,无法链接外网
[root@docker ~]# docker run -d -p80:80 centos:nginx
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS                                       NAMES
85159a39e78e   centos:nginx      "/bin/sh -c /usr/sbi…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp           suspicious_booth
检察IP地址
[root@docker ~]# docker inspect 85|grep IPAdd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
 [root@docker ~]# yum -y install bridge-utils
[root@docker ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024290152bb2    no        veth6cae504
[root@docker ~]# systemctl restart docker
利用docker network 检察桥连接
[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bf8ef571c9a3   bridge    bridge    local
c6c78e892e49   host      host      local
9b3efd91b62e   none      null      local
每一台dcoker host上的docker0地点网段完全一样,但是会造成跨主机的容器无法通信,
[root@docker ~]# docker run -it centos:latest /bin/bash
[root@0c3409faae51 /]# [root@docker ~]# 
[root@docker ~]# docker run -it centos:latest /bin/bash
[root@45f35443c3f3 /]# 
[root@docker ~]# docker run -it --network host centos:latest /bin/bash
[root@docker ~]# docker run -it --network host centos:latest /bin/bash
[root@docker ~]# docker ps 
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
ce1dd35a8b69   centos:latest   "/bin/bash"   2 minutes ago   Up 2 minutes             zen_galois
45f35443c3f3   centos:latest   "/bin/bash"   4 minutes ago   Up 4 minutes             keen_mclaren
0c3409faae51   centos:latest   "/bin/bash"   5 minutes ago   Up 5 minutes             cool_beaver
[root@docker ~]# docker inspect ce
[root@docker ~]# docker run -it --network host centos:yum /bin/bash
[root@docker /]# ls
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@docker /]# yum -y install iproute
[root@docker /]# yum -y install httpd
[root@docker /]# echo "abxxcxss" > /var/www/html/index.html
[root@docker /]# systemctl start httpd
[root@docker /]# httpd -k start
[root@docker /]# curl 192.168.8.196
abxxcxss
 2、同盟网络 容器网络
共享网络命名空间
3、跨主机容器之间通讯 
工具 pipwork   flannel
overlay覆盖型网络,不支持路由转发,通过数据etcd数据库生存子网信息以及网络分配信息,给每台主机分配一个网段,通过udp传输数据包
flannel的思路
FlInnel是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作为转发协议是由于他能穿透防火墙。
weave
Weave的思路
在每个宿主机上布置一个特别的route的容器,差别宿主机的route容器连接起来。route拦截全部普通容器的ip请求,并通过udp包发送到其他宿主机上的普通容器。这样在跨机的多个容器端看到的就是同一个扁平网络。
weave解决了网络问题,不外部署依然是单机的。
主机名    IP    功能    软件
node1    192.168.8.197    主控主机    etcd flannel docker
node2    192.168.8.198    被控主机    etcd docker
1.node1安装flannel 和etcd 
[root@node1 ~]# yum -y install flannel etcd 
2.node2 安装flannel
[root@node2 ~]# yum -y install flannel 
3. 设置启动etcd并启动服务
[root@node1 ~]# vim /etc/etcd/etcd.conf 
  6 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
 21 ETCD_ADVERTISE_CLIENT_URLS="http://192.168.8.197:2379,http://192.168.8.197:4001"
 [root@node1 ~]# systemctl start etcd  #启动服务
[root@node1 ~]# netstat -lnput | grep 2379
tcp6       0      0 :::2379                 :::*                    LISTEN      1320/etcd           
[root@node1 ~]# netstat -lnput | grep 4001
tcp6       0      0 :::4001                 :::*                    LISTEN      1320/etcd           
[root@node1 ~]# systemctl enable etcd
4. 测试数据库功能
[root@node1 ~]# etcdctl set testdir/testkey0 1000
1000
[root@node1 ~]# etcdctl get testdir/testkey0
1000 
5. 测试集群健康
[root@node1 ~]# etcdctl -C http://192.168.8.197:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.8.197:2379
cluster is healthy
6. 修改flannel设置文件
[root@node1 ~]# vim /etc/sysconfig/flanneld 
  4 FLANNEL_ETCD_ENDPOINTS="http://192.168.8.197:2379"
[root@node1 ~]# etcdctl set b 123
123
[root@node1 ~]# etcdctl get b
123
7. 向数据库中存入网段信息
[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" }
[root@node1 ~]# systemctl start flanneld
[root@node1 ~]# systemctl enable flanneld
[root@node1 ~]# ip a s
3: flannel0: <OINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 172.20.59.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::a81c:32fa:5cba:6000/64 scope link flags 800 
       valid_lft forever preferred_lft forever
 8. 安装docker并启动 
[root@node1 ~]# systemctl start docker
3: flannel0: <OINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 172.20.59.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::a81c:32fa:5cba:6000/64 scope link flags 800 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:8a:18:0b:be 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
9. 检察flannel子网IP
[root@node1 ~]# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.59.1/24  
FLANNEL_MTU=1472  #最大连接数
FLANNEL_IPMASQ=false
10. 设置daemon.json文件 
从其他主机复制文件
[root@node1 ~]# scp root@192.168.8.196:/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.197:5000"
        ],
        "bip" : "172.20.59.1/24",
        "mtu" : 1472
}
[root@node1 ~]# systemctl restart docker
3: flannel0: <OINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 172.20.59.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::a81c:32fa:5cba:6000/64 scope link flags 800 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1472 qdisc noqueue state DOWN group default 
    link/ether 02:42:8a:18:0b:be brd ff:ff:ff:ff:ff:ff
    inet 172.20.59.1/24 brd 172.20.59.255 scope global docker0
       valid_lft forever preferred_lft forever
[root@node1 ~]# docker pull centos
[root@node1 ~]# docker run -it centos:latest /bin/bash
[root@48b7a5f0f8a2 /]# [root@node1 ~]# 
[root@node1 ~]# docker inspect 48b | grep IPAdd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.20.59.2",
                    "IPAddress": "172.20.59.2",
11. 设置被控主机 
1.安装flannel
2.设置flanner 设置flannel要访问的etcd数据库地点的位置
3.启动fiannel
4.检察flannel分配的ip网段
5.安装docker
6.将flannel分配的网段写入到daemon.json
7.启动docker
8.拉去一个centos镜像
9.ping node1 中容器的IP地址
[root@node2 ~]# vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.8.197:2379"
[root@node2 ~]# systemctl start flanneld
[root@node2 ~]# ip a s
3: flannel0: <OINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet 172.20.62.0/16 scope global flannel0
[root@node2 ~]# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.62.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
[root@node1 ~]# scp docker.sh root@192.168.8.198:~/
[root@node2 ~]# scp root@192.168.8.197:/etc/docker/daemon.json /etc/docker/
[root@node2 ~]# vim /etc/docker/daemon.json 
        "bip" : "172.20.62.1/24",
        "mtu" : 1472
[root@node2 ~]# vim /usr/lib/systemd/system/docker.service

[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1472 qdisc noqueue state DOWN group default 
    link/ether 02:42:32:32:6b:d6 brd ff:ff:ff:ff:ff:ff
    inet 172.20.62.1/24 brd 172.20.62.255 scope global docker0
       valid_lft forever preferred_lft forever
[root@node2 ~]# docker pull centos
[root@node2 ~]# docker run -it centos:latest /bin/bash
[root@5f99ad122f73 /]# [root@node2 ~]# 
[root@node2 ~]# docker inspect   5f| grep IPAdd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.20.62.2",
                    "IPAddress": "172.20.62.2",
[root@node2 ~]# ping 172.20.59.2
PING 172.20.59.2 (172.20.59.2) 56(84) bytes of data.
64 bytes from 172.20.59.2: icmp_seq=1 ttl=61 time=1.08 ms
64 bytes from 172.20.59.2: icmp_seq=2 ttl=61 time=0.505 ms
64 bytes from 172.20.59.2: icmp_seq=3 ttl=61 time=0.456 ms
[root@node1 ~]# ping 172.20.62.2
PING 172.20.62.2 (172.20.62.2) 56(84) bytes of data.
64 bytes from 172.20.62.2: icmp_seq=1 ttl=61 time=0.670 ms
64 bytes from 172.20.62.2: icmp_seq=2 ttl=61 time=0.341 ms
4、总结,工作原理
1.利用flanner为docker主机(宿主)分配网段
2.网段的信息以及ip的信息生存在etcd数据库中
3.当flanner开始运行的时间,会从etcd数据库中读取{"Network":"172.20.0.0/16"},随机为当前的主机添加一个flannel0网卡172.20.59.0
4.设置docker 的daemon文件,让docker0网卡变成flannel的网段同等,之后docker向创建的容器IP就在flannel网段控制之内

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表