Loading
0

docker网络技术剖析

映射到指定地址的任意端口
使用 ip::containerPort 绑定192.168.1.102的任意端口到容器的80端口,本地主机会自动分配一个口。--name为启动的容器指定一个容器名。

注:还可以使用 udp 标记来指定 udp 端口
# docker run -d -p127.0.0.1:5000:5000/udp –name db4 commit:v1
查看映射端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

Docker NAT iptables实现
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器

容器访问外部实现
容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址(即docker0地址)。这是使用 iptables 的源地址伪装操作实现的
查看主机的 NAT 规则
iptables -t nat -vnL

其中,上述规则将所有源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。

外部访问容器实现
容器允许外部访问,可以在 docker run 时候通过 -p 或 -P 参数来启用,不管用那种办法,其实也是在本地的iptable 的 nat 表中添加相应的规则
使用 -P 时:

iptables -t -nat -vnL

使用 -p 80:80时

iptables -t -nat -vnL

docker0  网桥
Docker服务默认会创建一个 docker0 网桥(其上有一个docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 默认指定了 docker0 接口的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 brctl show 来查看网桥和端口连接信息。

注:brctl 命令在centos中可以使用yum  install bridge-utils 来安装
每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的eth0端口。使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。


Docker网络配置
Docker 四种网络模式
docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:
host 模式,使用 --net=host 指定。
container 模式,使用 --net=container:NAMEorID 指定。
none 模式,使用 --net=none 指定。
bridge 模式,使用 --net=bridge 指定,默认设置。

host 模式
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
例如,我们在192.168.110.128/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.1.102:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
启动容器前,执行pgrep http查看宿主机httpd进程

上面显示结果说明宿主机没有httpd进程运行
用 host 模式启动一个含有 web 应用的 Docker 容器

分页阅读: 1 2 3 4 5 6 7 8
【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。