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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
³ÖÐø½»¸¶ÏµÁУ¨Ò»£©£ºÊ¹ÓÃDocker¡¢MesosʵÏÖ³ÖÐø½»¸¶
 
À´Ô´£ºOPEN¾­Ñé¿â ·¢²¼ÓÚ 2015-5-14
  3141  次浏览      29
 

±¾ÎÄÖ÷Òª½²ÊöÈçºÎΪ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¾µÏñ£¬²¢ÇÒ½«ÈÝÆ÷ÍâµÄÒ»¸ö³Ö¾Ã´æ´¢µÄ¾í¹ÒÔØµ½ÉÏÃæ£¬ÒòΪÎÒÃÇÐèÒªÖØÆôÈÝÆ÷ºó»¹Äܱ£Áô¹¹½¨³öµÄ¾µÏñ¡£

½ÓÏÂÀ´ÔËÐУº

$ fig up

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µÄ´î½¨£¬ÒÔ¼°ÈçºÎÍê³É³ÖÐø¼¯³É¹¤×÷Á÷¡£

   
3141 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

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

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

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

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

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

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