周末在家,儿子拿着平板问我:爸爸,你说的‘容器’是不是像乐高一样能拼来拼去?我笑了笑,正好借这个机会,用ref="/tag/2019/" style="color:#479099;font-weight:bold;">Docker的网桥网络配置带他做了个小实验。
我们在电脑上装好了Docker,然后我新建了两个容器,一个叫web-server,另一个叫data-worker。我想让他看到这两个“小盒子”是怎么互相打招呼的。
从默认网桥开始
Docker安装后自带一个叫bridge的默认网络,就像家里的无线路由器,所有新容器插上线就自动连上去了。
docker run -d --name web-server nginx
docker run -it --name data-worker alpine sh这时候在data-worker里试着pingweb-server,发现根本找不到对方。原来,默认网桥只支持IP通信,不支持容器名解析,对孩子来说太难理解了。
自己搭个“儿童友好”的网桥
于是我们动手创建了一个新的网桥网络:
docker network create --driver bridge my-playground再把两个容器都放进这个叫my-playground的“游乐场”里:
docker run -d --name web-server --network my-playground nginx
docker run -it --name data-worker --network my-playground alpine sh这次在data-worker里输入ping web-server,叮咚!马上收到了回复。儿子拍手说:它们认识啦!
这就是自定义网桥的好处——自动支持容器名称解析,还能控制哪些容器可以互通,就像给孩子们分组做游戏,谁和谁一组,清清楚楚。
加点生活例子更好懂
我跟他说,这就像是学校里的班级群。同一个群里的同学能互相发消息,不同群的就不行。如果想让两个孩子合作完成作业,就把他们拉进同一个群。
后来我们又试了给容器设置静态IP,方便记住位置:
docker network create --subnet=172.20.0.0/16 my-classroom
docker run -d --name teacher --network my-classroom --ip 172.20.0.10 nginx这样一来,每次访问172.20.0.10都是这位“老师”,不会变来变去。
折腾完这些,儿子已经能自己说出“网络要一样才能通信”这种话了。虽然他还不懂子网掩码是什么,但至少明白了设备之间是怎么建立联系的。下次我们可以试试用Docker Compose一键启动整个“班级”,那就更省事了。