黑马程序员技术交流社区

标题: 【上海校区】--Docker学习进阶--中篇 [打印本页]

作者: xiaozuoquan    时间: 2018-10-11 15:30
标题: 【上海校区】--Docker学习进阶--中篇
本帖最后由 xiaozuoquan 于 2018-10-11 16:08 编辑

5.2 列出当前主机网桥

[AppleScript] 纯文本查看 复制代码
$ sudo brctl show # brctl 工具依赖 bridge-utils 软件包 bridge name bridge id STP enabled interfaces

docker0 8000.000000000000 no

5.3 查看当前 docker0 ip

[AppleScript] 纯文本查看 复制代码
$ 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

在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到 docker0
每个容器都会配置同 docker0 ip 相同网段的专用 ip 地址,docker0 IP 地址被用于所有容器的默认网关。

5.4 运行一个容器

[AppleScript] 纯文本查看 复制代码
$ sudo docker run -t -i -d ubuntu /bin/bash

52f811c5d3d69edddefc75aff5a4525fc8ba8bcfa1818132f9dc7d4f7c7e78b4

$ sudo brctl show

bridge name bridge id STP enabled interfaces

docker0 8000.fef213db5a66 no vethQCDY1N

以上, docker0 扮演着 52f811c5d3d6 container 这个容器的虚拟接口 vethQCDY1N interface 桥接的角色。

使用特定范围的 IP

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

基本步骤如下:

ensure Docker is stopped  #  确保 docker 的进程是停止的
create your own bridge (bridge0 for example) #  创建自定义网桥
assign a specific IP to this bridge #  给网桥分配特定的 ip
start Docker with the -b=bridge0 parameter #  -b 的方式指定网桥

[AppleScript] 纯文本查看 复制代码
# Stopping Docker and removing docker0 

$ sudo service docker stop

$ sudo ip link set dev docker0 down

$ sudo brctl delbr docker0

$ sudo brctl addbr bridge0

$ sudo ip addr add 192.168.5.1/24 dev bridge0

$ sudo ip link set dev bridge0 up # 确认我们的桥正在运行

$ 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



# Tell Docker about it and restart (on Ubuntu)

$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker

$ sudo service docker start

5.5 不同主机间容器通信

不同容器之间的通信可以借助于 pipework 这个工具:
[AppleScript] 纯文本查看 复制代码
$ git clone https://github.com/jpetazzo/pipework.git

$ sudo cp -rp pipework/pipework /usr/local/bin/

安装相应依赖软件

[AppleScript] 纯文本查看 复制代码
$ sudo apt-get install iputils-arping bridge-utils -y

桥接网络
[AppleScript] 纯文本查看 复制代码
# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.000c291412cd       no              eth0

docker0         8000.56847afe9799       no              vetheb48029

可以删除 docker0,直接把 docker 的桥接指定为 br0
也可以保留使用默认的配置,这样单主机容器之间的通信可以通过 docker0,而跨主机不同容器之间通
pipework 新建 docker 容器的网卡桥接到 br0,这样跨主机容器之间就可以通信了。

· ubuntu
[AppleScript] 纯文本查看 复制代码
$ sudo service docker stop

$ sudo ip link set dev docker0 down

$ sudo brctl delbr docker0

$ echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker

$ sudo service docker start
· CentOS 7/RHEL 7
[AppleScript] 纯文本查看 复制代码
$ sudo systemctl stop docker

$ sudo ip link set dev docker0 down

$ sudo brctl delbr docker0

$ cat /etc/sysconfig/docker | grep 'OPTIONS='

OPTIONS=--selinux-enabled -b=br0 -H fd://

$ sudo systemctl start docker

pipework

不同容器之间的通信可以借助于 pipework 这个工具给 docker 容器新建虚拟网卡并绑定 IP 桥接到 br0

[AppleScript] 纯文本查看 复制代码
$ git clone https://github.com/jpetazzo/pipework.git

$ sudo cp -rp pipework/pipework /usr/local/bin/

$ pipework

Syntax:

pipework <hostinterface> [-i containerinterface] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]

pipework <hostinterface> [-i containerinterface] <guest> dhcp [macaddr][@vlan]

pipework --wait [-i containerinterface]


如果删除了默认的 docker0 桥接,把 docker 默认桥接指定到了 br0,则最好在创建容器的时候加上--net=none,防止自动分配的 IP 在局域网中有冲突。

[AppleScript] 纯文本查看 复制代码
$ sudo docker run --rm -ti --net=none ubuntu:14.04 /bin/bash

$ sudo docker  ps

CONTAINER ID    IMAGE          COMMAND       CREATED         STATUS          PORTS      NAMES

a46657528059    ubuntu:14.04   "/bin/bash"   4 minutes ago   Up 4 minutes               hungry_lalande

$ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2

# 默认不指定网卡设备名,则默认添加为 eth1
# 另外 pipework 不能添加静态路由,如果有需求则可以在 run 的时候加上 --privileged=true 权限在容器中手动添加,
# 但这种安全性有缺陷,可以通过 ip netns 操作

[AppleScript] 纯文本查看 复制代码


root@a46657528059:/# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 86:b6:6b:e8:2e:4d  

          inet addr:192.168.115.10  Bcast:0.0.0.0  Mask:255.255.255.0

          inet6 addr: fe80::84b6:6bff:fee8:2e4d/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8 errors:0 dropped:0 overruns:0 frame:0

          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:648 (648.0 B)  TX bytes:690 (690.0 B)


[AppleScript] 纯文本查看 复制代码
root@a46657528059:/# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.115.2   0.0.0.0         UG    0      0        0 eth0

192.168.115.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

使用ip netns添加静态路由,避免创建容器使用--privileged=true选项造成一些不必要的安全问题:

[AppleScript] 纯文本查看 复制代码
$ docker inspect --format="{{ .State.Pid }}" a46657528059 # 获取指定容器 pid

6350

$ sudo ln -s /proc/6350/ns/net /var/run/netns/6350

$ sudo ip netns exec 6350 ip route add 192.168.0.0/16 dev eth0 via 192.168.115.2

$ sudo ip netns exec 6350 ip route    # 添加成功

192.168.0.0/16 via 192.168.115.2 dev eth0

在其它宿主机进行相应的配置,新建容器并使用 pipework 添加虚拟网卡桥接到 br0,测试通信情况即可。







作者: 不二晨    时间: 2018-10-15 16:07
奈斯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2