工具和示例

工具和示例

在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:

pipework

Jérôme Petazzoni 编写了一个叫 pipework 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。

playground

Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 Python库,包括路由、NAT 防火墙;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服务器。

编辑网络配置文件

Docker 1.2.0 开始支持在运行中的容器里编辑 /etc/hosts, /etc/hostname/etc/resolv.conf 文件。

但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被 docker commit 提交。

实例:创建一个点到点连接

默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中。

用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。

解决办法很简单:创建一对 peer 接口,分别放到两个容器中,配置成点到点链路类型即可。

首先启动 2 个容器:

  1. $ docker run -i -t --rm --net=none base /bin/bash
  2. root@1f1f4c1f931a:/#
  3. $ docker run -i -t --rm --net=none base /bin/bash
  4. root@12e343489d2f:/#

找到进程号,然后创建网络命名空间的跟踪文件。

  1. $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
  2. 2989
  3. $ docker inspect -f '{{.State.Pid}}' 12e343489d2f
  4. 3004
  5. $ sudo mkdir -p /var/run/netns
  6. $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
  7. $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004

创建一对 peer 接口,然后配置路由

  1. $ sudo ip link add A type veth peer name B
  2. $ sudo ip link set A netns 2989
  3. $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
  4. $ sudo ip netns exec 2989 ip link set A up
  5. $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
  6. $ sudo ip link set B netns 3004
  7. $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
  8. $ sudo ip netns exec 3004 ip link set B up
  9. $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B

现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码。

此外,也可以不指定 --net=none 来创建点到点链路。这样容器还可以通过原先的网络来通信。

利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用 --icc=false 来关闭容器之间的通信。

写于 2018年10月09日Docker 1274

如非特别注明,文章皆为原创。

转载请注明出处: https://www.liayal.com/article/5bbc792811e46b16e930c979

记小栈小程序上线啦~搜索【记小栈】【点击扫码】体验

你不想说点啥么?
😀😃😄😁😆😅😂🤣☺️😊😇🙂🙃😉😌😍😘😗😙😚😋😜😝😛🤑🤗🤓😎🤡🤠😏😒😞😔😟😕🙁☹️😣😖😫😩😤😠😡😶😐😑😯😦😧😮😲😵😳😱😨😰😢😥🤤😭😓😪😴🙄🤔🤥😬🤐🤢🤧😷🤒🤕😈👿👹👺💩👻💀☠️👽👾🤖🎃😺😸😹😻😼😽🙀😿😾👐👐🏻👐🏼👐🏽👐🏾👐🏿🙌🙌🏻🙌🏼🙌🏽🙌🏾🙌🏿👏👏🏻👏🏼👏🏽👏🏾👏🏿🙏🙏🏻🙏🏼🙏🏽🙏🏾🙏🏿🤝👍👍🏻👍🏼👍🏽👍🏾👍🏿👎👎🏻👎🏼👎🏽👎🏾👎🏿👊👊🏻👊🏼👊🏽👊🏾👊🏿✊🏻✊🏼✊🏽✊🏾✊🏿

评论

~ 评论还没有,沙发可以有 O(∩_∩)O~