´î½¨¿ª·¢»·¾³Ò»Ö±ÈóÌÐòÔ±ÃÇÍ·ÌÛ£¬±¾ÎÄʹÓÃGit×ÓÄ£¿éºÍDocker
ComposeʵÏÖ¸ßЧÂʵĿª·¢¹¤×÷Á÷£¬ÈóÌÐòÔ±Äܹ»ÇáËɴ³ö¿ª·¢»·¾³£¬°Ñ¾«Á¦Í¶Èëµ½ÐèÒª¿ª·¢µÄÓ¦Óñ¾Éí¡£
ÎÊÌâ
×ÔÎÒÃÇ´ÓContinuous Software¹ÍÓ¶Á˵ÚһλԶ³Ì¿ª·¢µÄ³ÌÐòÔ±ÒÔÀ´£¬ÎÒÃǾÍÒâʶµ½¾«¼ò¿ª·¢¹¤×÷Á÷µÄÖØÒªÐÔ¡£µ±ÐÂÈëÖ°µÄ³ÌÐòÔ±½ÓÊÖÓɺܶàÓ¦ÓÃ×é³ÉµÄ¸´ÔÓÏîĿʱ£¬ÎÒÃÇÏ뾡Á¿±ÜÃâÒÔÏÂÕ⼸¸öÎÊÌ⣺
1.ȱÉÙstackÄ£¿é£ºNode.js¡¢PHP¡¢PostgreSQLµÈ
2.²»Çå³þÏîÄ¿×é¼þ/Ó¦ÓõÄ×ÜÌå¸Å¿ö
3.±¾µØÅäÖóåÍ»£º¼àÌý¶Ë¿Ú¡¢Êý¾Ý¿âÅäÖõÈ
´ËÍ⣬¾ÍÎÒ¸öÈ˾Ñé¶øÑÔ£¬ÎÒÃÇÕâÑùµÄ³ÌÐòԱ̫ÈÝÒ×ÕÒ²»×ű±ÁË¡£Ôø¾£¬ÎÒÈëÖ°Ò»¸ö¹«Ë¾µÄµÚÒ»ÕûÌì¶¼»¨Ôڴ¿ª·¢»·¾³ÉÏ£¬ÊÔͼȥÀí½âËùÓеĶ«Î÷Ôõô²ÅÄÜÒ»Æð¹¤×÷£¬¶øÎÞ·¨Ö±½Ó¾ÍÈ¥Àí½â¹«Ë¾¿ª·¢µÄÓ¦Óõ½µ×ÊÇÔõô¹¤×÷µÄ¡£
·½°¸
ÔÚ¾ßÌå½éÉÜÈçºÎ½â¾öÉÏÊöÎÊÌâ֮ǰ£¬ÎÒÏȽéÉÜÏÂÎÒÃÇÏîĿʹÓõĿª·¢¹¤×÷Á÷¡£
ÎÒÃǵÄÿ¸öÏîÄ¿¶¼ÔÚBitbucketÉÏÓÐ×Ô¼ºµÄTeam£¨ºÍGitHubÉϵÄOrganization¶ÔÓ¦£©¡£Ã¿¸öÓ¦Óö¼»áÔÚTeamÏ´´½¨Ò»¸öRepository£¨±ÈÈ磬api¡¢dashboard¡¢cpanel£©¡£ÔÚÕâЩ×ÓÄ£¿éÖ®ÉÏ£¬´´½¨ÁËÒ»¸öÃûΪdevelopmentµÄRepository¡£×ÓÄ£¿éµÄͬһ²ã¼¶ÓÐREADME.mdºÍdocker-compose.ymlÁ½¸öÎļþ¡£
kytwb@continuous:~/path/to/<project>/$ ls -la total 40 drwxrwxr-x 11 kytwb amine 4096 Mar 14 16:30 . drwxr-xr-x 4 kytwb amine 4096 Nov 1 20:17 .. drwxr-xr-x 20 kytwb amine 4096 Mar 11 14:24 api drwxr-xr-x 11 kytwb amine 4096 Mar 3 13:21 cpanel drwxr-xr-x 10 kytwb amine 4096 Mar 12 11:37 dashboard -rw-r--r-- 1 kytwb amine 2302 Mar 2 15:28 docker-compose.yml drwxrwxr-x 9 kytwb amine 4096 Mar 14 16:30 .git -rw-r--r-- 1 kytwb amine 648 Dec 22 17:20 .gitmodules -rw-r--r-- 1 kytwb amine 1706 Dec 17 16:41 README.md |
µ±Ð³ÌÐòÔ±¼ÓÈëÏîĿʱ£¬Ö»ÐèÔÚBitbucketÉÏä¯ÀÀdevelopmentrepository£¬¸ù¾ÝREADME.mdµÄ²½Öè¾Í¿ÉÒÔ¿ìËٴ»·¾³¡£¾ßÌå²½ÖèÈçÏÂËùʾ£º
$ git -v $ docker -v $ docker-compose -v $ git clone git@bitbucket.com:<project>/development.git <project> && cd <project> $ git submodule init && git submodule update $ git submodule foreach npm install $ docker-compose up -d |
ÖÁ´Ë£¬Ò»ÇоͶ¼ÒѾ´î½¨ºÃ£¬²¢ÔËÐÐÔÚ±¾µØ»úÆ÷ÉÏÁË¡£
ʵÏÖÔÀí
±¾Õ½éÉÜÎÒÃÇÊÇÈçºÎʵÏÖÉÏÊö¹¤×÷Á÷µÄ¡£
ǰÌáÌõ¼þ
$ git -v $ docker -v $ docker-compose |
ÓÉÓÚÎÒÃǵĿª·¢¶ÑÕ»ÍêÈ«»ùÓÚDocker£¬ËùÒÔ£¬³ÌÐòÔ±ÐèÒªÏȰ²×°Docker¡£ÕâʱËûÃDz»ÐèÒªÌØ±ðÊìϤDocker£¬Ö»ÐèÒªÔÚ¿ª·¢Ê±Ê¹ÓÃDocker¼´¿É£¬ÎÒÃǼä½ÓµØ½«ËûÃÇÒýÈëµ½ÁËÈÝÆ÷µÄÊÀ½ç£¬Ö®ºó»áÒÔ´ËΪÇÅÁºÏòËûÃǽâÊÍÈçºÎʹÓÃDockerʵÏÖ³ÖÐø¼¯³É¡¢³ÖÐø½»¸¶µÈµÈ¡£README.mdÖв¢Ã»ÓÐÏêϸ½éÉÜÈçºÎ°²×°Docker£¬ÒòΪ°²×°ºÜ¼òµ¥¡£
µ±docker-compose»¹½ÐFigµÄʱºòÎÒÃǾÍÒѾÓÃËüÀ´±àÅÅ¿ª·¢¶ÑÕ»ÀïµÄÈÝÆ÷¡£Ö®ºóDockerÊÕ¹ºÁËFig£¬ÖØÃüÃûΪDocker
Compose¡£ÓÐÈËÌáÒ齫Docker ComposeºÏ²¢µ½Docker´úÂëÀµ«ÊÇ»ùÓںܶàÔÒò×îÖÕ²¢Ã»ÓÐÕâô×ö£¬ËùÒÔDocker
ComposeÈÔÈ»ÐèÒªµ¥¶À°²×°¡£
ͬÑùµØ£¬±¾ÎÄûÓÐÏêϸ½éÉÜDocker ComposeµÄ°²×°£¬ÒòΪºÜ¼òµ¥¡£
´î½¨²Ö¿â£¨Repository£©
ÈçǰËùÊö£¬ÐèÒª´´½¨Ò»¸ö¿ª·¢²Ö¿â£¬ÒÔ¼°ÎªÃ¿¸öÓ¦Óô´½¨¶ÔÓ¦µÄ²Ö¿â¡£ÕâÀïÎÒÃÇ´´½¨ÁËapi¡¢dashboardºÍcpanel¡£µ±´´½¨ÕâЩ²Ö¿âµÄʱºò£¬ÖØµã¹Ø×¢development²Ö¿âµÄ´î½¨¡£
$ git clone git@bitbucket.com:<project>/development.git <project> && cd <project> |
ÏÖÔÚ½«Ó¦ÓóÌÐòµÄ²Ö¿âÌí¼ÓΪdevelopment²Ö¿âµÄ×ÓÄ£¿é£¬Ö»ÐèÒª¼üÈëÈçÏÂÃüÁ
$ git submodule add git@bitbucket.org:<project>/api.git $ git submodule add git@bitbucket.org:<project>/dashboard.git $ git submodule add git@bitbucket.org:<project>/cpanel.git |
ÕâÑù£¬ÄãµÄdevelopment²Ö¿â¸ùĿ¼Ï»ᴴ½¨³ö.gitmodulesÎļþ¡£³ÌÐòÔ±Ò²¾Í¿ÉÒÔÔÚ¿Ë¡developmentrepositoryµÄʱºòÒ»´ÎµÃµ½ËùÓеÄÓ¦ÓóÌÐò²¢ÔËÐУº
$ git submodule init && git submodule update |
¸ü¶à×ÓÄ£¿éµÄÐÅÏ¢£¬Çë²Î¿¼Git¹Ù·½Îĵµ¡£
Docker»¯Ò»ÇÐ
ÏÖÔÚÎÒÃÇÒѾ´î½¨ºÃÁËdevelopment²Ö¿â£¬¿ÉÒÔͨ¹ýcdµÄ·½Ê½·ÃÎÊËùÓв»Í¬µÄÓ¦ÓóÌÐò¡£½ÓÏÂÀ´ÎÒÃÇÒªÓÃ֮ǰÌáµ½µÄ±àÅŹ¤¾ß£ºDocker
ComposeÀ´ÈÝÆ÷»¯ËùÓеÄÓ¦Óü°ÆäÅäÖá£
Ê×ÏÈ´ÓapiÓ¦ÓóÌÐò¿ªÊ¼¡£´ò¿ªdocker-compose.yml£¬ÎªAPIÉùÃ÷Ò»¸öÈÝÆ÷£¬²¢ÎªÕâ¸öÈÝÆ÷Ñ¡Ôñ»ù´¡¾µÏñ¡£±¾Ê¾ÀýÖеĴúÂë»ùÓÚNode.js£¬Òò´ËÑ¡Ôñ¹Ù·½Node.js¾µÏñ£º
api: image: dockerfile/nodejs |
Õâʱ£¬ÔËÐÐÃüÁîdocker-compose up -d»á´´½¨³öÒ»¸öÃûΪ<project>_api_1µÄÈÝÆ÷£¬Õâ¸öÈÝÆ÷ʲôҲ²»×ö£¨Æô¶¯ºóÁ¢¼´Í˳ö£©¡£ÔËÐÐÃüÁîdocker-compose
ps¿ÉÒԵõ½ÓÉdocker-compose.yml±àÅŵÄËùÓÐÈÝÆ÷µÄÐÅÏ¢¡£
½ÓÏÂÀ´ÅäÖÃapiÈÝÆ÷£¬Ê¹Æä¶àһЩ¹¦ÄÜ¡£ÎªÁËʵÏÖÕâ¸öÄ¿µÄ£¬ÎÒÃÇÐèÒª£º
1.½«Ô´´úÂë¹ÒÔØµ½ÈÝÆ÷ÖÐ
2.ÉùÃ÷ÓÃʲôÃüÁîÔËÐÐÓ¦ÓÃ
4.±©Â¶ºÏÊʵĶ˿ÚÒÔ¹©·ÃÎÊÓ¦ÓÃ
ÕâÑùÅäÖÃÎļþÀàËÆ£º
api: image: dockerfile/nodejs volumes: - ./api/:/app/ working_dir: /app/ command: npm start ports: - "8000:8000" |
ÏÖÔÚÔÙÔËÐÐdocker-compose up -d£¬¾ÍÆô¶¯ÁËapiÓ¦Ó㬿ÉÒÔÔÚhttp://localhost:8000·ÃÎÊËü¡£Õâ¸ö³ÌÐò¿ÉÄÜ»á±ÀÀ££¬¿ÉÒÔʹÓÃdocker-compose
logs api¼ì²éÈÝÆ÷ÈÕÖ¾¡£
ÕâÀÎÒ»³ÒÉapiµÄ±ÀÀ£ÊÇÒòΪËüÁ¬²»ÉÏÊý¾Ý¿â¡£Òò´ËÐèÒªÌí¼ÓdatabaseÈÝÆ÷£¬²¢ÈÃapiÈÝÆ÷Äܹ»Ê¹ÓÃËü¡£
api: image: dockerfile/nodejs volumes: - ./api/:/app/ working_dir: /app/ command: npm start ports: - "8000:8000" links: - database database: image: postgresql ports: - "5432:5432" |
ͨ¹ý´´½¨databaseÈÝÆ÷£¬²¢½«ÆäÁ¬½Óµ½apiÈÝÆ÷£¬ÎÒÃǾͿÉÒÔÔÚapiÈÝÆ÷ÀïÕÒµ½database¡£ÒªÏëչʾAPIµÄ»·¾³£¨±ÈÈ磬console.log(process.env)£©£¬±ØÐëʹÓÃÈçϱäÁ¿£¬±ÈÈçPOSTGRES_1_PORT_5432_TCP_ADDRºÍPOSTGRES_1_PORT_5432_TCP_PORT¡£ÕâÊÇÎÒÃÇÔÚAPIµÄÅäÖÃÎļþÀïʹÓõĹØÁªµ½Êý¾Ý¿âµÄ±äÁ¿¡£
ͨ¹ýlinkÖ¸ÁÕâ¸öÊý¾Ý¿âÈÝÆ÷±»ÈÏΪÊÇAPIÈÝÆ÷µÄÒÀÀµÌõ¼þ¡£ÕâÒâζ×ÅDocker
ComposeÔÚÆô¶¯APIÈÝÆ÷֮ǰһ¶¨»áÏÈÆô¶¯Êý¾Ý¿âÈÝÆ÷¡£
ÏÖÔÚÎÒÃÇÓÃͬÑùµÄ·½Ê½ÃèÊöÆäËüÓ¦ÓóÌÐò¡£ÕâÀÎÒÃÇ¿ÉÒÔͨ¹ý»·¾³±äÁ¿API_1_PORT_8000_TCP_ADDRºÍAPI_1_PORT_8000_TCP_PORT£¬½«apiÁ¬½Óµ½dashboardºÍcpanelÓ¦Óá£
- ./api/:/app/ working_dir: /app/ command: npm start ports: - "8000:8000" links: - database database: image: postgresql dashboard: image: dockerfile/nodejs volumes: - ./dashboard/:/app/ working_dir: /app/ command: npm start ports: - "8001:8001" links: - api cpanel: image: dockerfile/nodejs volumes: - ./api/:/app/ working_dir: /app/ command: npm start ports: - "8002:8002" links: - api |
¾ÍÏñ֮ǰΪÊý¾Ý¿âÐÞ¸ÄAPIÅäÖÃÎļþÒ»Ñù£¬¿ÉÒÔΪdashboardºÍcpanelÓ¦ÓÃʹÓÃÀàËÆµÄ»·¾³±äÁ¿£¬´Ó¶ø±ÜÃâÓ²±àÂë¡£
ÏÖÔÚ¿ÉÒÔÔÙ´ÎÔËÐÐdocker-compose up -dÃüÁîºÍdocker-compose psÃüÁ
kytwb@continuous:~/path/to/<project>$ docker-compose up -d Recreating <project>_database_1... Recreating <project>_api_1... Creating <project>_dashboard_1... Creating <project>_cpanel_1... kytwb@continuous:~/path/to/<project>$ docker-compose ps Name Command State Ports ---------------------------------------------- <project>_api_1 npm start Up 0.0.0.0:8000->8000/tcp <project>_dashboard_1 npm start Up 0.0.0.0:8001->8001/tcp <project>_cpanel_1 npm start Up 0.0.0.0:8002->8002/tcp <project>_database_1 /usr/local/bin/run Up 0.0.0.0:5432->5432/tcp |
Ó¦ÓÃÓ¦¸Ã¾ÍÒѾÆô¶¯²¢ÔËÐÐÁË¡£
´Óhttp://localhsot:8000¿ÉÒÔ·ÃÎÊapi¡£
´Óhttp://localhsot:8001¿ÉÒÔ·ÃÎÊdashboard¡£
´Óhttp://localhsot:8002¿ÉÒÔ·ÃÎÊcpanel¡£
¸ü½øÒ»²½
±¾µØÂ·ÓÉ
ÔÚʹÓÃdocker-compose up -dÔËÐÐËùÓÐÈÝÆ÷Ö®ºó£¬¿ÉÒÔͨ¹ýhttp://localhost:<application_port>·ÃÎÊÎÒÃǵÄÓ¦Ó᣻ùÓÚµ±Ç°ÅäÖã¬ÎÒÃÇ¿ÉÒÔºÜÈÝÒ×µØÊ¹ÓÃjwilder/nginx-proxy¼ÓÉϱ¾µØÂ·Óɹ¦ÄÜ£¬ÕâÑù¾Í¿ÉÒÔʹÓúÍÉú²ú»·¾³ÀàËÆµÄURL·ÃÎʱ¾µØÓ¦ÓÃÁË¡£±ÈÈ磬ͨ¹ýhttp://api.domain.local·ÃÎÊhttp://api.domain.comµÄ±¾µØ°æ±¾¡£
jwilder/nginx-proxy¾µÏñ½«Ò»ÇбäµÃºÜ¼òµ¥¡£Ö»ÐèÒªÔÚdocker-compose.ymlÀï¼ÓÉÏÃèÊöÈ¥´´½¨Ò»¸öÃûΪnginxµÄÐÂÈÝÆ÷¡£¸ù¾Ýjwilder/nginx-proxyµÄREADMEÎļþ£¨¹ÒÔØDockerÊØ»¤½ø³Ìsocket£¬±©Â¶80¶Ë¿Ú£©ÅäÖøÃÈÝÆ÷¾Í¿ÉÒÔÁË¡£Ö®ºó£¬ÔÚÏÖÓÐÈÝÆ÷ÀïÔÙÌí¼Ó¶îÍâµÄ»·¾³±äÁ¿VIRTUAL_HOSTºÍVIRTUAL_PORT£¬ÈçÏ£º
api: image: dockerfile/nodejs volumes: - ./api/:/app/ working_dir: /app/ command: npm start environment: - VIRTUAL_HOST=api.domain.local - VIRTUAL_PORT=8000 ports: - "8000:8000" links: - database database: image: postgresql dashboard: image: dockerfile/nodejs volumes: - ./dashboard/:/app/ working_dir: /app/ command: npm start environment: - VIRTUAL_HOST=dashboard.domain.local - VIRTUAL_PORT=8001 ports: - "8001:8001" links: - api cpanel: image: dockerfile/nodejs volumes: - ./api/:/app/ working_dir: /app/ command: npm start environment: - VIRTUAL_HOST=cpanel.domain.local - VIRTUAL_PORT=8002 ports: - "8002:8002" links: - api nginx: image: jwilder/nginx-proxy volumes: - /var/run/docker.sock:/tmp/docker.sock ports: - "80:80" |
nginxÈÝÆ÷»á¼ì²éËùÓÐÔËÐÐÔÚDockerÊØ»¤½ø³ÌÖ®ÉÏ£¨Í¨¹ý¹ÒÔØµÄdocker.sockÎļþ£©µÄÈÝÆ÷£¬ÎªÃ¿¸öÈÝÆ÷´´½¨ºÏÊʵÄnginxÅäÖÃÎļþ£¬²¢ÉèÖÃVIRTUAL_HOST»·¾³±äÁ¿¡£
ÒªÏëÍê³É±¾µØÂ·ÓɵĴ£¬»¹ÐèÒªÔÚetc/hostsÀïÌí¼ÓËùÓеÄVIRTUAL_HOST¡£ÎÒÊÇÊÖ¶¯ÓÃnode.jsµÄhostile°üÀ´Íê³ÉÕâ¸ö¹¤×÷µÄ£¬²»¹ýÎÒ²ÂÓ¦¸Ã¿ÉÒÔ×Ô¶¯»¯ÊµÏÖ£¬¾ÍÏñjwilder/nginx-proxy¿ÉÒÔ¸ù¾ÝnginxÅäÖÃÎļþ¶¯Ì¬±ä»¯Ò»Ñù¡£ÕâÀïÐèÒªÔÙÑо¿Ò»Ï¡£
ÏÖÔÚ¿ÉÒÔÔÙ´ÎÔËÐÐdocker-compose up -d£¬È»ºóʹÓúÍÉú²ú»·¾³Ò»ÑùµÄurl·ÃÎÊÓ¦ÓóÌÐò£¬Ö»ÐèÓÃ.localTLD´úÌæ.comTLD¡£
|