Docker网络详解

refs:

http://blog.youkuaiyun.com/wsscy2004/article/details/25887785


主要是想把虚拟网卡关闭,

使用指令

$ sudo ifconfig docker0 down

-------------------------------------------------------------------------------------

其他:


Docker网络详解

转载请注明来自:http://blog.youkuaiyun.com/wsscy2004

网络基础

Docker使用linux桥接,在主机虚拟一个docker0网络接口,在主机中运行命令查看:

# List host bridges
$ sudo brctl showbridge      
name    bridge id               STP enabled     interfaces
docker0             8000.000000000000       no

# Show docker0 IP address
$ sudo ifconfig docker0
docker0   Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
     inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

docker启动一个container时会会根据docker0的网段划分container的IP,docker0是每个container的网关。

自定义网络范围

尽管docker在使用linux brigde会找最合适的。但是有时候我们还是需要自己规划。
使用-b=<bridgename>参数设置

# 先关闭docker
$ sudo service docker stop

# 关闭网桥docker0# 添加自己的网桥bridge0
$ sudo ifconfig docker0 down
$ sudo brctl addbr bridge0
$ sudo ifconfig bridge0 192.168.227.1 netmask 255.255.255.0

# 向Docker startup file中添加启动自定义网桥参数
$ echo "DOCKER_OPTS=\"-b=bridge0\"" >> /etc/default/docker

# 启动Docker
$ sudo service docker start

# 查看自定义网桥是否启动成功,ip等配置是否正确
$ sudo ifconfig bridge0
bridge0   Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.227.1  Bcast:192.168.227.255  Mask:255.255.255.0

# 启动container
docker run -i -t base /bin/bash

# 可以看到Container IP  在网段192.168.227/24内
root@261c272cd7d5:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.227.5  Bcast:192.168.227.255  Mask:255.255.255.0

# bridge0 IP as the default gateway# 查看路由信息
root@261c272cd7d5:/# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.227.1   0.0.0.0         UG    0      0        0 eth0
192.168.227.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

# hits CTRL+P then CTRL+Q to detach

# 查看网桥信息
$ sudo brctl show
bridge      name    bridge id               STP enabled     interfaces
bridge0             8000.fe7c2e0faebd       no              vethAQI2QT

container互通

docker默认是允许container互通,通过-icc=false关闭互通。
一旦关闭了互通,只能通过-link name:alias命令连接指定container.

container互相隔离的情况下,假设我们有一个webapp container,一个redis contianer需要互通。
先启动redis container:

sudo docker run -d --name redis crosbymichael/redis

再启动webapp并联通到redis

#将redis取别名为dbsudo docker run -t -i --link redis:db --name webapp ubuntu bash

在webapp中可以看到db的网络信息:

$ root@4c01db0b339c:/# env

HOSTNAME=4c01db0b339c
DB_NAME=/webapp/db
TERM=xterm
DB_PORT=tcp://172.17.0.8:6379
DB_PORT_6379_TCP=tcp://172.17.0.8:6379
DB_PORT_6379_TCP_PROTO=tcp
DB_PORT_6379_TCP_ADDR=172.17.0.8
DB_PORT_6379_TCP_PORT=6379
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/
container=lxc
_=/usr/bin/env
root@4c01db0b339c:/#

0.11版本以后,-- link redis:db的别名,会在/etc/hosts中生成对应的ip映射:

root@6541a75d44a0:/# cat /etc/hosts172.17.0.3  6541a75d44a0172.17.0.2  db

什么是vethxxxx

# 查看网桥信息
$ sudo brctl show
bridge      name    bridge id               STP enabled     interfaces
docker0             8000.fe7c2e0faebd       no              vethAQI2QT

vethxxx是主机与container内部eth0相连的管道。详见ip linknamespaces infrastructure

更多

pipework可以创建各种复杂的containers互通的场景。详见here



### Docker 网络工作原理及配置详解 Docker 网络的工作原理涉及多种网络模式和配置方法,主要包括桥接网络(bridge)、主机网络(host)、无网络(none)以及覆盖网络(overlay)。以下是这些模式的详细工作原理及配置方法。 #### 1. 桥接网络(Bridge Network) 默认情况下,Docker 使用桥接网络模式。安装 Docker 后会自动创建一个名为 `bridge` 的默认网络[^2]。容器通过此网络与外部通信,并且每个容器会被分配一个独立的 IP 地址。 - **工作原理**: 桥接网络通过 NAT(网络地址转换)技术实现容器与宿主机之间的通信。容器启动时会被分配一个私有 IP 地址,并通过宿主机上的网桥设备(如 `docker0`)连接到外部网络。 - **配置方法**: ```bash # 创建自定义桥接网络 docker network create my_bridge_network # 启动容器并将其连接到指定的桥接网络 docker run --network=my_bridge_network -d nginx ``` #### 2. 主机网络(Host Network) 在主机网络模式下,容器共享宿主机的网络栈,不使用任何网络隔离。 - **工作原理**: 容器直接使用宿主机的网络接口,没有额外的网络命名空间。因此,容器中的进程可以直接绑定到宿主机的端口上,而无需进行端口映射。 - **配置方法**: ```bash # 启动容器并设置为主机网络模式 docker run --network=host -d nginx ``` #### 3. 无网络(None Network) 在这种模式下,容器没有任何网络功能,通常用于不需要网络访问的场景。 - **工作原理**: 容器被分配一个空的网络栈,无法与其他容器或宿主机通信。 - **配置方法**: ```bash # 启动容器并设置为无网络模式 docker run --network=none -d busybox ``` #### 4. 覆盖网络(Overlay Network) 覆盖网络允许跨多个 Docker 主机的容器之间进行通信,通常用于 Swarm 集群环境。 - **工作原理**: 覆盖网络基于 VXLAN 协议实现,将二层网络封装在 UDP 包中传输,从而支持跨主机的容器通信[^3]。当容器需要通信时,Docker 引擎会查询集群中的 Key-Value 存储以获取目标容器所在主机的 IP 和 MAC 地址,并通过 VXLAN 封装数据包发送给目标主机。 - **配置方法**: ```bash # 初始化 Swarm 模式 docker swarm init # 创建覆盖网络 docker network create --driver=overlay my_overlay_network # 在 Swarm 中启动服务并连接到覆盖网络 docker service create --network=my_overlay_network nginx ``` ### 总结 Docker 网络提供了多种模式以满足不同的需求,包括桥接网络、主机网络、无网络和覆盖网络。每种模式都有其特定的工作原理和配置方法。根据实际应用场景选择合适的网络模式可以提高容器化应用的性能和安全性。 ```python # 示例代码:列出所有 Docker 网络 import subprocess def list_docker_networks(): result = subprocess.run(['docker', 'network', 'ls'], stdout=subprocess.PIPE) return result.stdout.decode('utf-8') print(list_docker_networks()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值