±¾ÎÄÖ÷Òª½²ÊöÈçºÎΪNode.jsÓ¦Óô³ÖÐø¼¯³É»·¾³¡£°üÀ¨ÈçºÎÔÚ¿ª·¢»úÆ÷ÉÏDocker»¯Ò»¸öNode.jsÓ¦Óã¬ÈçºÎ²¿ÊðJenkinsºÍ
Docker registryÒÔʵÏÖ³ÖÐø¼¯³É¡£ÍƼö¶ÔʹÓÃDocker×öCI·½ÃæµÄ¹¤×÷¸ÐÐËȤµÄͬѧÔĶÁ£¬CIÒ²ÊÇDockerµÄÓ¦Óó¡¾°Ö®Ò»£¬±¾ÎÄÊǺܺõĽ̡̳£
ÄãÊ×ÏÈÐèÒªÔÚÄãµÄLinux»úÆ÷Éϰ²×°DockerºÍFig¡£±¾ÎÄÖ÷Òª»á½éÉÜÈçºÎʹÓÃDockerºÍMesosʵÏÖ³ÖÐø¼¯³É¡£
²âÊÔ¡¢´î½¨Éú²ú»·¾³¿ÉÓõÄMesos¼¯ÈºÒÔ¼°ÆäËüµÄ¸´ÔÓ¹¤×÷²»ÔÚ±¾ÎÄÌÖÂÛ·¶Î§Ö®ÄÚ£¬ÎÒ»áÔÚºóÐøÎÄÕÂÖÐÏêϸ½éÉÜ¡£½ÓÏÂÀ´£¬ÎÒÃǽ«ÔÚ¸ü¶àµÄÔÆÆ½Ì¨ÉÏÖ§³Ö¸Ã½â¾ö·½°¸£¬±ÈÈçGCE¡¢AWS£¬²¢Öð½¥¼¯³É¸ü¶àµÄµÚÈý·½×é¼þ£¬±ÈÈç
Flocker¡¢ WeaveºÍ Consul¡£
±¾ÎÄËùÓеĴúÂë¶¼¿ÉÒÔÔÚ GitHubÉÏÕÒµ½¡£
Õû¸ö½â¾ö·½°¸ÖУ¬ÎÒÃÇʹÓõ½ÈçϹ¤¾ß£º
Node.jsÀïµÄHelloWorldÏîÄ¿
Git
Jenkins
Docker
Docker Registry
Fig
Mesos
Mesosphere Marathon
Zookeeper
¿ª·¢»·¾³
ÈÃÎÒÃÇÏÈ´ÓÒ»¸ö¼òµ¥µÄHelloWorldÏÈÓÿªÊ¼°É£¬ËüʹÓÃNode.js±àд£¬²¢ÇÒÔËÐÐÔÚDockerÈÝÆ÷ÖС£
´ÓÏÂͼÖУ¬Äã¿ÉÒÔ¿´µ½¿ª·¢ÈËÔ±ÔÚ±¾µØ»·¾³ÖÐʹÓÃÈÝÆ÷ÔËÐй¹½¨¡¢²âÊÔÒÔ¼°ÆäËüÁ÷³Ì£¬ÈçÏÂͼµÀ¶É«·½¿éËùʾ¡£Ò»µ©²âÊÔͨ¹ý£¬ËûÃǽ«»á°Ñ´úÂëÌá½»µ½ÖÐÑëGit²Ö¿â£¬½ÓÏÂÀ´»á·¢²¼µ½Éú²ú»·¾³¡£

ÎÒ¼Ù¶¨ÔĶÁÕâÆªÎÄÕµĶÁÕß¶¼ÄÜÀí½â²¢ÇÒ×Ô¼ºÊµÏÖÕâÒ»²½¡£
Ê×ÏÈÊÇNode.jsÓ¦ÓÃapp.js:
// Load the http module to create an http server. var http = require('http'); // Configure our HTTP server to respond with Hello World to all requests. var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello World\n"); }); // Listen on port 8000, IP defaults to "0.0.0.0" server.listen(8000); // Put a friendly message on the terminal console.log("Server running at http://127.0.0.1:8000/"); |
¶ÔÓ¦µÄÅäÖÃÎļþpackage.json:
{ "name": "hello-world", "description": "hello world", "version": "0.0.1", "private": true, "dependencies": { "express": "3.x" }, "scripts": {"start": "node app.js"} } |
ÉÏÃæÁ½²½Íê³ÉÖ®ºó£¬¿ÉÒÔʹÓà GoogleµÄNode.js¾µÏñÀ´Docker»¯¸ÃÓ¦Ó㬲¢ÇÒÌí¼ÓÈçÏÂDockerfile£º
FROM google/nodejs WORKDIR /app ADD package.json /app/ RUN npm install ADD . /app EXPOSE 8000 CMD [] ENTRYPOINT ["/nodejs/bin/npm", "start"] |
¿ª·¢»·¾³×¼±¸ºÃÁË¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔ¹¹½¨ÈÝÆ÷£¬²¢È·ÈϾµÏñÊÇ·ñ¿ÉÒÔÕý³£ÔËÐС£
$ docker build -t my_nodejs_image . $ docker run -p 8000:8000 my_nodejs_image |
ÏÖÔÚ¿ÉÒÔ·ÃÎÊhttp://127.0.0.1:8000/£¬¿´¿´ÊÇ·ñ¿ÉÒÔ¿´µ½¡°Hello World¡±!
Äã¿ÉÒÔÐÞ¸Äapp.jsÒÔÈÃËüÏÔʾÆäËüµÄ×Ö·û´®¡£Ö»ÐèÒªÖØÐ¹¹½¨¾µÏñ£¬È»ºóÆô¶¯Ò»¸öеÄÈÝÆ÷£¬Ë¢ÐÂä¯ÀÀÆ÷£¬¾ÍÄܹ»¿´µ½Õâ¸öеÄ×Ö·û´®¡£

ÕâÀïµÄÅäÖÃûÓÐÈκβâÊÔ¡£²¢²»ÊÇÒòΪ¾õµÃ²»ÐèÒª£¬¶øÊÇΪÁ˼ò»¯ÅäÖ㬽«×¢ÒâÁ¦·ÅÔÚDockerºÍMesos/MarathonÉÏ¡£ÓÅÐãµÄ³ÌÐòÔ±¶¼Ó¦¸ÃÖªµÀûÓвâÊԵϰ£¬¿ª·¢ÏîÄ¿¾Í²»ÄÜÖ±½ÓÉÏÉú²ú»·¾³¡£
ÏÖÔÚ½øÈëÏÂÒ»²½¡£
³ÖÐø¼¯³É/½»¸¶

ÎÒÃÇÐèÒªÓÐÒ»¸ö°æ±¾¿ØÖÆÏµÍ³ºÍ¹¹½¨·þÎñÆ÷£¬ÒÔÔÚ´úÂëÌá½»ºóÔËÐй¹½¨ºÍ²âÊÔ¡£Îª´Ë£¬ÎÒÃÇʹÓÃÁËJenkins£¬²¢½«¹¹½¨½á¹û£¨artefact£©·¢²¼µ½²Ö
¿â¡£ÒòΪÎÒÃÇʹÓÃDocker²¿Êð£¬Ëù×îÖÕµÄartefact¾ÍÊÇÒ»¸öDocker¾µÏñ£¬pushÒ²ÊÇpushµ½±¾µØDocker
RegistryÉÏ¡£
ΪÁ˼ò»¯¸´ÔÓ¶È£¬ÎÒ²¢Ã»ÓÐʹÓÃGit²Ö¿â¹ÜÀí¹¤¾ß£¬±ÈÈçGitLab»òÕßGitHub¡£½«JenkinsÁ¬½Óµ½Git·þÎñÆ÷ºÜ¼òµ¥£¬ÕâÀï²»ÔÙ׸Êö¡£Èç¹ûÏëÒªÔÚDockerÉϲ¿ÊðGit·þÎñÆ÷£¬¿ÉÒÔʹÓÃÕâ¸ö
¾µÏñ¡£
ÏÖÔÚ£¬ÈÃÎÒÃÇ¿ªÊ¼±àдfig.yml°É¡£FigÊÇÒ»¸ö±àÅŹ¤¾ß£¬ÎÒÃÇʹÓÃÒ»¸öÃüÁî¾Í¿ÉÒÔ½«ËùÓÐÖÐÐÄ»¯µÄ·þÎñ²¿ÊðºÃ¡£
FigÖ»ÊǸö¿ª·¢¹¤¾ß£¬Èç¹ûÏëÒªÔÚÉú²ú»·¾³Ê¹Óã¬ÐèÒªÓøü¸´ÔÓµÄ×Ô¶¯»¯¹¤¾ßÌæ´úËü¡£
¼¸Ìì֮ǰ£¬Docker·¢²¼ÁËDocker ComposeµÄµÚÒ»¸ö°æ±¾£¬Ëü¿ÉÒÔ´úÌæFig¡£ÎÒ»¹Ã»ÓвâÊÔËü£¬²»¹ýÓ¦¸Ã²»ÐèҪʲô¸Ä±ä£¬Docker
Compose¾Í¿ÉÒÔ´úÌæFigÁË¡£
ÈçÏÂÊǴ±¾µØDocker RegistryµÄfig.yml£º
registry: image: registry environment: - STORAGE_PATH=/registry volumes: - registry-stuff:/registry ports: - "5000:5000" |
ÕâÀïʹÓõÄÊDZê×¼µÄDocker Registry¾µÏñ£¬²¢ÇÒ½«ÈÝÆ÷ÍâµÄÒ»¸ö³Ö¾Ã´æ´¢µÄ¾í¹ÒÔØµ½ÉÏÃæ£¬ÒòΪÎÒÃÇÐèÒªÖØÆôÈÝÆ÷ºó»¹Äܱ£Áô¹¹½¨³öµÄ¾µÏñ¡£
½ÓÏÂÀ´ÔËÐУº
Docker RegistryÔËÐÐÔÚhttp://localhost:5000¡£
ÏÂÒ»²½Êǹ¹½¨¾µÏñ²¢½«Æäpushµ½RegistryÉÏ¡£
# Build an image $ docker build -t localhost:5000/containersol/nodejs_app # Push it to the registry $ docker push localhost:5000/containersol/nodejs_app |
ÕâʱDocker Daemon»á±¨ÈçÏ´íÎó£º
Forbidden. If this private registry supports only HTTP or HTTPS with an unknown CA certificate,
please add ¨Cinsecure-registry 10.0.0.26:5000 to the daemon¡¯s arguments. |
½â¾öÕâ¸öÎÊÌâµÄ·½·¨¼û StackOverflow
×î¿ì×î¼òµ¥µÄ·½·¨Êǽ«ÈçÏÂÐÐÌí¼Óµ½/etc/default/docker£¬È»ºóÖØÆôDocker
Daemon£º
DOCKER_OPTS="--insecure-registry localhost:5000" |
½â¾öÎÊÌâÖ®ºó£¬½«¾µÏñpushµ½repoÉÏ£¬²¢·ÃÎʸà URL£¬¼ì²é¾µÏñÊÇ·ñÒѾ±»³É¹¦push¡£

½ÓÏÂÀ´Ìí¼ÓJenkinsµÄÅäÖõ½fig.ymlÎļþÀï£¬ÖØÆôϵͳ£º
jenkins: image: containersol/jenkins_with_docker volumes: - jenkins-stuff:/var/jenkins_home - .:/var/jenkins_data - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker ports: - "8081:8080" registry: image: registry environment: - STORAGE_PATH=/registry volumes: - registry-stuff:/registry ports: - "5000:5000" |
ÕâÀïÏêϸ½âÊÍÏÂJenkinsÅäÖá£Ê×ÏÈ£¬ÎÒÃÇÔÚJenkinsÈÝÆ÷Àï¹ÒÔØÁËDocker¶þ½øÖÆÎļþ£¨ÒëÕß×¢£ºÈçÉϵÄ/usr/bin/docker£©ºÍ
docker daemonʹÓõÄsocket¡£ÕâÊÇÒòΪÐèÒª´ÓÈÝÆ÷ÀïÔÊÐíJenkinsÔÚÖ÷»úÉÏÔËÐÐDockerÃüÁî¡£ÎÊÌâÊÇ£¬Ö»ÓÐDocker×éÀïµÄÓû§²ÅÓÐȨÕâô
×ö£¬¶øJenkinsÈÝÆ÷ÊÇJenkinsÓû§£¬¶ø²»ÊÇrootÓû§¡£Òò´Ë£¬ÎÒÃÇʹÓÃÈçÏÂDockerfile¹¹½¨ÎÒÃÇ×Ô¼ºµÄJenkins¾µÏñ£º
FROM jenkins MAINTAINER ContainerSolutions USER root #TODO the group ID for docker group on my Ubuntu is 125,
therefore I can only run docker commands if I have same group id inside. # Otherwise the socket file is not accessible. RUN groupadd -g 125 docker && usermod -a -G docker jenkins USER jenkins |
ÔÚDockerfileµÄÎļþ¼ÐÀïÔËÐÐÈçÏÂÃüÁî¹¹½¨¾µÏñ£º
$ docker build -t containersol/jenkins_with_docker . |
Õâ²¢²»ÊǺÜÇÉÃîµÄ½â¾ö·½°¸£¬Èç¹ûÄãÓиüºÃµÄ·½·¨£¬Ò»¶¨ÔÚ±¾ÎĺóÁôÑÔ¸æËßÎÒ¡£
Fig»áΪJenkinsÈÝÆ÷´´½¨³Ö¾Ã»¯µÄ´æ´¢£¬²¢½«µ±Ç°Ä¿Â¼¹ÒÔØµ½ÈÝÆ÷Àï¡£ÕâÔÚÖ®ºóÔËÐÐbuild£¬push²¢ÇÒdeploy½Å±¾Ê±¾ÍÓÐÓÃÁË¡£
ÒªÏëÍê³ÉÎı¾½éÉܵijÖÐø¼¯³É£¬»¹ÐèÒªÌí¼ÓһЩ½Å±¾À´¹¹½¨ºÍpush Docker¾µÏñ£¬ÅäÖÃJenkinsÀ´ÔËÐÐËüÃÇ¡£
build.sh°üº¬¶îÍâµÄ¾µÏñ°æ±¾ÐÅÏ¢¡£Ã¿¸öJenkins build»áΪDocker¾µÏñ´´½¨ÐµıêÇ©¡£ÐèҪעÒ⣬ÎÒ²¢²»ÊÇ˵ÕâÊǰ汾»¯µÄÕýÈ··½Ê½¡£Õâ¸öÁìÓòºÜ¸´ÔÓ£¬¿ÉÄÜ»áÔÚÒÔºóרÃÅдÎÄÕÂÌÖÂÛ£¬µ«ÊÇÏÖÔÚ¾ÍÌø¹ý°É¡£
#!/bin/bash if [ -z "${1}" ]; then version="latest" else version="${1}" fi cd nodejs_app docker build -t localhost:5000/containersol/nodejs_app:${version} . cd .. |
×¢Òâ¹¹½¨³öµÄ¾µÏñµÄÃû×Ö¡£ËüÊ×ÏȰüº¬RegistryµÄURL£¬È»ºóÊǾµÏñÈ«Ãû£¬È»ºóÊDZêÇ©¡£
»¹ÐèҪעÒâµÄÊÇJenkinsÔÚÈÝÆ÷ÀïÔËÐУ¬»áʹÓýű¾¹¹½¨¾µÏñ£¬µ«ÊÇÔÚJenkinsÈÝÆ÷ÀïÖ´ÐеÄdockerÃüÁîʵ¼ÊÉÏ»áÔËÐÐÔÚÖ÷»úÉÏ£¬ÒòΪ֮ǰÎÒÃǹÒÔØÁËDockerËùʹÓõÄsocket¡£
push.sh»ápush֮ǰ²½Öè¹¹½¨³öµÄ¾µÏñ¡£Ê¹ÓúÍ֮ǰ½Å±¾Ò»ÑùµÄ°æ±¾¡£
#!/bin/bash if [ -z "${1}" ]; then version="latest" else version="${1}" fi docker push localhost:5000/containersol/nodejs_app:"${version}" |
×îºóÒ»²½ÊÇÓÃFigÖØÆôÕû¸öϵͳ£¬²¢ÇÒÅäÖÃJenkins jobÔËÐÐbuild.shºÍpush.sh¡£JenkinsÔÚURLhttp://localhost:8081ÉÏÔËÐС£
ÕâÊÇÒ»¸ö±ê×¼µÄ¹¹½¨job£¬Ö´ÐÐÁ½¸öshellÃüÁbuildµÄ°æ±¾ÊÇÆäÊäÈë²ÎÊý£º
./build.sh ${BUILD_ID} ./push.sh ${BUILD_ID} |

ÏÖÔÚÎÒÃÇ¿ÉÒÔÖ´Ðй¹½¨£¬¿ÉÒÔ¿´µ½ÐµľµÏñ²¿Êðµ½ÁËRegistryÀï¡£×¢ÒâURL°üº¬ÐµıêÇ©¡£

±¾ÎÄ×÷Ϊ¸ÃϵÁеĵÚһƪ£¬½²ÊöÁËÈçºÎÔÚ¿ª·¢»úÆ÷ÉÏDocker»¯Ò»¸öNode.jsÓ¦Ó㬲¢ÇÒÈçºÎΪÁËNode.jsÓ¦Óò¿ÊðJenkinsºÍDocker
Registry¡£
µÚ¶þ²¿·Ö»á½Ó׎éÉÜMesosºÍMarathonµÄ´î½¨£¬ÒÔ¼°ÈçºÎÍê³É³ÖÐø¼¯³É¹¤×÷Á÷¡£
|