美文网首页
05、容器网络

05、容器网络

作者: 六弦极品 | 来源:发表于2019-05-13 19:57 被阅读0次

1. 网络模式

• bridge

--net=bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

• host –net=host

容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主
机的。容器除了网络,其他都是隔离的。

• none

--net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

• container

--net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。

• 自定义网络

与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。

# ip a      ### 172.17.0.1 是docker容器的网关,docker0就是所谓的网桥
.....
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:93:8e:5c:4a 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:93ff:fe8e:5c4a/64 scope link 
       valid_lft forever preferred_lft forever
                        .....
48: br-6607ee6831f7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:d5:de:e5:07 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-6607ee6831f7
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d5ff:fede:e507/64 scope link 
       valid_lft forever preferred_lft forever

# docker pull busybox
# docker run -it busybox   ## 容器会网络配置网段与网桥网段一致
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)
# docker run -it --net=host busybox  ## 容器里的网络配置与宿主机一致
# docker run -it --net=none busybox  ## 容器里没有网络配置,得手动配置

容器使用同一个network namespace网络命名空间
# docker run -itd --name bs -p 99:80 busybox
4aa4f32452a2a6c027b814fa514811042f676ed36de37660f79d457a97ab3400
# docker run -d --name nginx01 --net container:bs nginx
791ec39ed9eb00c5ac602ac77c072972924de5dd8f671c0aaf900b54f0cc8961
# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
791ec39ed9eb        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute                        nginx01
4aa4f32452a2        busybox             "sh"                     3 minutes ago        Up 3 minutes        0.0.0.0:99->80/tcp   bs
# docker exec -it bs sh     ## 进入bs容器
/ # netstat -ntlp   ## 查看bs网络监听端口为80,这80 是我们启动的nginx容器的80端口,请求bs的80 端口将返回nginx容器的内容
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -


自定义网络:
# docker network create bs-test  ## ip a 命令会看到宿主新建了一个新的网桥brxxx,这网桥的IP将是这个虚拟网络的网关
# docker run -it --name bs1 --net bs-test busybox
# docker run -it --name bs2 --net bs-test busybox
这时候在两个容器互ping 容器名或主机名都是通的 ping bs1

2. 容器网络访问原理

image.png

每创建一个容器在宿主机上都是创建一个vethxxxx 的虚拟配置对,这个是与容器的网络配对的,类似管道

# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.40.6.1       0.0.0.0         UG    100    0        0 eno16780032
10.40.6.0       0.0.0.0         255.255.254.0   U     100    0        0 eno16780032
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-6607ee6831f7
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-8ea0e6186e02
image.png

docker网络主要是利用iptalbes 实现
从容器到外部是源地址转发,外部到容器里是目标地转发

# iptables-save 
# Generated by iptables-save v1.4.21 on Tue May 14 22:01:47 2019
*nat
:PREROUTING ACCEPT [458:34774]
:INPUT ACCEPT [103:5876]
:OUTPUT ACCEPT [18:1152]
:POSTROUTING ACCEPT [18:1152]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.19.0.0/16 ! -o br-8ea0e6186e02 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-6607ee6831f7 -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER -i br-8ea0e6186e02 -j RETURN
-A DOCKER -i br-6607ee6831f7 -j RETURN
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 98 -j DNAT --to-destination 172.17.0.2:80
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 99 -j DNAT --to-destination 172.17.0.3:80
COMMIT
# Completed on Tue May 14 22:01:47 2019
# Generated by iptables-save v1.4.21 on Tue May 14 22:01:47 2019
*filter
:INPUT ACCEPT [597:374122]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [543:53853]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o br-8ea0e6186e02 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-8ea0e6186e02 -j DOCKER
-A FORWARD -i br-8ea0e6186e02 ! -o br-8ea0e6186e02 -j ACCEPT
-A FORWARD -i br-8ea0e6186e02 -o br-8ea0e6186e02 -j ACCEPT
-A FORWARD -o br-6607ee6831f7 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-6607ee6831f7 -j DOCKER
-A FORWARD -i br-6607ee6831f7 ! -o br-6607ee6831f7 -j ACCEPT
-A FORWARD -i br-6607ee6831f7 -o br-6607ee6831f7 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i br-8ea0e6186e02 ! -o br-8ea0e6186e02 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-6607ee6831f7 ! -o br-6607ee6831f7 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o br-8ea0e6186e02 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-6607ee6831f7 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Tue May 14 22:01:47 2019

3、桥接宿主机网络与配置固定IP地址

将容器网络与宿主机网络同一个网络,这个不建议这么做
临时生效:

# cat set_brnetwork.sh

br_name=br0   ## 网桥名
brctl addbr $br_name   ## 添加网桥
ip addr add 10.40.6.110/24 dev $br_name   ## 给网桥设置IP
ip addr del 10.40.6.110/24  dev eth0   ## 删除已存在的eth0 网卡配置
ip link set $br_name up   ## 激活网桥
brctl addif $br_name eth0   ##添加eth0到网桥
ip route add default via 10.40.6.1 dev $br_name  ## 添加路由

## 需要在docker 启动时桥接这个网桥:
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker -b=br0
#systemctl restart docker

永久生效:

# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.40.6.110
NETMASK=255.255.255.0
GATEWAY=10.40.6.1
DNS1=8.8.8.8

创建容器配置固定IP:
创建容器,如果没指定具体IP默认会从1开始分配IP,如:10.40.6.1,这IP其实是错误的
所以创建容器的时候指定不自动分配IP,后续再进入容器手动配置网络:
# docker run -itd --name bs3 --net none busybox

使用pipework工具配置容器固定IP:
# git clone https://github.com/jpetazzo/pipework.git
# mv pipework/pipework /usr/bin/
# pipework br0 bs3 10.40.6.112/24@10.40.6.1

相关文章

  • 05、容器网络

    1. 网络模式 • bridge --net=bridge 默认网络,Docker启动后创建一个docker0网桥...

  • docker 收录

    查看容器ip 传送文件 容器 -> 宿主 宿主 -> 容器 进入容器 错误日志查看 网络访问 容器访问宿主网络,输...

  • docker容器之间通讯-network

    docker为容器创建独立的网络环境,实现宿主和容器、容器之间的网络隔离,默认使用bridge模式的网络,实现容器...

  • 配置网络

    概述 容器网络是容器选择连接到其他容器、主机和外部网络的机制。容器的 runtime 提供了各种网络模式,每种模式...

  • 容器安全-容器网络

    1、docker network 从4种容器中各取一个来解释容器网络: 1、docker run --networ...

  • 容器(11)----容器网络

    Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时...

  • 容器网络

    1. 容器网络模式 1.1 bright 模式 1.2 host 模式 1.3 none模式 1.4 contai...

  • 容器网络

    容器网络 如何创建自定义网络、容器之间如何通信、容器如何与外界交互docker network ls 查看dock...

  • 容器网络

    和容器打交道感觉就像魔法。理解的人就会得心应手,不理解的会觉得很难。幸运的是,我们已经对容器技术有一定的掌握,甚至...

  • 容器网络

    网络栈”,就包括:网卡(Network Interface)、回环设备(Loopback Device)、路由表和...

网友评论

      本文标题:05、容器网络

      本文链接:https://www.haomeiwen.com/subject/sgzraqtx.html