2014-09-05 16:18:02 +08:00
|
|
|
|
##多台物理主机之间的容器互联(暴露容器到真实网络中)
|
|
|
|
|
docker 默认的桥接网卡是docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做veth*** 而docker只是把所有这些网卡桥接在一起,如下:
|
|
|
|
|
```
|
2014-09-17 14:52:55 +08:00
|
|
|
|
[root@opnvz ~]# brctl show
|
2014-09-05 16:18:02 +08:00
|
|
|
|
bridge name bridge id STP enabled interfaces
|
|
|
|
|
docker0 8000.56847afe9799 no veth0889
|
|
|
|
|
veth3c7b
|
|
|
|
|
veth4061
|
|
|
|
|
```
|
|
|
|
|
在容器中看到的地址一般是像下面这样的地址:
|
|
|
|
|
```
|
|
|
|
|
root@ac6474aeb31d:~# ip a
|
2014-09-17 14:52:55 +08:00
|
|
|
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
|
2014-09-05 16:18:02 +08:00
|
|
|
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|
|
|
|
inet 127.0.0.1/8 scope host lo
|
|
|
|
|
valid_lft forever preferred_lft forever
|
2014-09-17 14:52:55 +08:00
|
|
|
|
inet6 ::1/128 scope host
|
2014-09-05 16:18:02 +08:00
|
|
|
|
valid_lft forever preferred_lft forever
|
|
|
|
|
11: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
|
|
|
|
link/ether 4a:7d:68:da:09:cf brd ff:ff:ff:ff:ff:ff
|
|
|
|
|
inet 172.17.0.3/16 scope global eth0
|
|
|
|
|
valid_lft forever preferred_lft forever
|
2014-09-17 14:52:55 +08:00
|
|
|
|
inet6 fe80::487d:68ff:feda:9cf/64 scope link
|
2014-09-05 16:18:02 +08:00
|
|
|
|
valid_lft forever preferred_lft forever
|
|
|
|
|
```
|
|
|
|
|
这样就可以把这个网络看成是一个私有的网络,通过nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即-p参数(更多原理参见本文第六小节)
|
2014-09-21 20:50:55 +08:00
|
|
|
|
如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。
|
2014-09-05 16:18:02 +08:00
|
|
|
|
|
|
|
|
|
###拓扑图
|
|
|
|
|
主机A和主机B的网卡一都连着物理交换机的同一个vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一vlan中的其他物理机器互联。
|
2014-09-17 14:52:55 +08:00
|
|
|
|
![物理拓扑图](../_images/container_connect_topology.png)
|
2014-09-05 16:18:02 +08:00
|
|
|
|
|
|
|
|
|
###ubuntu示例
|
|
|
|
|
下面以ubuntu为例创建多个主机的容器联网:
|
|
|
|
|
创建自己的网桥,编辑/etc/network/interface文件
|
|
|
|
|
```
|
|
|
|
|
auto br0
|
|
|
|
|
iface br0 inet static
|
|
|
|
|
address 192.168.7.31
|
|
|
|
|
netmask 255.255.240.0
|
|
|
|
|
gateway 192.168.7.254
|
|
|
|
|
bridge_ports em1
|
|
|
|
|
bridge_stp off
|
|
|
|
|
dns-nameservers 8.8.8.8 192.168.6.1
|
|
|
|
|
```
|
|
|
|
|
将docker的默认网桥绑定到这个新建的br0上面,这样就将这台机器上容器绑定到em1这个网卡所对应的物理网络上了。
|
|
|
|
|
|
|
|
|
|
ubuntu修改/etc/default/docker文件 添加最后一行内容
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
# Docker Upstart and SysVinit configuration file
|
|
|
|
|
# Customize location of Docker binary (especially for development testing).
|
|
|
|
|
#DOCKER="/usr/local/bin/docker"
|
|
|
|
|
# Use DOCKER_OPTS to modify the daemon startup options.
|
|
|
|
|
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
|
|
|
|
|
|
|
|
|
|
# If you need Docker to use an HTTP proxy, it can also be specified here.
|
|
|
|
|
#export http_proxy="http://127.0.0.1:3128/"
|
|
|
|
|
|
|
|
|
|
# This is also a handy place to tweak where Docker's temporary files go.
|
|
|
|
|
#export TMPDIR="/mnt/bigdrive/docker-tmp"
|
|
|
|
|
|
|
|
|
|
DOCKER_OPTS="-b=br0"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在启动docker的时候 使用-b参数 将容器绑定到物理网络上。重启docker服务后,再进入容器可以看到它已经绑定到你的物理网络上了。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
root@ubuntudocker:~# docker ps
|
|
|
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
2014-09-17 14:52:55 +08:00
|
|
|
|
58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx
|
2014-09-05 16:18:02 +08:00
|
|
|
|
root@ubuntudocker:~# brctl show
|
|
|
|
|
bridge name bridge id STP enabled interfaces
|
|
|
|
|
br0 8000.7e6e617c8d53 no em1
|
|
|
|
|
vethe6e5
|
|
|
|
|
```
|
2014-09-17 14:52:55 +08:00
|
|
|
|
这样就直接把容器暴露到你的物理网络上了,多台物理主机的容器也可以相互联网了。需要注意的是,这样就需要自己来保证容器的网络安全了。
|