Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
DockerÍøÂçÏê½â¼°pipeworkÔ´Âë½â¶ÁÓëʵ¼ù
 
×÷Õߣº·ëÃ÷Õñ À´Ô´£ºInfoQ ·¢²¼ÓÚ 2015-2-2
  2274  次浏览      30
 

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²¢²»ÊÇÒ»Ì×½â¾ö·½°¸£¬ËüÖ»ÊÇÒ»¸öÍøÂçÅäÖù¤¾ß£¬ÎÒÃÇ¿ÉÒÔÀûÓÃËüÌṩµÄÇ¿´ó¹¦ÄÜ£¬°ïÖúÎÒÃǹ¹½¨×Ô¼ºµÄ½â¾ö·½°¸¡£

   
2274 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ