±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs£¬Ê±¹ý¾³Ç¨£¬Ëæ×Å
docker µÄ¿ìËÙ·¢Õ¹£¬ÆäÍøÂç¼Ü¹¹Ò²ÔÚ²»¶ÏµÄÑݽø¡£±¾ÎÄÖ÷Òª½éÉÜ docker
µÄ CNM ÍøÂçÄ£ÐÍÒÔ¼°ÐÂÒýÈëµÄ network ×ÓÃüÁî¡£ |
|
Docker ÍøÂç¼Ü¹¹
Docker ÔÚ 1.9 °æ±¾ÖÐÒýÈëÁËÒ»ÕûÌ×µÄ docker network ×ÓÃüÁîºÍ¿çÖ÷»úÍøÂçÖ§³Ö¡£ÕâÔÊÐíÓû§¿ÉÒÔ¸ù¾ÝËûÃÇÓ¦ÓõÄÍØÆË¼Ü¹¹´´½¨ÐéÄâÍøÂç²¢½«ÈÝÆ÷½ÓÈëÆäËù¶ÔÓ¦µÄÍøÂç¡£Æäʵ£¬ÔçÔÚ
docker 1.7 °æ±¾ÖУ¬ÍøÂ粿·Ö´úÂë¾ÍÒѾ±»³éÀë²¢µ¥¶À³ÉΪÁË docker µÄÍøÂç¿â£¬¼´ libnetwork¡£ÔÚ´ËÖ®ºó£¬ÈÝÆ÷µÄÍøÂçģʽҲ±»³éÏó±ä³ÉÁËͳһ½Ó¿ÚµÄÇý¶¯¡£
ΪÁ˱ê×¼»¯ÍøÂçÇý¶¯µÄ¿ª·¢²½ÖèºÍÖ§³Ö¶àÖÖÍøÂçÇý¶¯£¬docker ¹«Ë¾ÔÚ libnetwork ÖÐʹÓÃÁË
CNM(Container Network Model)¡£CNM ¶¨ÒåÁ˹¹½¨ÈÝÆ÷ÐéÄâ»¯ÍøÂçµÄÄ£ÐÍ£¬Í¬Ê±»¹ÌṩÁË¿ÉÒÔÓÃÓÚ¿ª·¢¶àÖÖÍøÂçÇý¶¯µÄ±ê×¼»¯½Ó¿ÚºÍ×é¼þ¡£Libnetwork
ºÍ docker daemon ¼°¸÷¸öÍøÂçÇý¶¯µÄ¹ØÏµ¿ÉÒÔͨ¹ýÏÂͼÐÎÏóµÄ±íʾ£º

ÉÏͼÖУ¬docker daemon ͨ¹ýµ÷Óà libnetwork ¶ÔÍâÌṩµÄ API Íê³ÉÍøÂçµÄ´´½¨ºÍ¹ÜÀíµÈ¹¦ÄÜ¡£Libnetwork
ÄÚ²¿ÔòʹÓÃÁË CNM À´ÊµÏÖÍøÂ繦ÄÜ¡£CNM ÖÐÖ÷ÒªÓÐɳºÐ(sandbox)¡¢¶Ëµã(endpoint)
ºÍÍøÂç(network) 3 ÖÖ×é¼þ¡£Libnetwork ÖÐÄÚÖÃµÄ 5 ÖÖÇý¶¯ÔòΪ libnetwork
ÌṩÁ˲»Í¬ÀàÐ͵ÄÍøÂç·þÎñ¡£ÏÂÃæ·Ö±ð¶Ô CNM ÖÐµÄ 3 ¸öºËÐÄ×é¼þºÍ libnetwork ÖÐµÄ 5
ÖÖÄÚÖÃÇý¶¯½øÐнéÉÜ¡£
CNM ÖÐµÄ 3 ¸öºËÐÄ×é¼þÈçÏÂ
ɳºÐ£ºÒ»¸öɳºÐ°üº¬ÁËÒ»¸öÈÝÆ÷ÍøÂçÕ»µÄÐÅÏ¢¡£É³ºÐ¿ÉÒÔ¶ÔÈÝÆ÷µÄ½Ó¿Ú(interface)¡¢Â·ÓÉºÍ DNS
ÉèÖõȽøÐйÜÀí¡£É³ºÐµÄʵÏÖ¿ÉÒÔÊÇ Linux network namespace¡¢FreeBSD Jail
»òÕßÀàËÆµÄ»úÖÆ¡£Ò»¸öɳºÐ¿ÉÒÔÓжà¸ö¶ËµãºÍ¶à¸öÍøÂç¡£
¶Ëµã£ºÒ»¸ö¶Ëµã¿ÉÒÔ¼ÓÈëÒ»¸öɳºÐºÍÒ»¸öÍøÂç¡£¶ËµãµÄʵÏÖ¿ÉÒÔÊÇ veth pair¡¢Open vSwitch
ÄÚ²¿¶Ë¿Ú»òÕßÏàËÆµÄÉ豸¡£Ò»¸ö¶Ëµã¿ÉÒÔÊôÓÚÒ»¸öÍøÂç²¢ÇÒÖ»ÊôÓÚÒ»¸öɳºÐ¡£
ÍøÂ磺һ¸öÍøÂçÊÇÒ»×é¿ÉÒÔÖ±½Ó»¥ÏàÁªÍ¨µÄ¶Ëµã¡£ÍøÂçµÄʵÏÖ¿ÉÒÔÊÇ Linux bridge¡¢VLANµÈ¡£Ò»¸öÍøÂç¿ÉÒÔ°üº¬¶à¸ö¶Ëµã¡£
Libnetwork ÖÐµÄ 5 ÖÐÄÚÖÃÇý¶¯ÈçÏÂ
bridge Çý¶¯£ºÕâÊÇ docker ÉèÖõÄĬÈÏÇý¶¯¡£µ±Ê¹Óà bridge Çý¶¯Ê±£¬libnetwork
½«´´½¨³öÀ´µÄ docker ÈÝÆ÷Á¬½Óµ½ docker0 ÍøÇÅÉÏ¡£¶ÔÓÚµ¥»úģʽ£¬bridge Çý¶¯ÒѾ¿ÉÒÔÂú×ã»ù±¾µÄÐèÇóÁË¡£µ«ÊÇÕâÖÖģʽÏÂÈÝÆ÷ʹÓÃ
NAT ·½Ê½ÓëÍâ½çͨÐÅ£¬Õâ¾ÍÔö¼ÓÁËͨÐŵĸ´ÔÓÐÔ¡£
host Çý¶¯£ºÊ¹Óà host Çý¶¯µÄʱºò£¬libnetwork ²»»áΪÈÝÆ÷´´½¨ÍøÂçÐÒéÕ»£¬¼´²»»á´´½¨¶ÀÁ¢µÄ
network namespace¡£Docker ÈÝÆ÷ÖеĽø³Ì´¦ÓÚËÞÖ÷»úµÄÍøÂç»·¾³ÖУ¬Ï൱ÓÚÈÝÆ÷ºÍËÞÖ÷»ú¹²ÓÃͬһ¸ö
network namespace£¬ÈÝÆ÷¹²ÏíʹÓÃËÞÖ÷»úµÄÍø¿¨¡¢IP ºÍ¶Ë¿ÚµÈ×ÊÔ´¡£Host ģʽºÜºÃµÄ½â¾öÁËÈÝÆ÷ÓëÍâ½çͨÐŵĵØÖ·×ª»»ÎÊÌ⣬¿ÉÒÔÖ±½ÓʹÓÃËÞÖ÷»úµÄ
IP ½øÐÐͨÐÅ£¬²»´æÔÚÐéÄâ»¯ÍøÂç´øÀ´µÄ¿ªÏú¡£µ«ÊÇ host Çý¶¯Ò²½µµÍÁËÈÝÆ÷ÓëÈÝÆ÷Ö®¼ä¡¢ÈÝÆ÷ÓëËÞÖ÷»úÖ®¼äÍøÂçµÄ¸ôÀëÐÔ£¬ÒýÆðÍøÂç×ÊÔ´µÄ¾ºÕùºÍ³åÍ»¡£Òò´Ë¿ÉÒÔÈÏΪ
host Çý¶¯ÊÊÓÃÓÚ¶ÔÈÝÆ÷¼¯Èº¹æÄ£²»´óµÄ³¡¾°¡£
overlay Çý¶¯£ºoverlay Çý¶¯²ÉÓà IETF ±ê×¼µÄ VXLAN ·½Ê½£¬²¢ÇÒÊÇ VXLAN
Öб»ÆÕ±éÈÏΪ×îÊʺϴó¹æÄ£µÄÔÆ¼ÆËãÐéÄ⻯»·¾³µÄ SDN controller ģʽ¡£ÔÚʹÓõĹý³ÌÖУ¬»¹ÐèÒªÒ»¸ö¶îÍâµÄÅäÖô洢·þÎñ£¬±ÈÈç
Consul¡¢etcd »ò ZooKeeper µÈ¡£²¢ÇÒÔÚÆô¶¯ docker daemon µÄʱºòÐèÒªÌí¼Ó¶îÍâµÄ²ÎÊýÀ´Ö¸¶¨ËùʹÓõÄÅäÖô洢·þÎñµØÖ·¡£
remote Çý¶¯£ºÕâ¸öÇý¶¯Êµ¼ÊÉϲ¢Î´×öÕæÕýµÄÍøÂç·þÎñʵÏÖ£¬¶øÊǵ÷ÓÃÁËÓû§×ÔÐÐʵÏÖµÄÍøÂçÇý¶¯²å¼þ£¬ÊÇ
libnetwork ʵÏÖÁËÇý¶¯µÄ²å¼þ»¯£¬¸üºÃµØÂú×ãÁËÓû§µÄ¶àÑù»¯ÐèÇó¡£Óû§Ö»Òª¸ù¾Ý libnetwork
ÌṩµÄÐÒé±ê׼ʵÏÖÆä½Ó¿Ú²¢×¢²á¼´¿É¡£
null Çý¶¯£ºÊ¹ÓÃÕâÖÖÇý¶¯µÄʱºò£¬docker ÈÝÆ÷ÓµÓÐ×Ö¶ÎµÄ network namespace£¬µ«ÊDz¢²»Îª
docker ÈÝÆ÷½øÐÐÈκÎÍøÂçÅäÖá£Ò²¾ÍÊÇ˵£¬Õâ¸öÈÝÆ÷³ýÁË network namespace ×Ô´øµÄ
loopback Íø¿¨Í⣬ûÓÐÈÎºÎÆäËüÍø¿¨¡¢IP¡¢Â·ÓɵÈÐÅÏ¢£¬ÐèÒªÓû§Îª¸ÃÈÝÆ÷Ìí¼ÓÍø¿¨¡¢ÅäÖà IP
µÈ¡£ÕâÖÖģʽÈç¹û²»½øÐÐÌØ¶¨µÄÅäÖÃÊÇÎÞ·¨Õý³£Ê¹ÓÃÍøÂçµÄ£¬µ«ÊÇÓŵãÒ²·Ç³£Ã÷ÏÔ£¬Ëü¸øÁËÓû§×î´óµÄ×ÔÓɶÈÀ´×Ô¶¨ÒåÈÝÆ÷µÄÍøÂç»·¾³¡£
CNM ÍøÂçʾÀý
ÕâÀïÎÒÃǽéÉÜÒ»¸ö libnetwork ʾÀýµÄ´î½¨¹ý³Ì£¬²¢Ôڴ³É¹¦ºó¶ÔÆäÖÐÈÝÆ÷Ö®¼äµÄÁ¬Í¨ÐÔ½øÐÐÑéÖ¤¡£ÏÂͼչʾÁË
CNM ÍøÂçʾÀýµÄ×é³É½á¹¹£º

ÔÚ±¾ÀýÖУ¬ÎÒʹÓà docker ĬÈ쵀 bridge Çý¶¯´´½¨ÁËÒ»¸öÍøÂçÍØÆËÓ¦Óãº
ËüÓÐÁ½¸öÍøÂ磬ÆäÖÐ backend network Ϊºó¶ËÍøÂ磬frontend network
ÔòΪǰ¶ËÍøÂ磬Á½¸öÍøÂ绥²»Á¬Í¨¡£
ÆäÖÐ con1 ºÍ con3 ¸÷ÓµÓÐÒ»¸ö¶Ëµã£¬²¢ÇÒ·Ö±ð¼ÓÈëµ½ºó¶ËÍøÂçºÍǰ¶ËÍøÂçÖС£¶ø con2 ÔòÓÐÁ½¸ö¶Ëµã£¬ËüÃÇ·Ö±ð¼ÓÈëµ½ºó¶ËÍøÂçºÍǰ¶ËÍøÂçÖС£
ÏÂÃæµÄÃüÁî·Ö±ð´´½¨ÃûΪ backend ºÍ frontend µÄÁ½¸öÍøÂ磺
$ docker network
create backend
$ docker network create frontend
$ docker network ls |

ÉÏͼÖгýÁ˸ղŴ´½¨µÄ backend ºÍ frontend Ö®Í⣬»¹ÓÐÈý¸öÍøÂç bridge¡¢host
ºÍ none¡£ÕâÈý¸öÍøÂçÊÇ docker daemon ĬÈÏ´´½¨µÄ£¬ÎÒÃÇÎÞ·¨Í¨¹ý docker network
rm ÃüÁî½øÐÐɾ³ý¡£
ÔÚ´´½¨ÁËËùÐèµÄÁ½¸öÍøÂçÖ®ºó£¬ÎÒÃÇÀ´´´½¨Èý¸öÈÝÆ÷ con1¡¢con2 ºÍ con3£¬²¢·Ö±ð°Ñ con1
ºÍ con2 ¼ÓÈëµ½ backend ÍøÂçÖУ¬°Ñ con3 ¼ÓÈëµ½ frontend ÍøÂçÖУº
$ docker run
-it --name con1 --net backend busybox
$ docker run -it --name con2 --net backend busybox
$ docker run -it --name con3 --net frontend busybox |
½ÓÏÂÀ´·Ö±ðÔÚ con1 ºÍ con3 ÖÐ ping con2£¬ÒòΪ con1 ºÍ con2 ¶¼ÔÚ backend
ÍøÂçÖУ¬ËùÒÔÁ½Õß¿ÉÒÔÁ¬Í¨¡£µ«ÊÇ con3 ºÍ con2 ²»ÔÚÒ»¸öÍøÂçÖУ¬ËùÒÔËüÃÇÖ®¼ä²»ÄÜÁ¬Í¨¡£
ÎÒÃDz鿴 con2 ÖеÄÍø¿¨¼°ÆäÅäÖãº

¿ÉÒÔ¿´µ½£¬´ËʱÈÝÆ÷ÖÐÖ»ÓÐÒ»¿éÃûΪ eth0 µÄÍø¿¨£¬²¢ÇÒÅäÖÃÁ˺ÍÍøÇÅ backend ͬÔÚÒ»¸ö IP
¶ÎµÄ IP µØÖ·£¬Õâ¸öÍø¿¨¾ÍÊÇ CNM Ä£ÐÍÖеĶ˵㡣ȻºóÎÒÃÇͨ¹ýÏÂÃæµÄÃüÁî°Ñ con2 Ò²¼ÓÈëµ½
frontend ÍøÂçÖУº
$ docker network
connect frontend con2 |
ÔÙÀ´²é¿´ con2 ÖеÄÍø¿¨¼°ÆäÅäÖãº

Õâ´Î·¢ÏÖ¶àÁËÒ»¿éÃûΪ eth1 µÄÍø¿¨£¬²¢ÇÒÆä IP ºÍÍøÇÅ frontend ͬÔÚÒ»¸ö IP ¶Î¡£ÓÃ
ping ÃüÁî²âÊÔ con2 Óë con3 µÄÁ¬Í¨ÐÔ£º

´ËʱÁ½ÕßÒѾÁ¬Í¨¡£ÓÉ´Ë¿ÉÖª£¬docker network connect ÃüÁî»áÔÚËùÁ¬½ÓµÄÈÝÆ÷Öд´½¨ÐµÄÍø¿¨£¬ÒÔÍê³ÉÈÝÆ÷ÓëËùÖ¸¶¨ÍøÂçµÄÁ¬½Ó¡£
×ܽá
ͨ¹ý CNM(Container Network Model)£¬docker ÎªÍøÂçÇý¶¯µÄ¿ª·¢½¨Á¢Á˱ê×¼¡£¶ÔÓÚ»ù±¾µÄÍøÂçÓ¦Óó¡¾°£¬Ê¹ÓÃĬÈϵÄÍøÂçÇý¶¯¾ÍÄÜÂú×ãÐèÇó¡£Èç¹ûÓû§ÓÐÌØÊâµÄÐèÇó£¬ÍêÈ«¿ÉÒÔÒÀ¾Ý
CNM ±ê×¼À´ÊµÏÖ×Ô¶¨ÒåµÄÍøÂçÇý¶¯¡£ |