操作系统CentOS7.0下docker 网络配置(root用户下操作)

docker run 桥接 docker配置桥接网络_运维

Dokcer 通过使用 Linux 桥接提供容器之间的通信,默认会创建一个名为docker0的虚拟网桥,docker0 桥接接口的目的就是方便 Docker 管理。当 Docker daemon 启动时需要做以下操作:

  • creates the docker0 bridge if not present
  • # 如果 docker0 不存在则创建
  • searches for an IP address range which doesn’t overlap with an existing route
  • # 搜索一个与当前路由不冲突的 ip 段
  • picks an IP in the selected range
  • # 在确定的范围中选择 ip
  • assigns this IP to the docker0 bridge
  • # 绑定 ip 到 docker0

一、Docker 网络模式

Docker 网络模式有4种方式:

  • host 模式,使用 --net=host 指定。
  • container 模式,使用 --net=container:NAMEorID 指定。
  • none 模式,使用 --net=none 指定。
  • bridge 模式,使用 --net=bridge 指定,默认设置。

 

1、host 模式
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

例如,我们在 10.10.101.105/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用 10.10.101.105:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

2、container 模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

3、none模式
这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

4、bridge模式

docker run 桥接 docker配置桥接网络_运维_02

bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)

二、bridge模式单个容器网络配置

1、docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式。

如:#docker run  -t -i --net=host  centos /bin/bash

2、查看当前docker0 IP

#ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
         inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
         inet6 fe80::42:5ff:fe41:f224  prefixlen 64  scopeid 0x20<link>
         ether 02:42:05:41:f2:24  txqueuelen 0  (Ethernet)


        ...

3、运行容器,显示docker bridge信息

#  docker run -t -i -d centos /bin/bash
 df4c9a3bc46a213c3748040f5c153616ab887249679f0f561a5e72e10c64e232# brctl show
 bridge name     bridge id               STP enabled     interfaces
 docker0         8000.02420541f224       no              veth7b9fa72
 (brctl工具需要安装,安装bridge-utils软件包,#yum install bridge-utils)

三、bridge模式多容器网络配置

# docker network inspect bridge 查看bridge配置的容器
...
 "Containers": {}...
# docker run -itd --name=container1 ImageName/ID //建一个新的container1 (容器名称)附加到bridge模块连接例表
...
 "Containers": {          
 "15cba058b1f69b5dabbdfbc46a20220129498cd98cd6dd4bce518261efcd795a": {           
 "Name": "container1",            
 "EndpointID": "2b0e71701ed7c22418095640d07aba52496bda8fe0045508e1d689bbb333c63c",  
 "MacAddress": "02:42:ac:11:00:03",              
 "IPv4Address": "172.17.0.3/16",            
 "IPv6Address": ""        
 },
  "841dd6e9bb53b74f69989b8e3ab37236fd30105723f2e077c2842520549ded05": {
   "Name": "kickass_jennings",
  "EndpointID": "9f7019a0acf476ed4a758bbc63081bd71a11a6183760c7c4e6fd64d6e3dea8f0",
                 "MacAddress": "02:42:ac:11:00:02",
                 "IPv4Address": "172.17.0.2/16",
                 "IPv6Address": ""
             }
         },
 }
 ...# docker attach container1 //进入container1容器
 [root@15cba058b1f6 /]# ls /sbin |grep ifconfig
 [root@15cba058b1f6 /]# yum search ifconfig
 [root@15cba058b1f6 /]# yum install net-tools.x86_64
 [root@15cba058b1f6 /]# ifconfig
 [root@15cba058b1f6 /]# ping -w3 172.17.0.2 //不同容器之间网络是否通...
 ff02::2 ip6-allrouters
 172.17.0.2      841dd6e9bb53

三、使用特定范围的 IP

1、新建bridge网桥

# docker network create --driver bridge isolated_nw //创建一个新bridge
 # docker network inspect isolated_nw //查询新bridge配置
 # docker network ls  //查询有几个bridge
 # docker run --network=isolated_nw -itd --name=container3 ImageName/ID //创建新的容器放入到新的bridge,启动新的容器
 # docker network inspect isolated_nw //查询新bridge配置

Docker 会尝试寻找没有被主机使用的 ip 段,尽管它适用于大多数情况下,但是它不是万能的,有时候我们还是需要对 ip 进一步规划。Docker 允许你管理 docker0 桥接或者通过-b选项自定义桥接网卡,需要安装bridge-utils软件包。

基本步骤如下:
1、确保 docker 的进程是停止的 (ensure Docker is stopped)
2、 创建自定义网桥(create your own bridge (bridge0 for example))
3、给网桥分配特定的 ip(assign a specific IP to this bridge)
4、 以 -b 的方式指定网桥(start Docker with the -b=bridge0 parameter)

//停止Docker 并删除 docker0
 # service docker stop (systemctl stop docker.service)
 # ip link set dev docker0 down 
 # brctl delbr docker0            // Create our own bridge 
 # brctl addbr bridge0 
 # ip addr add 192.168.5.1/24 dev bridge0 
 # ip link set dev bridge0 up     // Confirming that our bridge is up and running 
 # ip addr show bridge0
 bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
     link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
     inet 192.168.5.1/24 scope global bridge0
     valid_lft forever preferred_lft forever 
 //Tell Docker about it and restart (on Ubuntu) 
 # 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker 
 # service docker start (systemctl start docker.service)

五、不同主机间容器通信

docker run 桥接 docker配置桥接网络_python_03


不同容器之间的通信可以借助于 pipework 这个工具:

第一步:
 # yum -y install git
 第二步:
 # git clone https://github.com/jpetazzo/pipework.git
 第三步:
 # cp -rp pipework/pipework /usr/local/bin/
 第四步:查看images
 # docker images
 # systemctl stop docker
 # ip link set dev docker0 down
 # brctl delbr docker0
 # cat /etc/sysconfig/docker | grep 'OPTIONS='OPTIONS=--selinux-enabled -b=br0 -H fd://
 第五步:配置bridge
 # brctl addbr br0
 # ip link set dev br0 up
 # ip addr add 192.168.115.1/24 dev br0
 # ORACLE=$(docker run -d -p 22 -p 1521:1521 2c4372b5fb84)
 # pipework br0 $ORACLE 192.168.115.2/24