3. Docker Networking

Docker Networking

本文基于马哥的docker和k8s视频总结, 在此致谢马哥.

Net名称空间主要用于: 隔离协议栈

docker network ls
NETWORK ID          NAME             DRIVER            SCOPE
b0c512d53352        bridge           bridge            local # bridge <=> docker0
9a33978f0f9c        host             host              local # 使用宿主机的网络
44dbf221814d        none             null              local # 不使用网络

ip addr show docker0 # docker0是一个二层交换机, 也可以扮演二层的网卡
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:89:71:6b:33 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
docker container run --name b1 -it busybox
docker container run --name b2 -it busybox
# 同时开启两个container, 然后用工具查看会发现模拟出了两对网卡
yum -y install bridge-utils
brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.024289716b33   no      veth33f3a68
                                        veth7a11ca8
virbr0      8000.5254004fa410   yes     virbr0-nic
# 两对网卡都是一半插在作为bridge的docker0上, 另外一半插在container上
ip link show
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:89:71:6b:33 brd ff:ff:ff:ff:ff:ff
7: veth7a11ca8@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether f2:a4:a4:4d:5e:4e brd ff:ff:ff:ff:ff:ff link-netnsid 0
9: veth33f3a68@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 9a:52:69:c4:5f:73 brd ff:ff:ff:ff:ff:ff link-netnsid 1
# docker0默认是SNAT桥
iptables -t nat -vnL
Chain POSTROUTING (policy ACCEPT 20 packets, 1498 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

docker的四种网络模型

docker四种网络模型.png
# 查看bridge的详细信息
docker network inspect bridge
# 可以在创建容器时指定主机名和网络, 挂载的文件系统和pid
docker contain run --help
  -h, --hostname string  Container host name
  --network network      Connect a container to a network
  --mount mount          Attach a filesystem mount to the container
  --pid string           PID namespace to use

docker容器网络

手动操作名称空间

  • 利用ip命令和网络名称空间模拟虚拟机上的网络, 可用于测试
yum -y install iproute
# ip命令可以操作netns对象
ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID # 设置网络名称空间的SID
       ip [-all] netns delete [NAME] 
         # 删除ns时会将其中的虚拟网卡(包括另一块网卡)一同删除
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ... # 在网络名称空间中执行命令
       ip netns monitor
       ip netns list-id
ip netns add r1 # 新建网络名称空间r1
ip netns add r2 # 新建网络名称空间r2
ip netns list

ip netns exec r1 ifconfig -a # 此时netns中均没有除lo外的网卡
ip netns exec r2 ifconfig -a
lo: flags=8<LOOPBACK>  mtu 65536
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 创建虚拟网卡对, veth: 虚拟以太网网卡
ip link add name veth1.1 type veth peer name veth1.2 
  # 这对虚拟网卡的一块名为veth1.1, 另一块作为它的同伴名为veth1.2
ip link show
ifconfig # 因新建的虚拟网卡对默认没有被激活, 此处无法显示
# 将新建的虚拟网卡对中的veth1.2挪到网络名称空间r1中, 挪过去之后默认没有被激活
ip link set dev veth1.2 netns r1
# 此时veth1.1留在宿主机中, 相当于宿主机上有一块虚拟网卡与r1上的网卡连接
ip netns exec r1 ifconfig -a # 可以查看到挪过来的veth1.2
ip netns exec r1 ip link set dev veth1.2 name eth0 # 可以将r1中的veth1.2改名为eth0
# 可以将这对网卡分别激活
ifconfig veth1.1 10.1.0.1/24 up # 激活宿主机侧虚拟网卡
ip netns exec r1 ifconfig eth0 10.1.0.2/24 up # 激活网络名称空间r1侧虚拟网卡
ping 10.1.0.2 # 用宿主机侧虚拟网卡ping r1中的虚拟网卡, 此时网络联通
# 也可以将veth1.1挪至r2中
ip link set dev veth1.1 netns r2
ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up
# 此时r1上的veth1.2和r2上的veth1.1可以互ping, 说明网络联通
ip netns exec r1 ping 10.1.0.3
bridge container.png

开放网络实现端口暴露

inbound: n. 入站 adj. 入境的; 归本国的; 回内地的

open inbound communication.png
open inbound communication 1.png
docker contain run --name myweb --rm -p 80 busybox:latest 
  # 暴露出了容器myweb上的80端口, 但映射到宿主机上的端口随机
iptable -t nat -nvL 
  # 此时做了一个DNAT, 外部可以访问宿主机的对应随机端口, 被转发至虚拟机的80端口
curl 172.20.0.67:32769
# 可自行指定宿主机上的启动端口
docker port myweb # 显示指定容器上的端口映射
docker container run --name myweb --rm -p 172.20.0.67:80:80 busybox:latest 
  # 此处指定了宿主机ip172.20.0.67, 端口80映射到容器的80端口
  # 而不是宿主机的0.0.0.0 (所有可用地址)上的80端口映射到容器的80端口

联盟式容器

  • 让两个容器共享同一个网络名称空间
  • 实质是共享IPC, Net, UTS, 但各自的PID, Mount, User还是独立的
联盟式容器.png

容器间网络共享

docker container run --name b1 -it busybox
docker container run --name b2 --nerwork container:b1 -it busybox 
  # b2共享b1的网络名称空间, 但两者的文件系统等还是隔离的
# 此时两者的ip相同, 可用ipconfig测试
# 但两者的文件系统还是隔离的, 可测试:
# b1上ls /tmp和b2上ls /tmp, 其中的内容不同

容器与宿主机间网络共享

docker container run --name b2 --nerwork host -it busybox # 直接共享宿主机的网络空间
ifconfig # 验证, 会发现容器的ip地址与宿主机的ip地址相同

自定义默认docker0桥网络信息

自定义docker0桥网络信息.png
  • 修改完之后重启docker服务, 使自定义网络信息生效

如何使用docker远程连接其他docker daemon

  • 默认不可以远程连接控制, 需要开启配置
  • 本地控制: 默认使用unix的套接字/var/run/docker.socket
  • 外部docker控制: 需要在/etc/docker/daemon.json中添加hosts项的tcp连接
docker连接.png
docker -H 172.20.0.67:2375 ps # 本地可以远程控制ip:port为172.20.0.67:2375的远端docker服务
docker -H 172.20.0.67:2375 image ls

如何创建自定义桥

docker info | grep Network # 查看docker支持的网络插件
  Network: bridge host ipvlan macvlan null overlay

docker network create [OPTIONS] NETWORK

dockere network create -d bridge \ 
                       --subnet "172.26.0.0/16" \ 
                       --gateway "172.26.0.1" \
                       mybr0
docker network ls
ifconfig # 注意, 自定义的网桥名称和新建的网络接口名称不一致, 可以改名
ip link set dev br-3291c2ff6eb name docker1

# 新建容器时加入mybr0的网路
docker container run --name t1 -it --network mybr0 busybox:latest

# 两个不同网段的容器间通信, 需要在宿主机上开启ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/ip_forward.conf
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,622评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,716评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,746评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,991评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,706评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,036评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,029评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,203评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,725评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,451评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,677评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,161评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,857评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,266评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,606评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,407评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,643评论 2 380

推荐阅读更多精彩内容