Docker×÷ΪĿǰ×î»ðµÄÇáÁ¿¼¶ÈÝÆ÷¼¼Êõ£¬ÓкܶàÁîÈ˳ƵÀµÄ¹¦ÄÜ£¬ÈçDockerµÄ¾µÏñ¹ÜÀí¡£È»¶ø£¬DockerͬÑùÓÐןܶ಻ÍêÉÆµÄµØ·½£¬ÍøÂç·½Ãæ¾ÍÊÇDocker±È½Ï±¡ÈõµÄ²¿·Ö¡£Òò´Ë£¬ÎÒÃÇÓбØÒªÉîÈëÁ˽âDockerµÄÍøÂç֪ʶ£¬ÒÔÂú×ã¸ü¸ßµÄÍøÂçÐèÇó¡£±¾ÎÄÊ×ÏȽéÉÜÁËDocker×ÔÉíµÄ4ÖÖÍøÂ繤×÷·½Ê½£¬È»ºóͨ¹ý3¸öÑùÀý
¡ª¡ª ½«DockerÈÝÆ÷ÅäÖõ½±¾µØÍøÂç»·¾³ÖС¢µ¥Ö÷»úDockerÈÝÆ÷µÄVLAN»®·Ö¡¢¶àÖ÷»úDockerÈÝÆ÷µÄVLAN»®·Ö£¬ÑÝʾÁËÈçºÎʹÓÃpipework°ïÖúÎÒÃǽøÐи´ÔÓµÄÍøÂçÉèÖã¬ÒÔ¼°pipeworkÊÇÈçºÎ¹¤×÷µÄ¡£
1. DockerµÄ4ÖÖÍøÂçģʽ
ÎÒÃÇÔÚʹÓÃdocker run´´½¨DockerÈÝÆ÷ʱ£¬¿ÉÒÔÓÃ--netÑ¡ÏîÖ¸¶¨ÈÝÆ÷µÄÍøÂçģʽ£¬DockerÓÐÒÔÏÂ4ÖÖÍøÂçģʽ£º
hostģʽ£¬Ê¹ÓÃ--net=hostÖ¸¶¨¡£
containerģʽ£¬Ê¹ÓÃ--net=container:NAME_or_IDÖ¸¶¨¡£
noneģʽ£¬Ê¹ÓÃ--net=noneÖ¸¶¨¡£
bridgeģʽ£¬Ê¹ÓÃ--net=bridgeÖ¸¶¨£¬Ä¬ÈÏÉèÖá£
ÏÂÃæ·Ö±ð½éÉÜÒ»ÏÂDockerµÄ¸÷¸öÍøÂçģʽ¡£
1.1 hostģʽ
ÖÚËùÖÜÖª£¬DockerʹÓÃÁËLinuxµÄNamespaces¼¼ÊõÀ´½øÐÐ×ÊÔ´¸ôÀ룬ÈçPID Namespace¸ôÀë½ø³Ì£¬Mount
Namespace¸ôÀëÎļþϵͳ£¬Network Namespace¸ôÀëÍøÂçµÈ¡£Ò»¸öNetwork NamespaceÌṩÁËÒ»·Ý¶ÀÁ¢µÄÍøÂç»·¾³£¬°üÀ¨Íø¿¨¡¢Â·ÓÉ¡¢Iptable¹æÔòµÈ¶¼ÓëÆäËûµÄNetwork
Namespace¸ôÀë¡£Ò»¸öDockerÈÝÆ÷Ò»°ã»á·ÖÅäÒ»¸ö¶ÀÁ¢µÄNetwork Namespace¡£µ«Èç¹ûÆô¶¯ÈÝÆ÷µÄʱºòʹÓÃhostģʽ£¬ÄÇôÕâ¸öÈÝÆ÷½«²»»á»ñµÃÒ»¸ö¶ÀÁ¢µÄNetwork
Namespace£¬¶øÊǺÍËÞÖ÷»ú¹²ÓÃÒ»¸öNetwork Namespace¡£ÈÝÆ÷½«²»»áÐéÄâ³ö×Ô¼ºµÄÍø¿¨£¬ÅäÖÃ×Ô¼ºµÄIPµÈ£¬¶øÊÇʹÓÃËÞÖ÷»úµÄIPºÍ¶Ë¿Ú¡£
ÀýÈ磬ÎÒÃÇÔÚ10.10.101.105/24µÄ»úÆ÷ÉÏÓÃhostģʽÆô¶¯Ò»¸öº¬ÓÐwebÓ¦ÓõÄDockerÈÝÆ÷£¬¼àÌýtcp80¶Ë¿Ú¡£µ±ÎÒÃÇÔÚÈÝÆ÷ÖÐÖ´ÐÐÈκÎÀàËÆifconfigÃüÁî²é¿´ÍøÂç»·¾³Ê±£¬¿´µ½µÄ¶¼ÊÇËÞÖ÷»úÉϵÄÐÅÏ¢¡£¶øÍâ½ç·ÃÎÊÈÝÆ÷ÖеÄÓ¦Óã¬ÔòÖ±½ÓʹÓÃ10.10.101.105:80¼´¿É£¬²»ÓÃÈκÎNATת»»£¬¾ÍÈçÖ±½ÓÅÜÔÚËÞÖ÷»úÖÐÒ»Ñù¡£µ«ÊÇ£¬ÈÝÆ÷µÄÆäËû·½Ã棬ÈçÎļþϵͳ¡¢½ø³ÌÁбíµÈ»¹ÊǺÍËÞÖ÷»ú¸ôÀëµÄ¡£
1.2 containerģʽ
ÔÚÀí½âÁËhostģʽºó£¬Õâ¸öģʽҲ¾ÍºÃÀí½âÁË¡£Õâ¸öģʽָ¶¨Ð´´½¨µÄÈÝÆ÷ºÍÒѾ´æÔÚµÄÒ»¸öÈÝÆ÷¹²ÏíÒ»¸öNetwork
Namespace£¬¶ø²»ÊǺÍËÞÖ÷»ú¹²Ïí¡£Ð´´½¨µÄÈÝÆ÷²»»á´´½¨×Ô¼ºµÄÍø¿¨£¬ÅäÖÃ×Ô¼ºµÄIP£¬¶øÊǺÍÒ»¸öÖ¸¶¨µÄÈÝÆ÷¹²ÏíIP¡¢¶Ë¿Ú·¶Î§µÈ¡£Í¬Ñù£¬Á½¸öÈÝÆ÷³ýÁËÍøÂç·½Ãæ£¬ÆäËûµÄÈçÎļþϵͳ¡¢½ø³ÌÁбíµÈ»¹ÊǸôÀëµÄ¡£Á½¸öÈÝÆ÷µÄ½ø³Ì¿ÉÒÔͨ¹ýloÍø¿¨É豸ͨÐÅ¡£
1.3 noneģʽ
Õâ¸öģʽºÍǰÁ½¸ö²»Í¬¡£ÔÚÕâÖÖģʽÏ£¬DockerÈÝÆ÷ÓµÓÐ×Ô¼ºµÄNetwork Namespace£¬µ«ÊÇ£¬²¢²»ÎªDockerÈÝÆ÷½øÐÐÈκÎÍøÂçÅäÖá£Ò²¾ÍÊÇ˵£¬Õâ¸öDockerÈÝÆ÷ûÓÐÍø¿¨¡¢IP¡¢Â·ÓɵÈÐÅÏ¢¡£ÐèÒªÎÒÃÇ×Ô¼ºÎªDockerÈÝÆ÷Ìí¼ÓÍø¿¨¡¢ÅäÖÃIPµÈ¡£
1.4 bridgeģʽ
bridgeģʽÊÇDockerĬÈϵÄÍøÂçÉèÖ㬴Ëģʽ»áΪÿһ¸öÈÝÆ÷·ÖÅäNetwork Namespace¡¢ÉèÖÃIPµÈ£¬²¢½«Ò»¸öÖ÷»úÉϵÄDockerÈÝÆ÷Á¬½Óµ½Ò»¸öÐéÄâÍøÇÅÉÏ¡£ÏÂÃæ×ÅÖØ½éÉÜһϴËģʽ¡£
1.4.1 bridgeģʽµÄÍØÆË
µ±Docker serverÆô¶¯Ê±£¬»áÔÚÖ÷»úÉÏ´´½¨Ò»¸öÃûΪdocker0µÄÐéÄâÍøÇÅ£¬´ËÖ÷»úÉÏÆô¶¯µÄDockerÈÝÆ÷»áÁ¬½Óµ½Õâ¸öÐéÄâÍøÇÅÉÏ¡£ÐéÄâÍøÇŵŤ×÷·½Ê½ºÍÎïÀí½»»»»úÀàËÆ£¬ÕâÑùÖ÷»úÉϵÄËùÓÐÈÝÆ÷¾Íͨ¹ý½»»»»úÁ¬ÔÚÁËÒ»¸ö¶þ²ãÍøÂçÖС£½ÓÏÂÀ´¾ÍҪΪÈÝÆ÷·ÖÅäIPÁË£¬Docker»á´ÓRFC1918Ëù¶¨ÒåµÄ˽ÓÐIPÍø¶ÎÖУ¬Ñ¡ÔñÒ»¸öºÍËÞÖ÷»ú²»Í¬µÄIPµØÖ·ºÍ×ÓÍø·ÖÅ䏸docker0£¬Á¬½Óµ½docker0µÄÈÝÆ÷¾Í´ÓÕâ¸ö×ÓÍøÖÐÑ¡ÔñÒ»¸öδռÓõÄIPʹÓá£ÈçÒ»°ãDocker»áʹÓÃ172.17.0.0/16Õâ¸öÍø¶Î£¬²¢½«172.17.42.1/16·ÖÅ䏸docker0ÍøÇÅ£¨ÔÚÖ÷»úÉÏʹÓÃifconfigÃüÁîÊÇ¿ÉÒÔ¿´µ½docker0µÄ£¬¿ÉÒÔÈÏΪËüÊÇÍøÇŵĹÜÀí½Ó¿Ú£¬ÔÚËÞÖ÷»úÉÏ×÷Ϊһ¿éÐéÄâÍø¿¨Ê¹Óã©¡£µ¥»ú»·¾³ÏµÄÍøÂçÍØÆËÈçÏ£¬Ö÷»úµØÖ·Îª10.10.101.105/24¡£

DockerÍê³ÉÒÔÉÏÍøÂçÅäÖõĹý³Ì´óÖÂÊÇÕâÑùµÄ£º
ÔÚÖ÷»úÉÏ´´½¨Ò»¶ÔÐéÄâÍø¿¨veth pairÉ豸¡£vethÉ豸×ÜÊdzɶԳöÏֵģ¬ËüÃÇ×é³ÉÁËÒ»¸öÊý¾ÝµÄͨµÀ£¬Êý¾Ý´ÓÒ»¸öÉ豸½øÈ룬¾Í»á´ÓÁíÒ»¸öÉ豸³öÀ´¡£Òò´Ë£¬vethÉ豸³£ÓÃÀ´Á¬½ÓÁ½¸öÍøÂçÉ豸¡£
Docker½«veth pairÉ豸µÄÒ»¶Ë·ÅÔÚд´½¨µÄÈÝÆ÷ÖУ¬²¢ÃüÃûΪeth0¡£ÁíÒ»¶Ë·ÅÔÚÖ÷»úÖУ¬ÒÔveth65f9ÕâÑùÀàËÆµÄÃû×ÖÃüÃû£¬²¢½«Õâ¸öÍøÂçÉ豸¼ÓÈëµ½docker0ÍøÇÅÖУ¬¿ÉÒÔͨ¹ýbrctl
showÃüÁî²é¿´¡£

´Ódocker0×ÓÍøÖзÖÅäÒ»¸öIP¸øÈÝÆ÷ʹÓ㬲¢ÉèÖÃdocker0µÄIPµØÖ·ÎªÈÝÆ÷µÄĬÈÏÍø¹Ø¡£
ÍøÂçÍØÆË½éÉÜÍêºó£¬½Ó׎éÉÜÒ»ÏÂbridgeģʽÏÂÈÝÆ÷ÊÇÈçºÎͨÐŵġ£
1.4.2 bridgeģʽÏÂÈÝÆ÷µÄͨÐÅ
ÔÚbridgeģʽÏ£¬Á¬ÔÚÍ¬Ò»ÍøÇÅÉϵÄÈÝÆ÷¿ÉÒÔÏ໥ͨÐÅ£¨Èô³öÓÚ°²È«¿¼ÂÇ£¬Ò²¿ÉÒÔ½ûÖ¹ËüÃÇÖ®¼äͨÐÅ£¬·½·¨ÊÇÔÚDOCKER_OPTS±äÁ¿ÖÐÉèÖÃ--icc=false£¬ÕâÑùÖ»ÓÐʹÓÃ--link²ÅÄÜʹÁ½¸öÈÝÆ÷ͨÐÅ£©¡£
ÈÝÆ÷Ò²¿ÉÒÔÓëÍⲿͨÐÅ£¬ÎÒÃÇ¿´Ò»ÏÂÖ÷»úÉϵÄIptable¹æÔò£¬¿ÉÒÔ¿´µ½ÕâôһÌõ
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE |
ÕâÌõ¹æÔò»á½«Ô´µØÖ·Îª172.17.0.0/16µÄ°ü£¨Ò²¾ÍÊÇ´ÓDockerÈÝÆ÷²úÉúµÄ°ü£©£¬²¢ÇÒ²»ÊÇ´Ódocker0Íø¿¨·¢³öµÄ£¬½øÐÐÔ´µØÖ·×ª»»£¬×ª»»³ÉÖ÷»úÍø¿¨µÄµØÖ·¡£Õâô˵¿ÉÄܲ»Ì«ºÃÀí½â£¬¾ÙÒ»¸öÀý×Ó˵Ã÷һϡ£¼ÙÉèÖ÷»úÓÐÒ»¿éÍø¿¨Îªeth0£¬IPµØÖ·Îª10.10.101.105/24£¬Íø¹ØÎª10.10.101.254¡£´ÓÖ÷»úÉÏÒ»¸öIPΪ172.17.0.1/16µÄÈÝÆ÷ÖÐping°Ù¶È£¨180.76.3.151£©¡£IP°üÊ×ÏÈ´ÓÈÝÆ÷·¢Íù×Ô¼ºµÄĬÈÏÍø¹Ødocker0£¬°üµ½´ïdocker0ºó£¬Ò²¾Íµ½´ïÁËÖ÷»úÉÏ¡£È»ºó»á²éѯÖ÷»úµÄ·ÓÉ±í£¬·¢ÏÖ°üÓ¦¸Ã´ÓÖ÷»úµÄeth0·¢ÍùÖ÷»úµÄÍø¹Ø10.10.105.254/24¡£½Ó×Űü»áת·¢¸øeth0£¬²¢´Óeth0·¢³öÈ¥£¨Ö÷»úµÄip_forwardת·¢Ó¦¸ÃÒѾ´ò¿ª£©¡£Õâʱºò£¬ÉÏÃæµÄIptable¹æÔò¾Í»áÆð×÷Ó㬶԰ü×öSNATת»»£¬½«Ô´µØÖ·»»Îªeth0µÄµØÖ·¡£ÕâÑù£¬ÔÚÍâ½ç¿´À´£¬Õâ¸ö°ü¾ÍÊÇ´Ó10.10.101.105ÉÏ·¢³öÀ´µÄ£¬DockerÈÝÆ÷¶ÔÍâÊDz»¿É¼ûµÄ¡£
ÄÇô£¬ÍâÃæµÄ»úÆ÷ÊÇÈçºÎ·ÃÎÊDockerÈÝÆ÷µÄ·þÎñÄØ£¿ÎÒÃÇÊ×ÏÈÓÃÏÂÃæÃüÁî´´½¨Ò»¸öº¬ÓÐwebÓ¦ÓõÄÈÝÆ÷£¬½«ÈÝÆ÷µÄ80¶Ë¿ÚÓ³Éäµ½Ö÷»úµÄ80¶Ë¿Ú¡£
docker run -d --name web -p 80:80 fmzhen/simpleweb |
È»ºó²é¿´Iptable¹æÔòµÄ±ä»¯£¬·¢ÏÖ¶àÁËÕâÑùÒ»Ìõ¹æÔò£º
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80 |
´ËÌõ¹æÔò¾ÍÊǶÔÖ÷»úeth0ÊÕµ½µÄÄ¿µÄ¶Ë¿ÚΪ80µÄtcpÁ÷Á¿½øÐÐDNATת»»£¬½«Á÷Á¿·¢Íù172.17.0.5:80£¬Ò²¾ÍÊÇÎÒÃÇÉÏÃæ´´½¨µÄDockerÈÝÆ÷¡£ËùÒÔ£¬Íâ½çÖ»Ðè·ÃÎÊ10.10.101.105:80¾Í¿ÉÒÔ·ÃÎʵ½ÈÝÆ÷Öе÷þÎñ¡£
³ý´ËÖ®Í⣬ÎÒÃÇ»¹¿ÉÒÔ×Ô¶¨ÒåDockerʹÓõÄIPµØÖ·¡¢DNSµÈÐÅÏ¢£¬ÉõÖÁʹÓÃ×Ô¼º¶¨ÒåµÄÍøÇÅ£¬µ«ÊÇÆä¹¤×÷·½Ê½»¹ÊÇÒ»ÑùµÄ¡£
2. pipeworkµÄʹÓÃÒÔ¼°Ô´Âë·ÖÎö
Docker×ÔÉíµÄÍøÂ繦ÄܱȽϼòµ¥£¬²»ÄÜÂú×ãºÜ¶à¸´ÔÓµÄÓ¦Óó¡¾°¡£Òò´Ë£¬Óкܶ࿪ԴÏîÄ¿ÓÃÀ´¸ÄÉÆDockerµÄÍøÂ繦ÄÜ£¬Èçpipework¡¢weave¡¢flannelµÈ¡£ÕâÀ¾ÍÏȽéÉÜÒ»ÏÂpipeworkµÄʹÓú͹¤×÷ÔÀí¡£
pipeworkÊÇÓÉDockerµÄ¹¤³ÌʦJ¨¦r?me Petazzoni¿ª·¢µÄÒ»¸öDockerÍøÂçÅäÖù¤¾ß£¬ÓÉ200¶àÐÐshellʵÏÖ£¬·½±ãÒ×Óá£ÏÂÃæÓÃÈý¸ö³¡¾°À´ÑÝʾpipeworkµÄʹÓú͹¤×÷ÔÀí¡£
2.1 ½«DockerÈÝÆ÷ÅäÖõ½±¾µØÍøÂç»·¾³ÖÐ
ΪÁËʹ±¾µØÍøÂçÖеĻúÆ÷ºÍDockerÈÝÆ÷¸ü·½±ãµÄͨÐÅ£¬ÎÒÃǾ³£»áÓн«DockerÈÝÆ÷ÅäÖõ½ºÍÖ÷»úÍ¬Ò»Íø¶ÎµÄÐèÇó¡£Õâ¸öÐèÇóÆäʵºÜÈÝÒ×ʵÏÖ£¬ÎÒÃÇÖ»Òª½«DockerÈÝÆ÷ºÍÖ÷»úµÄÍø¿¨ÇŽӯðÀ´£¬ÔÙ¸øDockerÈÝÆ÷ÅäÉÏIP¾Í¿ÉÒÔÁË¡£
ÏÂÃæÎÒÃÇÀ´²Ù×÷һϣ¬ÎÒÖ÷»úAµØÖ·Îª10.10.101.105/24,Íø¹ØÎª10.10.101.254,ÐèÒª¸øDockerÈÝÆ÷µÄµØÖ·ÅäÖÃΪ10.10.101.150/24¡£ÔÚÖ÷»úAÉÏ×öÈçϲÙ×÷£º
#°²×°pipework git clone https://github.com/jpetazzo/pipework cp ~/pipework/pipework /usr/local/bin/ #Æô¶¯DockerÈÝÆ÷¡£ docker run -itd --name test1 ubuntu /bin/bash #ÅäÖÃÈÝÆ÷ÍøÂ磬²¢Á¬µ½ÍøÇÅbr0ÉÏ¡£Íø¹ØÔÚIPµØÖ·ºóÃæ¼Ó@Ö¸¶¨¡£ #ÈôÖ÷»ú»·¾³ÖдæÔÚdhcp·þÎñÆ÷£¬Ò²¿ÉÒÔͨ¹ýdhcpµÄ·½Ê½»ñÈ¡IP #pipework br0 test1 dhcp pipework br0 test1 10.10.101.150/24@10.10.101.254 #½«Ö÷»úeth0ÇŽӵ½br0ÉÏ£¬²¢°Ñeth0µÄIPÅäÖÃÔÚbr0ÉÏ¡£
ÕâÀïÓÉÓÚÊÇÔ¶³Ì²Ù×÷£¬ÖмäÍøÂç»á¶Ïµô£¬ËùÒÔ·ÅÔÚÒ»ÌõÃüÁîÖÐÖ´ÐС£ ip addr add 10.10.101.105/24 dev br0; \ ip addr del 10.10.101.105/24 dev eth0; \ brctl addif br0 eth0; \ ip route del default; \ ip route add default gw 10.10.101.254 dev br0 |
Íê³ÉÉÏÊö²½Öèºó£¬ÎÒÃÇ·¢ÏÖDockerÈÝÆ÷ÒѾ¿ÉÒÔʹÓÃеÄIPºÍÖ÷»úÍøÂçÀïµÄ»úÆ÷Ï໥ͨÐÅÁË¡£
pipework¹¤×÷ÔÀí·ÖÎö
ÄÇôÈÝÆ÷µ½µ×·¢ÉúÁËÄÄЩ±ä»¯ÄØ£¿ÎÒÃÇdocker attachµ½test1ÉÏ£¬·¢ÏÖÈÝÆ÷ÖжàÁËÒ»¿éeth1µÄÍø¿¨£¬²¢ÇÒÅäÖÃÁË10.10.101.150/24µÄIP£¬¶øÇÒĬÈÏ·ÓÉÒ²¸ÄΪÁË10.10.101.254¡£ÕâЩ¶¼ÊÇpipework°ïÎÒÃÇÅäÖõġ£Í¨¹ý²é¿´Ô´´úÂ룬¿ÉÒÔ·¢ÏÖpipework
br0 test1 10.10.101.150/24@10.10.101.254ÊÇÓÉÒÔÏÂÃüÁîÍê³ÉµÄ£¨ÕâÀïÖ»ÁгöÁ˾ßÌåÖ´ÐвÙ×÷µÄ´úÂ룩¡£
#´´½¨br0ÍøÇÅ #Èôovs¿ªÍ·£¬Ôò´´½¨OVSÍøÇÅ ovs-vsctl add-br ovs* brctl addbr $IFNAME #´´½¨veth pair,ÓÃÓÚÁ¬½ÓÈÝÆ÷ºÍbr0 ip link add name $LOCAL_IFNAME mtu $MTU type veth peer name $GUEST_IFNAME mtu $MTU #ÕÒµ½DockerÈÝÆ÷test1ÔÚÖ÷»úÉϵÄPID,´´½¨ÈÝÆ÷ÍøÂçÃüÃû¿Õ¼äµÄÈíÁ¬½Ó DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' $GUESTNAME) ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID #½«veth pairÒ»¶Ë·ÅÈëDockerÈÝÆ÷ÖУ¬²¢ÉèÖÃÕýÈ·µÄÃû×Öeth1 ip link set $GUEST_IFNAME netns $NSPID ip netns exec $NSPID ip link set $GUEST_IFNAME name $CONTAINER_IFNAME #½«veth pairÁíÒ»¶Ë¼ÓÈëÍøÇÅ #ÈôΪOVSÍøÇÅÔòΪ ovs-vsctl add-port $IFNAME $LOCAL_IFNAME ${VLAN:+"tag=$VLAN"} brctl addif $IFNAME $LOCAL_IFNAME #ΪÐÂÔö¼ÓµÄÈÝÆ÷ÅäÖÃIPºÍ·ÓÉ ip netns exec $NSPID ip addr add $IPADDR dev $CONTAINER_IFNAME ip netns exec $NSPID ip link set $CONTAINER_IFNAME up ip netns exec $NSPID ip route delete default ip netns exec $NSPID ip route add $GATEWAY/32 dev $CONTAINER_IFNAME |
Ê×ÏÈpipework¼ì²éÊÇ·ñ´æÔÚbr0ÍøÇÅ£¬Èô²»´æÔÚ£¬¾Í×Ô¼º´´½¨¡£ÈôÒÔ"ovs"¿ªÍ·£¬¾Í»á´´½¨OpenVswitchÍøÇÅ£¬ÒÔ"br"¿ªÍ·£¬´´½¨Linux
bridge¡£
´´½¨veth pairÉ豸£¬ÓÃÓÚΪÈÝÆ÷Ìá¹©Íø¿¨²¢Á¬½Óµ½br0ÍøÇÅ¡£
ʹÓÃdocker inspectÕÒµ½ÈÝÆ÷ÔÚÖ÷»úÖеÄPID£¬È»ºóͨ¹ýPID½«ÈÝÆ÷µÄÍøÂçÃüÃû¿Õ¼äÁ´½Óµ½/var/run/netns/Ŀ¼Ï¡£Õâô×öµÄÄ¿µÄÊÇ£¬·½±ãÔÚÖ÷»úÉÏʹÓÃip
netnsÃüÁîÅäÖÃÈÝÆ÷µÄÍøÂç¡£ÒòΪ£¬ÔÚDockerÈÝÆ÷ÖУ¬ÎÒÃÇûÓÐȨÏÞÅäÖÃÍøÂç»·¾³¡£
½«Ö®Ç°´´½¨µÄveth pairÉ豸·Ö±ð¼ÓÈëÈÝÆ÷ºÍÍøÇÅÖС£ÔÚÈÝÆ÷ÖеÄÃû³ÆÄ¬ÈÏΪeth1£¬¿ÉÒÔͨ¹ýpipeworkµÄ-i²ÎÊýÐ޸ĸÃÃû³Æ¡£
È»ºó¾ÍÊÇÅäÖÃÐÂÍø¿¨µÄIP¡£ÈôÔÚIPµØÖ·µÄºóÃæ¼ÓÉÏÍø¹ØµØÖ·£¬ÄÇôpipework»áÖØÐÂÅäÖÃĬÈÏ·ÓÉ¡£ÕâÑùÈÝÆ÷ͨÍùÍâÍøµÄÁ÷Á¿»á¾ÓÉÐÂÅäÖõÄeth1³öÈ¥£¬¶ø²»ÊÇͨ¹ýeth0ºÍdocker0¡£(ÈôÏëÍêÈ«Åׯú×Ô´øµÄÍøÂçÉèÖã¬ÔÚÆô¶¯ÈÝÆ÷µÄʱºò¿ÉÒÔÖ¸¶¨--net=none)
ÒÔÉϾÍÊÇpipeworkÅäÖÃDockerÍøÂçµÄ¹ý³Ì£¬ÕâºÍDockerµÄbridgeģʽÓÐ×ÅÏàËÆµÄ²½Öè¡£ÊÂʵÉÏ£¬DockerÔÚʵÏÖÉÏÒ²²ÉÓÃÁËÏàͬµÄµ×²ã»úÖÆ¡£
ͨ¹ýÔ´´úÂ룬¿ÉÒÔ¿´³ö£¬pipeworkͨ¹ý·â×°LinuxÉϵÄip¡¢brctlµÈÃüÁ¼ò»¯ÁËÔÚ¸´ÔÓ³¡¾°Ï¶ÔÈÝÆ÷Á¬½ÓµÄ²Ù×÷ÃüÁΪÎÒÃÇÅäÖø´ÔÓµÄÍøÂçÍØÆËÌṩÁËÒ»¸öÇ¿ÓÐÁ¦µÄ¹¤¾ß¡£µ±È»£¬Èç¹ûÏëÁ˽âµ×²ãµÄ²Ù×÷£¬ÎÒÃÇÒ²¿ÉÒÔÖ±½ÓʹÓÃÕâЩLinuxÃüÁîÀ´Íê³É¹¤×÷£¬ÉõÖÁ¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÐèÇó£¬Ìí¼Ó¶îÍâµÄ¹¦ÄÜ¡£
2.2 µ¥Ö÷»úDockerÈÝÆ÷VLAN»®·Ö
pipework²»½ö¿ÉÒÔʹÓÃLinux bridgeÁ¬½ÓDockerÈÝÆ÷£¬»¹¿ÉÒÔÓëOpenVswitch½áºÏ£¬ÊµÏÖDockerÈÝÆ÷µÄVLAN»®·Ö¡£ÏÂÃæ£¬¾ÍÀ´¼òµ¥ÑÝʾһÏ£¬ÔÚµ¥»ú»·¾³Ï£¬ÈçºÎʵÏÖDockerÈÝÆ÷¼äµÄ¶þ²ã¸ôÀë¡£
ΪÁËÑÝʾ¸ôÀëЧ¹û£¬ÎÒÃǽ«4¸öÈÝÆ÷·ÅÔÚÁËͬһ¸öIPÍø¶ÎÖС£µ«Êµ¼ÊËûÃÇÊǶþ²ã¸ôÀëµÄÁ½¸öÍøÂ磬Óв»Í¬µÄ¹ã²¥Óò¡£
#ÔÚÖ÷»úAÉÏ´´½¨4¸öDockerÈÝÆ÷£¬test1¡¢test2¡¢test3¡¢test4 docker run -itd --name test1 ubuntu /bin/bash docker run -itd --name test2 ubuntu /bin/bash docker run -itd --name test3 ubuntu /bin/bash docker run -itd --name test4 ubuntu /bin/bash #½«test1£¬test2»®·Öµ½Ò»¸övlanÖУ¬vlanÔÚmacµØÖ·ºó¼Ó@Ö¸¶¨£¬´Ë´¦macµØÖ·Ê¡ÂÔ¡£ pipework ovs0 test1 192.168.0.1/24 @100 pipework ovs0 test2 192.168.0.2/24 @100 #½«test3£¬test4»®·Öµ½ÁíÒ»¸övlanÖÐ pipework ovs0 test3 192.168.0.3/24 @200 pipework ovs0 test4 192.168.0.4/24 @200 |
Íê³ÉÉÏÊö²Ù×÷ºó£¬Ê¹ÓÃdocker attachÁ¬µ½ÈÝÆ÷ÖУ¬È»ºóÓÃpingÃüÁî²âÊÔÁ¬Í¨ÐÔ£¬·¢ÏÖtest1ºÍtest2¿ÉÒÔÏ໥ͨÐÅ£¬µ«Óëtest3ºÍtest4¸ôÀë¡£ÕâÑù£¬Ò»¸ö¼òµ¥µÄVLAN¸ôÀëÈÝÆ÷ÍøÂç¾ÍÒѾÍê³É¡£
ÓÉÓÚOpenVswitch±¾ÉíÖ§³ÖVLAN¹¦ÄÜ£¬ËùÒÔÕâÀïpipeworkËù×öµÄ¹¤×÷ºÍ֮ǰ½éÉܵĻù±¾Ò»Ñù£¬Ö»²»¹ý½«Linux
bridgeÌæ»»³ÉÁËOpenVswitch£¬ÔÚ½«veth pairµÄÒ»¶Ë¼ÓÈëovs0ÍøÇÅʱ£¬Ö¸¶¨ÁËtag¡£µ×²ã²Ù×÷ÈçÏ£º
ovs-vsctl add-port ovs0 veth* tag=100 |
2.3 ¶àÖ÷»úDockerÈÝÆ÷µÄVLAN»®·Ö
ÉÏÃæ½éÉÜÍêÁ˵¥Ö÷»úÉÏVLANµÄ¸ôÀ룬ÏÂÃæÎÒÃǽ«Çé¿öÑÓÉìµ½¶àÖ÷»úµÄÇé¿ö¡£ÓÐÁËÇ°ÃæÁ½¸öÀý×Ó×öÆÌµæ£¬Õâ¸öÒ²¾Í²»ÄÑÁË¡£ÎªÁËʵÏÖÕâ¸öÄ¿µÄ£¬ÎÒÃǰÑËÞÖ÷»úÉϵÄÍø¿¨ÇŽӵ½¸÷×ÔµÄOVSÍøÇÅÉÏ£¬È»ºóÔÙΪÈÝÆ÷ÅäÖÃIPºÍVLAN¾Í¿ÉÒÔÁË¡£ÎÒÃÇʵÑé»·¾³ÈçÏ£¬Ö÷»úAºÍB¸÷ÓÐÒ»¿éÍø¿¨eth0£¬IPµØÖ··Ö±ðΪ10.10.101.105/24¡¢10.10.101.106/24¡£ÔÚÖ÷»úAÉÏ´´½¨Á½¸öÈÝÆ÷test1¡¢test2£¬·Ö±ðÔÚVLAN
100ºÍVLAN 200ÉÏ¡£ÔÚÖ÷»úBÉÏ´´½¨test3¡¢test4£¬·Ö±ðÔÚVLAN 100ºÍVLAN 200
ÉÏ¡£×îÖÕ£¬test1¿ÉÒÔºÍtest3ͨÐÅ£¬test2¿ÉÒÔºÍtest4ͨÐÅ¡£
#ÔÚÖ÷»úAÉÏ #´´½¨DockerÈÝÆ÷ docker run -itd --name test1 ubuntu /bin/bash docker run -itd --name test2 ubuntu /bin/bash #»®·ÖVLAN pipework ovs0 test1 192.168.0.1/24 @100 pipework ovs0 test2 192.168.0.2/24 @200 #½«eth0ÇŽӵ½ovs0ÉÏ ip addr add 10.10.101.105/24 dev ovs0; \ ip addr del 10.10.101.105/24 dev eth0; \ ovs-vsctl add-port ovs0 eth0; \ ip route del default; \ ip route add default gw 10.10.101.254 dev ovs0 #ÔÚÖ÷»úBÉÏ #´´½¨DockerÈÝÆ÷ docker run -itd --name test3 ubuntu /bin/bash docker run -itd --name test4 ubuntu /bin/bash #»®·ÖVLAN pipework ovs0 test1 192.168.0.3/24 @100 pipework ovs0 test2 192.168.0.4/24 @200 #½«eth0ÇŽӵ½ovs0ÉÏ ip addr add 10.10.101.106/24 dev ovs0; \ ip addr del 10.10.101.106/24 dev eth0; \ ovs-vsctl add-port ovs0 eth0; \ ip route del default; \ ip route add default gw 10.10.101.254 dev ovs0 |
Íê³ÉÉÏÃæµÄ²½Öèºó£¬Ö÷»úAÉϵÄtest1ºÍÖ÷»úBÉϵÄtest3ÈÝÆ÷¾Í»®·Öµ½ÁËÒ»¸öVLANÖУ¬²¢ÇÒÓëÖ÷»úAÉϵÄtest2ºÍÖ÷»úBÉϵÄtest4¸ôÀ루Ö÷»úeth0Íø¿¨ÐèÒªÉèÖÃΪ»ìÔÓģʽ£¬Á¬½ÓÖ÷»úµÄ½»»»»ú¶Ë¿ÚÓ¦ÉèÖÃΪtrunkģʽ£¬¼´ÔÊÐíVLAN
100ºÍVLAN 200µÄ°üͨ¹ý£©¡£ÍØÆËͼÈçÏÂËùʾ£¨Ê¡È¥ÁËDockerĬÈϵÄeth0Íø¿¨ºÍÖ÷»úÉϵÄdocker0ÍøÇÅ£©£º

³ý´ËÖ®Í⣬pipework»¹Ö§³ÖʹÓÃmacvlanÉ豸¡¢ÉèÖÃÍø¿¨MACµØÖ·µÈ¹¦ÄÜ¡£²»¹ý£¬pipeworkÓÐÒ»¸öȱÏÝ£¬¾ÍÊÇÅäÖõÄÈÝÆ÷ÔڹصôÖØÆôºó£¬Ö®Ç°µÄÉèÖûᶪʧ¡£
3. ×ܽá
ͨ¹ýÉÏÃæµÄ½éÉÜ£¬ÎÒÏàÐÅ´ó¼Ò¶ÔDockerµÄÍøÂçÒѾÓÐÁËÒ»¶¨µÄÁ˽⡣¶ÔÓÚÒ»¸ö»ù±¾Ó¦ÓöøÑÔ£¬DockerµÄÍøÂçÄ£ÐÍÒѾºÜ²»´íÁË¡£È»¶ø£¬Ëæ×ÅÔÆ¼ÆËãºÍ΢·þÎñµÄÐËÆð£¬ÎÒÃDz»ÄÜÓÀÔ¶Í£ÁôÔÚʹÓûù±¾Ó¦Óõļ¶±ðÉÏ£¬ÎÒÃÇÐèÒªÐÔÄܸüºÃÇÒ¸üÁé»îµÄÍøÂ繦ÄÜ¡£pipeworkÕýºÃÂú×ãÁËÎÒÃÇÕâÑùµÄÐèÇ󣬴ÓÉÏÃæµÄÑùÀýÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½pipeworkµÄ·½±ãÖ®´¦¡£µ«ÊÇ£¬Í¬Ê±Ò²Ó¦×¢Òâµ½£¬pipework²¢²»ÊÇÒ»Ì×½â¾ö·½°¸£¬ËüÖ»ÊÇÒ»¸öÍøÂçÅäÖù¤¾ß£¬ÎÒÃÇ¿ÉÒÔÀûÓÃËüÌṩµÄÇ¿´ó¹¦ÄÜ£¬°ïÖúÎÒÃǹ¹½¨×Ô¼ºµÄ½â¾ö·½°¸¡£
|