±¾½Ì³ÌÓÐÈý¸öÄ¿±ê£ºËµÃ÷Docker½â¾öµÄÎÊÌ⡢˵Ã÷ËüÈçºÎ½â¾öÕâ¸öÎÊÌâ¡¢ÒÔ¼°ËµÃ÷ËüʹÓÃÁËÄÄЩ¼¼ÊõÀ´½â¾öÕâ¸öÎÊÌ⣬Õâ²»ÊÇһƪ½ÌÄãÔõôÔËÐа²×°DockerµÄ½Ì³Ì¡£
DockerÊÇÒ»¸öÏà¶Ô½ÏÐÂÇÒ·¢Õ¹·Ç³£¿ìËÙµÄÏîÄ¿£¬¿ÉÓÃÀ´´´½¨·Ç³£ÇáÁ¿µÄ¡°ÐéÄâ»ú¡±¡£×¢ÒâÕâÀïµÄÒýºÅ·Ç³£ÖØÒª£¬Docker´´½¨µÄ²¢·ÇÕæÕýµÄÐéÄâ»ú£¬¶ø¸üÏñÊÇ´òÁ˼¤ËصÄchroot£¬àÅ£¬ÊÇ´óÁ¿µÄ¼¤ËØ¡£
ÔÚÎÒÃǼÌÐøÖ®Ç°£¬ÎÒÏÈ˵Ï£¬½ØÖÁĿǰ£¨2015Äê1ÔÂ4ÈÕ£©ÎªÖ¹£¬DockerÖ»ÄÜÔÚLinuxÉϹ¤×÷£¬Ôݲ»Ö§³ÖWindows»òOSX£¨ÒëÕß×¢£º²»Ö±½ÓÖ§³Ö£©¡£ÎÒÉÔºó»á½²µ½DockerµÄ¼Ü¹¹£¬Äã»áÃ÷°×ÆäÖеÄÔÒò¡£ËùÒÔ£¬Èç¹ûÏëÔÚ·ÇLinuxƽ̨ÉÏʹÓÃDocker£¬ÄãÐèÒªÔÚÐéÄâ»úÀïÔËÐÐLinux¡£
±¾½Ì³ÌÓÐÈý¸öÄ¿±ê£ºËµÃ÷Docker½â¾öµÄÎÊÌ⡢˵Ã÷ËüÈçºÎ½â¾öÕâ¸öÎÊÌâ¡¢ÒÔ¼°ËµÃ÷ËüʹÓÃÁËÄÄЩ¼¼ÊõÀ´½â¾öÕâ¸öÎÊÌâ¡£Õâ²»ÊÇһƪ½ÌÄãÔõôÔËÐа²×°DockerµÄ½Ì³Ì£¬Docker´ËÀà½Ì³ÌÒѾÓкܶ࣬°üÀ¨Docker×÷ÕßµÄÔÚÏß»¥¶¯½Ì³Ì£¨ÒëÕß×¢£º×÷ÕߺÜϲ»¶ÔÚÒ»¸ö¾ä×ÓÀïÒýÓöà¸öÁ´½Ó£¬ÏÂͬ£©¡£±¾ÎÄ×îºóÓÐÒ»¸ö²½Öè˵Ã÷£¬Ä¿µÄÊÇÓÃÒ»¸öÃ÷È·µÄÏÖʵÊÀ½çµÄÀý×ÓÀ´´®ÁªÎÄÕÂÖÐËùÓеÄÀíÂÛ£¬µ«²»»áÌ«¹ýÏêϸ¡£
DockerÄÜ×öʲô£¿
Docker¿ÉÒÔ½â¾öÐéÄâ»úÄܹ»½â¾öµÄÎÊÌ⣬ͬʱҲÄܹ»½â¾öÐéÄâ»úÓÉÓÚ×ÊÔ´ÒªÇó¹ý¸ß¶øÎÞ·¨½â¾öµÄÎÊÌâ¡£DockerÄÜ´¦ÀíµÄÊÂÇé°üÀ¨£º
1.¸ôÀëÓ¦ÓÃÒÀÀµ
2.´´½¨Ó¦ÓþµÏñ²¢½øÐи´ÖÆ
3.´´½¨ÈÝÒ×·Ö·¢µÄ¼´Æô¼´ÓõÄÓ¦ÓÃ
4.ÔÊÐíʵÀý¼òµ¥¡¢¿ìËÙµØÀ©Õ¹
5.²âÊÔÓ¦Óò¢ËæºóÏú»ÙËüÃÇ
Docker±³ºóµÄÏë·¨ÊÇ´´½¨Èí¼þ³ÌÐò¿ÉÒÆÖ²µÄÇáÁ¿ÈÝÆ÷£¬ÈÃÆä¿ÉÒÔÔÚÈκΰ²×°ÁËDockerµÄ»úÆ÷ÉÏÔËÐУ¬¶ø²»ÓùØÐĵײã²Ù×÷ϵͳ£¬ÀàËÆ´¬²°Ê¹Óõļ¯×°Ï䣬ҰÐIJª²ªµÄËûÃdzɹ¦ÁË¡£
Docker¾¿¾¹×öÁËʲô£¿
ÕâÒ»½ÚÎÒ²»»á˵Ã÷DockerʹÓÃÁËÄÄЩ¼¼ÊõÀ´Íê³ÉËüµÄ¹¤×÷£¬»òÓÐʲô¾ßÌåµÄÃüÁî¿ÉÓã¬ÕâЩ·ÅÔÚÁË×îºóÒ»½Ú£¬ÕâÀïÎÒ½«ËµÃ÷µÄÊÇDockerÌṩµÄ×ÊÔ´ºÍ³éÏó¡£
DockerÁ½¸ö×îÖØÒªµÄ¸ÅÄîÊǾµÏñºÍÈÝÆ÷¡£³ý´ËÖ®Í⣬Á´½ÓºÍÊý¾Ý¾íÒ²ºÜÖØÒª¡£ÎÒÃÇÏÈ´Ó¾µÏñÈëÊÖ¡£
¾µÏñ
DockerµÄ¾µÏñÀàËÆÐéÄâ»úµÄ¿ìÕÕ£¬µ«¸üÇáÁ¿£¬·Ç³£·Ç³£ÇáÁ¿£¨Ï½Úϸ˵£©¡£
´´½¨Docker¾µÏñÓм¸ÖÖ·½Ê½£¬¶àÊýÊÇÔÚÒ»¸öÏÖÓоµÏñ»ù´¡ÉÏ´´½¨Ð¾µÏñ£¬ÒòΪ¼¸ºõÄãÐèÒªµÄÈκζ«Î÷¶¼ÓÐÁ˹«¹²¾µÏñ£¬°üÀ¨ËùÓÐÖ÷Á÷Linux·¢Ðа棬ÄãÓ¦¸Ã²»»áÕÒ²»µ½ÄãÐèÒªµÄ¾µÏñ¡£²»¹ý£¬¾ÍËãÄãÏë´ÓÍ·¹¹½¨Ò»¸ö¾µÏñ£¬Ò²Óкü¸ÖÖ·½·¨¡£
Òª´´½¨Ò»¸ö¾µÏñ£¬Äã¿ÉÒÔÄÃÒ»¸ö¾µÏñ£¬¶ÔËü½øÐÐÐÞ¸ÄÀ´´´½¨ËüµÄ×Ó¾µÏñ¡£ÊµÏֵķ½Ê½ÓÐÁ½ÖÖ£ºÔÚÒ»¸öÎļþÖÐÖ¸¶¨Ò»¸ö»ù´¡¾µÏñ¼°ÐèÒªÍê³ÉµÄÐ޸ģ»»òͨ¹ý¡°ÔËÐС±Ò»¸ö¾µÏñ£¬¶ÔÆä½øÐÐÐ޸IJ¢Ìá½»¡£²»Í¬·½Ê½¸÷ÓÐÓŵ㣬²»¹ýÒ»°ã»áʹÓÃÎļþÀ´Ö¸¶¨Ëù×öµÄ±ä»¯¡£
¾µÏñÓµÓÐΨһID£¬ÒÔ¼°Ò»¸ö¹©ÈËÔĶÁµÄÃû×ֺͱêÇ©¶Ô¡£¾µÏñ¿ÉÒÔÃüÃûΪÀàËÆubuntu:latest¡¢ubuntu:precise¡¢django:1.6¡¢django:1.7µÈµÈ¡£
ÈÝÆ÷
ÏÖÔÚ˵ÈÝÆ÷ÁË¡£Äã¿ÉÒÔ´Ó¾µÏñÖд´½¨ÈÝÆ÷£¬ÕâµÈͬÓÚ´Ó¿ìÕÕÖд´½¨ÐéÄâ»ú£¬²»¹ý¸üÇáÁ¿¡£Ó¦ÓÃÊÇÓÉÈÝÆ÷ÔËÐеġ£
¾Ù¸öÀý×Ó£¬Äã¿ÉÒÔÏÂÔØÒ»¸öUbuntuµÄ¾µÏñ£¨Óиö½Ðdocker registryµÄ¾µÏñ¹«¹²²Ö¿â£©£¬Í¨¹ý°²×°GunicornºÍÄãµÄDjangoÓ¦Óü°ÆäÒÀÀµÍê³É¶ÔËüµÄÐ޸ģ¬È»ºó´Ó¸Ã¾µÏñÖд´½¨Ò»¸öÈÝÆ÷£¬ÔÚËüÆô¶¯ºóÔËÐÐÄãµÄÓ¦Óá£

ÈÝÆ÷ÓëÐéÄâ»úÒ»Ñù£¬ÊǸôÀëµÄ£¨ÓÐÒ»µãҪעÒ⣬ÎÒÉÔºó»áÌÖÂÛµ½£©¡£ËüÃÇÒ²ÓµÓÐÒ»¸öΨһIDºÍΨһµÄ¹©ÈËÔĶÁµÄÃû×Ö¡£ÈÝÆ÷ÓбØÒª¶ÔÍⱩ¶·þÎñ£¬Òò´ËDockerÔÊÐí±©Â¶ÈÝÆ÷µÄÌØ¶¨¶Ë¿Ú¡£

ÈÝÆ÷ÓëÐéÄâ»úÏà±ÈÓÐÁ½¸öÖ÷Òª²îÒì¡£µÚÒ»¸öÊÇ£ºËüÃDZ»Éè¼Æ³ÉÔËÐе¥½ø³Ì£¬ÎÞ·¨ºÜºÃµØÄ£ÄâÒ»¸öÍêÕûµÄ»·¾³£¨Èç¹ûÄÇÊÇÄãÐèÒªµÄ£¬Çë¿´¿´LXC£©¡£Äã¿ÉÄ᳢ܻÊÔÔËÐÐrunit»òsupervisordʵÀýÀ´Æô¶¯¶à¸ö½ø³Ì£¬µ«£¨ÒÔÎÒµÄÓÞ¼û£©ÕâÕæµÄûÓбØÒª¡£
µ¥½ø³ÌÓë¶à½ø³ÌÖ®Õù·Ç³£¾«²Ê¡£ÄãÓ¦¸ÃÖªµÀµÄÊÇ£¬DockerÉè¼ÆÕß¼«Á¦ÍƳ硰һ¸öÈÝÆ÷Ò»¸ö½ø³ÌµÄ·½Ê½¡±£¬Èç¹ûÄãҪѡÔñÔÚÒ»¸öÈÝÆ÷ÖÐÔËÐжà¸ö½ø³Ì£¬ÄÇΨһÇé¿öÊÇ£º³öÓÚµ÷ÊÔÄ¿µÄ£¬ÔËÐÐÀàËÆsshµÄ¶«Î÷À´·ÃÎÊÔËÐÐÖеÄÈÝÆ÷£¬²»¹ýdocker
execÃüÁî½â¾öÁËÕâ¸öÎÊÌâ¡£
ÈÝÆ÷ºÍÐéÄâ»úµÄµÚ¶þ¸ö¾Þ´ó²îÒìÊÇ£ºµ±ÄãÍ£Ö¹Ò»¸öÐéÄâ»úʱ£¬¿ÉÄܳýÁËһЩÁÙʱÎļþ£¬Ã»ÓÐÎļþ»á±»É¾³ý£»µ±ÄãÍ£Ö¹Ò»¸öDockerÈÝÆ÷£¬¶Ô³õʼ״̬£¨´´½¨ÈÝÆ÷ËùÓõľµÏñµÄ״̬£©×öµÄËùÓб仯¶¼»á¶ªÊ§¡£ÕâÊÇʹÓÃDockerʱ±ØÐë×ö³öµÄ×î´ó˼ά±ä»¯Ö®Ò»£ºÈÝÆ÷ÊǶÌÔݺÍÒ»´ÎÐԵġ£
Êý¾Ý¾í
Èç¹ûÄãµÄµç×ÓÉÌÎñÍøÕ¾¸ÕÊÕµ½¿Í»§Ö§¸¶µÄ3ÍòÔª£¬Äں˱ÀÀ£ÁË£¬ËùÓÐÊý¾Ý¿â±ä»¯¶¼¶ªÊ§ÁË¡¡¶ÔÄã»òDockerÀ´Ëµ¶¼²»ÊÇÒ»¼þºÃÊ£¬²»¹ý²»Òªµ£ÐÄ¡£DockerÔÊÐíÄ㶨ÒåÊý¾Ý¾í¡ª¡ªÓÃÓÚ±£´æ³Ö¾ÃÊý¾ÝµÄ¿Õ¼ä¡£DockerÇ¿ÖÆÄ㶨ÒåÓ¦Óò¿·ÖºÍÊý¾Ý²¿·Ö£¬²¢ÒªÇóÄ㽫ËüÃÇ·Ö¿ª¡£
¾íÊÇÕë¶ÔÈÝÆ÷µÄ£¬Äã¿ÉÒÔʹÓÃͬһ¸ö¾µÏñ´´½¨¶à¸öÈÝÆ÷²¢¶¨Ò岻ͬµÄ¾í¡£¾í±£´æÔÚÔËÐÐDockerµÄËÞÖ÷ÎļþϵͳÉÏ£¬Äã¿ÉÒÔÖ¸¶¨¾í´æ·ÅµÄĿ¼£¬»òÈÃDocker±£´æÔÚĬÈÏλÖᣱ£´æÔÚÆäËûÀàÐÍÎļþϵͳÉϵͼ²»ÊÇÒ»¸ö¾í£¬ÉÔºóÔÙ¾ßÌå˵¡£

Á´½Ó
Á´½ÓÊÇDockerµÄÁíÒ»¸öÖØÒª²¿·Ö¡£
ÈÝÆ÷Æô¶¯Ê±£¬½«±»·ÖÅäÒ»¸öËæ»úµÄ˽ÓÐIP£¬ÆäËüÈÝÆ÷¿ÉÒÔʹÓÃÕâ¸öIPµØÖ·ÓëÆä½øÐÐͨѶ¡£Õâµã·Ç³£ÖØÒª£¬ÔÒòÓжþ£ºÒ»ÊÇËüÌṩÁËÈÝÆ÷¼äÏ໥ͨÐŵÄÇþµÀ£¬¶þÊÇÈÝÆ÷½«¹²ÏíÒ»¸ö±¾µØÍøÂç¡£ÎÒÔø¾Åöµ½Ò»¸öÎÊÌ⣬ÔÚͬһ̨»úÆ÷ÉÏΪÁ½¸ö¿Í»§Æô¶¯Á½¸öelasticsearchÈÝÆ÷£¬µ«±£Áô¼¯ÈºÃû³ÆÎªÄ¬ÈÏÉèÖ㬽á¹ûÕâÁ½Ì¨elasticsearch·þÎñÆ÷Á¢Âí±ä³ÉÁËÒ»¸ö×ÔÖ÷¼¯Èº¡£
Òª¿ªÆôÈÝÆ÷¼äͨѶ£¬DockerÔÊÐíÄãÔÚ´´½¨Ò»¸öÐÂÈÝÆ÷ʱÒýÓÃÆäËüÏÖ´æÈÝÆ÷£¬ÔÚÄã¸Õ´´½¨µÄÈÝÆ÷Àï±»ÒýÓõÄÈÝÆ÷½«»ñµÃÒ»¸ö£¨ÄãÖ¸¶¨µÄ£©±ðÃû¡£ÎÒÃǾÍ˵£¬ÕâÁ½¸öÈÝÆ÷Á´½ÓÔÚÁËÒ»Æð¡£
Òò´Ë£¬Èç¹ûDBÈÝÆ÷ÒѾÔÚÔËÐУ¬ÎÒ¿ÉÒÔ´´½¨web·þÎñÆ÷ÈÝÆ÷£¬²¢ÔÚ´´½¨Ê±ÒýÓÃÕâ¸öDBÈÝÆ÷£¬¸øËüÒ»¸ö±ðÃû£¬±ÈÈçdbapp¡£ÔÚÕâ¸öн¨µÄweb·þÎñÆ÷ÈÝÆ÷ÀÎÒ¿ÉÒÔÔÚÈκÎʱºòʹÓÃÖ÷»úÃûdbappÓëDBÈÝÆ÷½øÐÐͨѶ¡£
Docker¸ü½øÒ»²½£¬ÒªÇóÄãÉùÃ÷ÈÝÆ÷ÔÚ±»Á´½ÓʱҪ¿ª·ÅÄÄЩ¶Ë¿Ú¸øÆäËûÈÝÆ÷£¬·ñÔò½«Ã»Óж˿ڿÉÓá£

Docker¾µÏñµÄ¿ÉÒÆÖ²ÐÔ
ÔÚ´´½¨¾µÏñʱÓÐÒ»µãҪעÒâ¡£DockerÔÊÐíÄãÔÚÒ»¸ö¾µÏñÖÐÖ¸¶¨¾íºÍ¶Ë¿Ú¡£´ÓÕâ¸ö¾µÏñ´´½¨µÄÈÝÆ÷¼Ì³ÐÁËÕâЩÉèÖᣵ«ÊÇ£¬Docker²»ÔÊÐíÄãÔÚ¾µÏñÉÏÖ¸¶¨Èκβ»¿ÉÒÆÖ²µÄÄÚÈÝ¡£
ÀýÈ磬Äã¿ÉÒÔÔÚ¾µÏñÀﶨÒå¾í£¬Ö»ÒªËüÃDZ»±£´æÔÚDockerʹÓõÄĬÈÏλÖá£ÕâÊÇÒòΪÈç¹ûÄãÔÚËÞÖ÷ÎļþϵͳÀïÖ¸¶¨ÁËÒ»¸öÌØ¶¨Ä¿Â¼À´±£´æ¾í£¬ÆäËûʹÓÃÕâ¸ö¾µÏñµÄËÞÖ÷ÎÞ·¨±£Ö¤Õâ¸öĿ¼ÊÇ´æÔڵġ£
Äã¿ÉÒÔ¶¨ÒåÒª±©Â¶µÄ¶Ë¿Ú£¬µ«½öÏÞÄÇЩÔÚ´´½¨Á´½Óʱ±©Â¶¸øÆäËûÈÝÆ÷µÄ¶Ë¿Ú£¬Äã²»ÄÜÖ¸¶¨±©Â¶¸øËÞÖ÷µÄ¶Ë¿Ú£¬ÒòΪÄãÎÞ´ÓÖªÏþʹÓÃÄǸö¾µÏñµÄËÞÖ÷ÓÐÄÄЩ¶Ë¿Ú¿ÉÓá£
ÄãÒ²²»ÄÜÔÚ¾µÏñÉ϶¨ÒåÁ´½Ó¡£Ê¹ÓÃÁ´½ÓÒªÇóͨ¹ýÃû×ÖÒýÓÃÆäËûÈÝÆ÷£¬µ«ÄãÎÞ·¨Ô¤ÖªÃ¿¸öʹÓÃÄǸö¾µÏñµÄËÞÖ÷ÈçºÎÃüÃûÈÝÆ÷¡£
¾µÏñ±ØÐëÍêÈ«¿ÉÒÆÖ²£¬Docker²»ÔÊÐíÀýÍâ¡£
ÒÔÉϾÍÊÇÖ÷ÒªµÄ²¿·Ö£¬´´½¨¾µÏñ¡¢ÓÃËüÃÇ´´½¨ÈÝÆ÷£¬ÔÚÐèҪʱ±©Â¶¶Ë¿ÚºÍ´´Ôì¾í¡¢Í¨¹ýÁ´½Ó½«¼¸¸öÈÝÆ÷Á¬½ÓÔÚÒ»Æð¡£²»¹ý£¬ÕâÒ»ÇÐÈçºÎÄÜÔÚ²»ÒýÆð¶îÍ⿪ÏúÌõ¼þÏ´ï³É£¿
DockerÈçºÎÍê³ÉËüÐèÒªÍê³ÉµÄ¶«Î÷£¿
Á½¸ö´Ê£ºcgroupsºÍunionÎļþϵͳ¡£DockerʹÓÃcgroupÀ´ÌṩÈÝÆ÷¸ôÀ룬¶øunionÎļþϵͳÓÃÓÚ±£´æ¾µÏñ²¢Ê¹ÈÝÆ÷±äµÃ¶ÌÔÝ¡£
Cgroups
ÕâÊÇLinuxÄں˹¦ÄÜ£¬ËüÈÃÁ½¼þÊÂÇé±ä³É¿ÉÄÜ£º
1.ÏÞÖÆLinux½ø³Ì×éµÄ×ÊÔ´Õ¼Óã¨ÄÚ´æ¡¢CPU£©
2.Ϊ½ø³Ì×éÖÆ×÷ PID¡¢UTS¡¢IPC¡¢ÍøÂç¡¢Óû§¼°×°ÔØÃüÃû¿Õ¼ä
ÕâÀïµÄ¹Ø¼ü´ÊÊÇÃüÃû¿Õ¼ä¡£±ÈÈç˵£¬Ò»¸öPIDÃüÃû¿Õ¼äÔÊÐíËüÀïÃæµÄ½ø³ÌʹÓøôÀëµÄPID£¬²¢ÓëÖ÷PIDÃüÃû¿Õ¼ä¶ÀÁ¢¿ªÀ´£¬Òò´ËÄã¿ÉÒÔÔÚÒ»¸öPIDÃüÃû¿Õ¼äÀïÓµÓÐ×Ô¼ºµÄPIDΪ1µÄ³õʼ»¯½ø³Ì¡£ÆäËûÃüÃû¿Õ¼äÓë´ËÀàËÆ¡£È»ºóÄã¿ÉÒÔʹÓÃcgroup´´½¨Ò»¸ö»·¾³£¬½ø³Ì¿ÉÒÔÔÚÆäÖÐÔËÐУ¬²¢Óë²Ù×÷ϵͳµÄÆäËû½ø³Ì¸ôÀ뿪£¬µ«ÕâÀïµÄ¹Ø¼üµãÊÇÕâ¸ö»·¾³ÉϵĽø³ÌʹÓõÄÊÇÒѾ¼ÓÔØºÍÔËÐеÄÄںˣ¬Òò´Ë¶îÍ⿪ÏúÓëÔËÐÐÆäËû½ø³Ì¼¸ºõÊÇÒ»ÑùµÄ¡£ChrootÖ®ÓÚcgroup¾ÍºÃÏñÎÒÖ®ÓÚÂ̾ÞÈË£¨The
Hulk£©¡¢±´¶÷£¨Bane£©ºÍ¶¾Òº£¨Venom£©µÄ×éºÏ£¨ÒëÕß×¢£º±¾ÎÄ×÷Õ߷dz£ÊÝÈõ£¬ºóÈýÕß¶¼·Ç³£Ç¿×³£©¡£
UnionÎļþϵͳ
UnionÎļþϵͳÔÊÐíͨ¹ýunion×°ÔØ±ä»¯µÄ·Ö²ãµþ¼Ó¡£ÔÚunionÎļþϵͳÀÎļþϵͳ¿ÉÒÔ±»×°ÔØÔÚÆäËûÎļþϵͳ֮ÉÏ£¬Æä½á¹û¾ÍÊÇÒ»¸ö±ä»¯µÄ·Ö²ã¼¯ºÏ¡£Ã¿¸ö×°ÔØµÄÎļþϵͳ±íʾǰһ¸öÎļþϵͳ֮ºóµÄ±ä»¯¼¯ºÏ£¬¾ÍÏñÊÇÒ»¸ödiff¡£
µ±ÄãÏÂÔØÒ»¸ö¾µÏñ£¬ÐÞ¸ÄËü£¬È»ºó±£´æ³Éа汾£¬ÄãÖ»ÊÇ´´½¨Á˼ÓÔØÔÚ°ü¹ü»ù´¡¾µÏñµÄ³õʼ²ãÉϵÄÒ»¸öеÄunionÎļþϵͳ¡£ÕâʹµÃDocker¾µÏñ·Ç³£Çᣬ±ÈÈ磺ÄãµÄDB¡¢NginxºÍSyslog¾µÏñ¶¼¿ÉÒÔ¹²Ïíͬһ¸öUbuntu»ù´¡£¬Ã¿Ò»¸ö¾µÏñ±£´æµÄÖ»ÊÇÔÚ»ù´¡Ö®ÉϹ¤×÷ÐèÒªµÄ±ä»¯¡£
½ØÖÁ2015Äê1ÔÂ4ÈÕ£¬DockerÔÊÐíÔÚunionÎļþϵͳÖÐʹÓÃaufs¡¢btrfs»òÉ豸ӳÉ䣨device
mapper£©¡£
¾µÏñ
ÎÒÃÇÀ´¿´Ò»ÏÂpostgresqlµÄÒ»¸ö¾µÏñ£º
[{ "AppArmorProfile": "", "Args": [ "postgres" ], "Config": { "AttachStderr": true, "AttachStdin": false, "AttachStdout": true, "Cmd": [ "postgres" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": [ "/docker-entrypoint.sh" ], "Env": [ "PATH=/usr/lib/postgresql/9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "LANG=en_US.utf8", "PG_MAJOR=9.3", "PG_VERSION=9.3.5-1.pgdg70 1", "PGDATA=/var/lib/postgresql/data" ], "ExposedPorts": { "5432/tcp": {} }, "Hostname": "6334a2022f21", "Image": "postgres", "MacAddress": "", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": null, "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "", "Volumes": { "/var/lib/postgresql/data": {} }, "WorkingDir": "" }, "Created": "2015-01-03T23:56:12.354896658Z", "Driver": "devicemapper", "ExecDriver": "native-0.2", "HostConfig": { "Binds": null, "CapAdd": null, "CapDrop": null, "ContainerIDFile": "", "Devices": null, "Dns": null, "DnsSearch": null, "ExtraHosts": null, "IpcMode": "", "Links": null, "LxcConf": null, "NetworkMode": "", "PortBindings": null, "Privileged": false, "PublishAllPorts": false, "RestartPolicy": { "MaximumRetryCount": 0, "Name": "" }, "SecurityOpt": null, "VolumesFrom": [ "bestwebappever.dev.db-data" ] }, "HostnamePath": "/mnt/docker/containers/
6334a2022f213f9534b45df33c64437081a38d50c7f462692b019185b8cbc6da/hostname", "HostsPath": "/mnt/docker/containers/
6334a2022f213f9534b45df33c64437081a38d50c7f462692b019185b8cbc6da/hosts", "Id": "6334a2022f213f9534b45df33c64437081a38d50c7f462692b019185b8cbc6da", "Image": "aaab661c1e3e8da2d9fc6872986cbd7b9ec835dcd3886d37722f1133baa3d2db", "MountLabel": "", "Name": "/bestwebappever.dev.db", "NetworkSettings": { "Bridge": "docker0", "Gateway": "172.17.42.1", "IPAddress": "172.17.0.176", "IPPrefixLen": 16, "MacAddress": "02:42:ac:11:00:b0", "PortMapping": null, "Ports": { "5432/tcp": null } }, "Path": "/docker-entrypoint.sh", "ProcessLabel": "", "ResolvConfPath": "
/mnt/docker/containers/6334a2022f213f9534b45df33c64437081a38d50c7f462692b019185b8cbc6da/resolv.conf", "State": { "Error": "", "ExitCode": 0, "FinishedAt": "0001-01-01T00:00:00Z", "OOMKilled": false, "Paused": false, "Pid": 21654, "Restarting": false, "Running": true, "StartedAt": "2015-01-03T23:56:42.003405983Z" }, "Volumes": { "/var/lib/postgresql/data": "/mnt/docker/vfs/dir/5ac73c52ca86600a82e61279346dac0cb3e173b067ba9b219ea044023ca67561", "postgresql_data": "/mnt/docker/vfs/dir/abace588b890e9f4adb604f633c280b9b5bed7d20285aac9cc81a84a2f556034" }, "VolumesRW": { "/var/lib/postgresql/data": true, "postgresql_data": true } } |
¾ÍÊÇÕâÑù£¬¾µÏñÖ»ÊÇÒ»¸öjson£¬ËüÖ¸¶¨Á˴ӸþµÏñÔËÐеÄÈÝÆ÷µÄÌØÐÔ£¬union×°ÔØµã±£´æÔÚÄÄÀҪ±©Â¶Ê²Ã´¶Ë¿ÚµÈµÈ¡£Ã¿¸ö¾µÏñÓëÒ»¸öunionÎļþϵͳÏà¹ØÁª£¬Ã¿¸öDockerÉϵÄunionÎļþϵͳ¶¼ÓÐÒ»¸öÉϲ㣬¾ÍÏñÊǼÆËã»ú¿Æ¼¼Ê÷£¨²»ÏñÆäËûÊ÷ÓÐÒ»´ó¶ÑµÄ¼Ò×壩¡£Èç¹ûËü¿´ÆðÀ´ÓеãÏÅÈË»òÓÐЩ¶«Î÷´®²»ÆðÀ´£¬²»Òªµ£ÐÄ£¬ÕâÖ»ÊdzöÓÚ½ÌѧĿµÄ£¬Äã²¢²»»áÖ±½Ó´¦ÀíÕâЩÎļþ¡£
ÈÝÆ÷
ÈÝÆ÷Ö®ËùÒÔÊǶÌÔݵģ¬ÊÇÒòΪµ±Äã´Ó¾µÏñÉÏ´´½¨Ò»¸öÈÝÆ÷£¬Docker»á´´½¨Ò»¸ö¿Õ°×µÄunionÎļþϵͳ¼ÓÔØÔÚÓë¸Ã¾µÏñ¹ØÁªµÄunionÎļþϵͳ֮ÉÏ¡£
ÓÉÓÚunionÎļþϵͳÊǿհ׵ģ¬ÕâÒâζ×ÅûÓб仯»á±»Ó¦Óõ½¾µÏñµÄÎļþϵͳÉÏ£¬Äã´´½¨µÄ±ä»¯»áµÃµ½ÌåÏÖ£¬µ«Êǵ±ÈÝÆ÷Í£Ö¹£¬¸ÃÈÝÆ÷µÄunionÎļþϵͳ»á±»¶ªÆú£¬ÁôϵÄÊÇÄãÆô¶¯Ê±µÄÔʼ¾µÏñÎļþϵͳ¡£³ý·ÇÄã´´½¨Ò»¸öеľµÏñ£¬»òÖÆ×÷Ò»¸ö¾í£¬ÄãËù×öµÄ±ä»¯ÔÚÈÝÆ÷ֹͣʱ¶¼»áÏûʧ¡£
¾íËù×öµÄÊÇÔÚÈÝÆ÷ÄÚÖ¸¶¨Ò»¸öĿ¼£¬ÒÔ±ãÔÚunionÎļþϵͳ֮Íâ±£´æËü¡£
ÕâÊÇÒ»¸öbestwebappeverµÄÈÝÆ÷£º
[{ "AppArmorProfile": "", "Args": [], "Config": { "AttachStderr": true, "AttachStdin": false, "AttachStdout": true, "Cmd": [ "/sbin/my_init" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "DJANGO_CONFIGURATION=Local", "HOME=/root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "TALPOR_ENVIRONMENT=local", "TALPOR_DIR=/opt/bestwebappever" ], "ExposedPorts": { "80/tcp": {} }, "Hostname": "44a87fdaf870", "Image": "talpor/bestwebappever:dev", "MacAddress": "", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": null, "OpenStdin": false, "PortSpecs": null, "StdinOnce": false, "Tty": false, "User": "", "Volumes": { "/opt/bestwebappever": {} }, "WorkingDir": "/opt/bestwebappever" }, "Created": "2015-01-03T23:56:15.378511619Z", "Driver": "devicemapper", "ExecDriver": "native-0.2", "HostConfig": { "Binds": [ "/home/german/bestwebappever/:/opt/bestwebappever:rw" ], "CapAdd": null, "CapDrop": null, "ContainerIDFile": "", "Devices": null, "Dns": null, "DnsSearch": null, "ExtraHosts": null, "IpcMode": "", "Links": [ "/bestwebappever.dev.db:/bestwebappever.dev.app/db", "/bestwebappever.dev.redis:/bestwebappever.dev.app/redis" ], "LxcConf": null, "NetworkMode": "", "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "8887" } ] }, "Privileged": false, "PublishAllPorts": false, "RestartPolicy": { "MaximumRetryCount": 0, "Name": "" }, "SecurityOpt": null, "VolumesFrom": [ "bestwebappever.dev.requirements-data" ] }, "HostnamePath": "/mnt/docker/containers/
44a87fdaf870281e86160e9e844b8987cfefd771448887675fed99460de491c4/hostname", "HostsPath": "/mnt/docker/containers/
44a87fdaf870281e86160e9e844b8987cfefd771448887675fed99460de491c4/hosts", "Id": "44a87fdaf870281e86160e9e844b8987cfefd771448887675fed99460de491c4", "Image": "b84804fac17b61fe8f344359285186f1a63cd8c0017930897a078cd09d61bb60", "MountLabel": "", "Name": "/bestwebappever.dev.app", "NetworkSettings": { "Bridge": "docker0", "Gateway": "172.17.42.1", "IPAddress": "172.17.0.179", "IPPrefixLen": 16, "MacAddress": "02:42:ac:11:00:b3", "PortMapping": null, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8887" } ] } }, "Path": "/sbin/my_init", "ProcessLabel": "", "ResolvConfPath": "
/mnt/docker/containers/44a87fdaf870281e86160e9e844b8987cfefd771448887675fed99460de491c4/resolv.conf", "State": { "Error": "", "ExitCode": 0, "FinishedAt": "0001-01-01T00:00:00Z", "OOMKilled": false, "Paused": false, "Pid": 21796, "Restarting": false, "Running": true, "StartedAt": "2015-01-03T23:56:47.537259546Z" }, "Volumes": { "/opt/bestwebappever": "/home/german/bestwebappever", "requirements_data": "
/mnt/docker/vfs/dir/bc14bec26ca311d5ed9f2a83eebef872a879c9e2f1d932470e0fd853fe8be336" }, "VolumesRW": { "/opt/bestwebappever": true, "requirements_data": true } } ] |
»ù±¾ÉÏÓë¾µÏñÏàͬ£¬²»¹ýÏÖÔÚ»¹Ö¸¶¨ÁËһЩ±©Â¶¸øËÞÖ÷µÄ¶Ë¿Ú£¬Ò²ÉùÃ÷Á˾íλÓÚËÞÖ÷µÄλÖã¬ÈÝÆ÷״̬ÊÇ´ÓÏÖÔÚÖ±µ½½áÊø£¬µÈµÈ¡£ÓëÇ°ÃæÒ»Ñù£¬Èç¹ûËü¿´ÆðÀ´ÈÃÈËÉú磬²»Òªµ£ÐÄ£¬Äã²»»áÖ±½Ó´¦ÀíÕâЩjson¡£
³¬¼¶¡¢Îޱȼòµ¥µÄ²½Öè˵Ã÷
µÚÒ»²½£¬°²×°Docker¡£
DockerÃüÁ¾ßÐèÒªrootȨÏÞ²ÅÄܹ¤×÷¡£Äã¿ÉÒÔ½«ÄãµÄÓû§·ÅÈëdocker×éÀ´±ÜÃâÿ´Î¶¼ÒªÊ¹ÓÃsudo¡£
µÚ¶þ²½£¬Ê¹ÓÃÒÔÏÂÃüÁî´Ó¹«¹²registryÏÂÔØÒ»¸ö¾µÏñ£º
$> docker pull ubuntu:latest ubuntu:latest: The image you are pulling has been verified 3b363fd9d7da: Pull complete .....<bunch of downloading-stuff output>..... 8eaa4ff06b53: Pull complete Status: Downloaded newer image for ubuntu:latest $> |
Õâ¸ö¹«¹²registryÉÏÓÐÄãÐèÒªµÄ¼¸ºõËùÓж«Î÷µÄ¾µÏñ£ºUbuntu¡¢Fedora¡¢Postgresql¡¢MySQL¡¢Jenkins¡¢Elasticsearch¡¢RedisµÈµÈ¡£Docker¿ª·¢ÈËÔ±ÔÚÕâ¸ö¹«¹²registryÀïά»¤×ÅÊý¸ö¾µÏñ£¬²»¹ýÄãÄÜ´ÓÉÏÃæÀÈ¡´óÁ¿À´×ÔÓû§·¢²¼µÄ×Ô½¨¾µÏñ¡£
Ò²ÐíÄãÐèÒª»òÏëÒªÒ»¸ö˽ÓеÄregistry£¨ÓÃÓÚ¿ª·¢Ó¦ÓÃÖ®ÀàµÄÈÝÆ÷£©£¬Äã¿ÉÒÔÏÈ¿´¿´Õâ¸ö¡£ÏÖÔÚ£¬Óкü¸¸ö·½Ê½¿ÉÒÔÉèÖÃÄã×Ô¼ºµÄ˽ÓÐregistry¡£ÄãÒ²¿ÉÒÔÂòÒ»¸ö¡£
µÚÈý²½£¬ÁгöÄãµÄ¾µÏñ£º
$> docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 8eaa4ff06b53 4 days ago 192.7 MB |
µÚËIJ½£¬´Ó¸Ã¾µÏñÉÏ´´½¨Ò»¸öÈÝÆ÷¡£
$> docker run --rm -ti ubuntu /bin/bash root@4638a40c2fbb:/# ls bin boot dev etc home lib lib64 media mnt opt proc root...... root@4638a40c2fbb:/# exit |
ÉÏÒ»ÌõÃüÁîµÄ¼òҪ˵Ã÷£º
--rm£º¸æËßDockerÒ»µ©ÔËÐеĽø³ÌÍ˳ö¾Íɾ³ýÈÝÆ÷¡£ÕâÔÚ½øÐвâÊÔʱ·Ç³£ÓÐÓ㬿ÉÃâ³ýÔÓÂÒ
-ti£º¸æËßDocker·ÖÅäÒ»¸öαÖն˲¢½øÈë½»»¥Ä£Ê½¡£Õ⽫½øÈëµ½ÈÝÆ÷ÄÚ£¬¶ÔÓÚ¿ìËÙÔÐÍ¿ª·¢»ò³¢ÊÔºÜÓÐÓ㬵«²»ÒªÔÚÉú²úÈÝÆ÷Öдò¿ªÕâЩ±êÖ¾
ubuntu£ºÕâÊÇÈÝÆ÷Á¢×ãµÄ¾µÏñ
/bin/bash£ºÒªÔËÐеÄÃüÁÒòΪÎÒÃÇÒÔ½»»¥Ä£Ê½Æô¶¯£¬Ëü½«ÏÔʾһ¸öÈÝÆ÷µÄÌáʾ·û
ÔÚÔËÐÐrunÃüÁîʱ£¬Äã¿ÉÖ¸¶¨Á´½Ó¡¢¾í¡¢¶Ë¿Ú¡¢´°¿ÚÃû³Æ£¨Èç¹ûÄãûÌṩ£¬Docker½«·ÖÅäÒ»¸öĬÈÏÃû³Æ£©µÈµÈ¡£
ÏÖÔÚ£¬ÎÒÃÇÔÚºǫ́ÔËÐÐÒ»¸öÈÝÆ÷£º
$> docker run -d ubuntu ping 8.8.8.8 31c68e9c09a0d632caae40debe13da3d6e612364198e2ef21f842762df4f987f $> |
Êä³öµÄÊÇ·ÖÅäµÄID£¬ÒòΪÊÇËæ»úµÄ£¬ÄãµÄ½«ÓÐËù²»Í¬¡£ÎÒÃÇÀ´¼ì²éÒ»ÏÂÈÝÆ÷ÊÇ·ñÆðÀ´ÁË£º
$> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 31c68e9c09a0 ubuntu:latest "ping 8.8.8.8" 2 minutes ago Up 2 minutes loving_mcclintock |
¾ÍÔÚÄÇ£¬Ëü±»×Ô¶¯·ÖÅäÁËÒ»¸ö½Ðloving_mcclintockµÄÃû³Æ¡£ÎÒÃÇ¿´¿´ÈÝÆ÷ÀïÕýÔÚ·¢Éúʲô£º
$> docker exec -ti loving_mcclintock /bin/bash root@31c68e9c09a0:/# ps -aux|grep ping root 1 0.0 0.0 6504 636 ? Ss 20:46 0:00 ping 8.8.8.8 root@31c68e9c09a0:/# exit |
ÎÒÃÇËù×öµÄÊÇÔÚÈÝÆ÷ÀïÔËÐгÌÐò£¬ÕâÀïµÄ³ÌÐòÊÇ/bin/bash¡£-ti±êÖ¾Óëdocker runµÄ×÷ÓÃÏàͬ£¬½«ÎÒÃÇ·ÅÖõ½ÈÝÆ÷µÄ¿ØÖÆÌ¨Àï¡£
½áβ
²î²»¶à¾ÍÊÇÕâÑùÁË¡£ÓÐÌ«¶àµÄ¶«Î÷¿ÉÒÔ½²£¬µ«Ädz¬³öÁ˱¾Îĵķ¶Î§¡£
DockerµÄ»ù±¾½á¹¹£º
https://docs.docker.com/introd ... cker/ http://blog.docker.com/2014/03 ... iner/ |
ÓëDockerÏà¹ØµÄÏîÄ¿£º
1.Phusion Docker baseimage
2.Shipyard
3.DockerUI
4.CoreOS
5.Decking
6.Docker-py
7.Docker-map
8.Docker-fabric
|