前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Docker容器网络管理

Docker容器网络管理

原创
作者头像
Power
发布2025-03-03 11:36:37
发布2025-03-03 11:36:37
11200
代码可运行
举报
运行总次数:0
代码可运行

一、Docker单主机容器通信介绍

基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。

容器网络模式

. Docker支持5种网络模式

代码语言:javascript
代码运行次数:0
复制
(1)bridge:默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
(2)host:容器不会获得一个独立的network namespace,而是与宿主机共用一个。
(3)none:获取独立的network namespace,但不为容器进行任何网络配置。
(4)container:与指定的容器使用同一个network namespace,网卡配置也都是相同的。
(5)自定义:自定义网桥,默认与bridge网络一样。

. Bridge 桥接模式的实现

Docker网络管理(图1)
Docker网络管理(图1)

. Host 网络模式

Docker网络管理(图2)
Docker网络管理(图2)

. Container 网络模式

Docker网络管理(图3)
Docker网络管理(图3)

二、容器网络访问原理

2.1 Linux IP信息包过滤原理

Docker主要通过netfilter/iptables实现网络通信。iptables由netfilter和iptables组成,netfilter组件是Linux内核集成的信息包过滤系统,它维护一个信息包过滤表,这个表用于控制信息包过滤处理的规则集。而iptables只是一个在用户空间的工具,用于增删改查这个过滤表的规则。

filter(过滤)

INPUT、OUTPUT、FORWARD

nat(地址转换)

PREROUTING、POSTROUTING、OUTPUT

mangle(拆包、修改、封装)

INPUT、OUTPUT、PREROUTING、POSTROUTING、OUTPUT

raw(数据包状态跟踪)

PREROUTING、OUTPUT

Docker网络管理(图4)
Docker网络管理(图4)

2.2 容器网络解读

(1)容器访问外网

代码语言:javascript
代码运行次数:0
复制
[root@10-27-0-224 ~]# iptables -t nat -nL
……

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

……

(2)外部网络访问容器

代码语言:javascript
代码运行次数:0
复制
[root@10-27-0-224 ~]# iptables -t nat -nL
……

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
Docker网络管理(图7)
Docker网络管理(图7)

2.3 busybox容器测试

(1)准备busybox环境

【注】busybox默认安装的有网络工具

代码语言:javascript
代码运行次数:0
复制
[root@GZ /]# docker run -itd --name bs01 busybox                  # 创建容器bs01
05ac86c575c5c118d055742561efc1c1bf55f2786b22931b4f97a18f62b18858

[root@GZ /]# docker exec -it bs01 sh                              # 进入容器

# 查看bs01的ip地址

Docker网络管理(图6)
Docker网络管理(图6)

# 测试容器和互联网的连通性

Docker网络管理(图7)
Docker网络管理(图7)

# 查看iptables的表项和NAT表项

Docker网络管理(图10)
Docker网络管理(图10)

(2)SNAT容器访问外网

Docker网络管理(图11)
Docker网络管理(图11)

【注意】docker nat封装的是docker创建的网桥段。

# 查看容器路由表

Docker网络管理(图12)
Docker网络管理(图12)

# 查看宿主机docker网桥IP

Docker网络管理(图13)
Docker网络管理(图13)

(3)DNAT外网访问容器

代码语言:javascript
代码运行次数:0
复制
[root@GZ /]# docker run -itd --name nginx02 -p 88:80 nginx         # 不加-p也可手写规则
333b69283ef0e1a677add340325c2e4fe305f9a4a8cadb8f4e4c9f84e2233777
Docker网络管理(图14)
Docker网络管理(图14)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Docker单主机容器通信介绍
    • 容器网络模式
  • 二、容器网络访问原理
    • 2.1 Linux IP信息包过滤原理
    • 2.2 容器网络解读
    • 2.3 busybox容器测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档