ÔÚÎÒµÄǰһƪÎÄÕÂÖУ¬ÎÒÒѾ½éÉÜÁ˹ØÓÚÈÝÆ÷ºÍDockerÊÇÈçºÎÓ°ÏìPaaS¡¢Î¢·þÎñºÍÔÆ¼ÆËãµÄ¡£Èç¹ûÄã¸Õ¸Õ½Ó´¥DockerºÍÈÝÆ÷£¬ÎÒÇ¿ÁÒ½¨ÒéÄãÏȶÁÒ»¶ÁÎÒ֮ǰµÄÎÄÕ¡£×÷Ϊ֮ǰÎÄÕµÄÒ»¸öÑÓÐø£¬ÔÚ±¾ÎÄÖÐÎÒÈԻὲÊöһЩDocker¹¤×÷Á÷ʵÀýµÄÄÚÈÝ¡£Äã¿ÉÒÔÔÚGitHubÉÏÕÒµ½ËùÓеĴúÂëʾÀý¡£
ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÓÐÒ»¸ö·Ç³£¼òµ¥µÄNode.jsÓ¦Óã¬ËüʵÏÖÁËÒ»¸öµÝÔöµÄ¼ÆÊýÆ÷²¢ÇÒ½«Êý¾Ý´æ´¢ÔÚRedisÉÏ¡£ÎªÁ˱£Ö¤Ó¦Óõĸ߿ÉÀ©Õ¹µÄÄÜÁ¦£¬ÎÒ»á¶ÀÁ¢ÔËÐÐRedisºÍNodeÓ¦Óá£
ÈÃÎÒÃÇÏÈ̸̸ÈÝÆ÷£¬ÌرðÊÇDockerÈÝÆ÷¡£ÎÒÃÇҪΪÿ¸ö·þÎñ/½ø³Ì·ÖÅäÒ»¸öÈÝÆ÷£¡
1¸öRedisÈÝÆ÷
3¸öNodeÈÝÆ÷
1¸öNginxÈÝÆ÷
Òò´Ë£¬ÕûÌå¼Ü¹¹¿´ÉÏÈ¥ÊÇÕâÑùµÄ£º

ÎÒ¿ÉÒÔÓÃDockerÃüÁîÀ´¹¹½¨ÈÝÆ÷£¬µ«ÎªÁ˸ü¼Ó¼òµ¥£¬ÎÒÍÆ¼öʹÓÃDockerfile¡£ÎÒÒ²ÓÃDocker
ComposeÈ¥±àÅÅÓ¦ÓÃÁ¬½ÓÈÝÆ÷¡£
Ê×ÏÈ£¬ÎÒÏȽéÉÜÏÂÈçºÎ¶¨ÒåÈÝÆ÷¡£
£££££££££££££££££»ªÀöµÄ·Ö¸îÏߣ£££££££££££££££££££
ÐÞ¸ÄÈÕÆÚ£º2015Äê4ÔÂ3ÈÕ
ÓжàÖÖ·½·¨À´ÅäÖÃÒ»¸öDockerfileºÍ¾µÏñ²ã´Î¡£Ò»¸ö·½·¨£¬½«Æô¶¯Ò»¸ö»ùÓÚ²Ù×÷ϵͳµÄ¾µÏñ£¬ÈçUbuntu£¬²¢½¨Á¢×Ô¼ºµÄÓ¦ÓúÍÔÚÕâÖ®ÉϵÄÒÀÀµÏî¡£ÁíÒ»¸ö¿ÉÄÜÊÇ×îÀíÏëµÄ·½·¨ÊÇΪÄãµÄ¾ßÌåʹÓöøÊ¹ÓÃÒ»¸öÔ¤½¨µÄ¾µÏñ¡£Docker
Hub RegistryÓÐÐí¶àÓÃÓÚ¹¹½¨Á÷ÐÐÓ¦ÓÃºÍÆäÒÀÀµµÄÔ¤½¨¾µÏñ£¬ÕâЩ¿ÉÒÔÖ±½ÓÓá£
ÎÒ»áÐÞ¸ÄÀý×ÓÀ´ÑÝʾ²»Í¬µÄʹÓÃÇé¿ö¡£ÎÒ½«ÑÝʾΪRedisÈÝÆ÷ʹÓÃÒ»¸öÔ¤½¨¾µÏñ£¬ÎªNginxÈÝÆ÷ʹÓÃÒ»¸öÔ¤½¨µÄ×Ô¶¨ÒåÅäÖõľµÏñºÍÒ»¸ö¹¹½¨ÔÚUbuntu¾µÏñÉϵÄNodeÈÝÆ÷¡£
¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª
Redis ÈÝÆ÷
ÈÃÎÒÃÇʹÓùٷ½µÄRedis¾µÏñ´ÓDocker HubÉϵÄRedisÈÝÆ÷¡£ËüÔ¤´ò°üÁËRedis·þÎñµÄ°²×°£¬ÔËÐÐÔÚĬÈ϶˿Ú6379¡£ËùÒÔÄãֻҪĬÈÏÅäÖÃok¾Í²»ÐèÒªÐÞ¸ÄÈκÎÅäÖã¬Ö±½Ó´´½¨²¢ÔËÐÐRedisÈÝÆ÷¾µÏñ£º
docker run -d --name redis -p 6379:6379 redis |
Èç¹ûÄãÏë´Ó»ùÓÚUbuntuµÄ¾µÏñ¹¹½¨Redis¾µÏñ£¬Dockerfile»áÊÇÕâÑù£º
# Set the base image to Ubuntu FROM ubuntu # File Author
/ Maintainer MAINTAINER Anand Mani Sankar # Update the
repository and install Redis Server RUN apt-get update
&& apt-get install -y redis-server # Expose
Redis port 6379 EXPOSE 6379 # Run Redis Server ENTRYPOINT
[¡°/usr/bin/redis-server"] |
Node ÈÝÆ÷
ÈÃÎÒÃÇÀ´¿´¿´NodeÓ¦Óá£ÎÒ²»Ïë×öÌ«¶àµÄ½âÊÍ¡£ÎÒ×öµÄÊÇÔÚÿ¸öÇëÇóʹÓÃRedisµÄINCRµÄµÝÔöµÄÒ»¸öÊÓͼ¼ÆÊýÆ÷¡£ÎÒʹÓÃnode-redisÄ£¿éÁ¬Í¬hiredis´Ó¶ø»ñµÃ¸üºÃµÄÐÔÄÜ¡££¨Yeah£¬³¬¸ßÐÔÄܵÄÊÓͼ¼ÆÊýÆ÷²»»áÊÜË𣡣©
var express = require('express'), http = require('http'),
redis = require('redis'); var app = express(); console.log(process.env.REDIS_PORT_6379_TCP_ADDR
+ ':' + process.env.REDIS_PORT_6379_TCP_PORT); // APPROACH
1: Using environment variables created by Docker //
var client = redis.createClient( // process.env.REDIS_PORT_6379_TCP_PORT,
// process.env.REDIS_PORT_6379_TCP_ADDR // ); // APPROACH
2: Using host entries created by Docker in /etc/hosts
(RECOMMENDED) var client = redis.createClient('6379',
'redis'); app.get('/', function(req, res, next) { client.incr('counter',
function(err, counter) { if(err) return next(err); res.send('This
page has been viewed ' + counter + ' times!'); }); });
http.createServer(app).listen(process.env.PORT || 8080,
function() { console.log('Listening on port ' + (process.env.PORT
|| 8080)); }); |
Äã¿ÉÄÜÒѾעÒâµ½ÓÃÓÚµØÖ·ºÍ¶Ë¿ÚµÄRedis·þÎñµÄ»·¾³±äÁ¿£¬ÕâЩ»·¾³±äÁ¿ÊÇÔÚÈÝÆ÷Á¬½ÓʱÓÉDocker¶¨Ò壬ÒÔ·½±ãÈÝÆ÷¼äͨѶ¡£
£££££££££££££££££»ªÀöµÄ·Ö¸îÏߣ£££££££££££££££££££
ÐÞ¸ÄÈÕÆÚ£º2015Äê3ÔÂ31ÈÕ
Docker£¬³ýÁË´´½¨»·¾³±äÁ¿£¬»¹»á¸üР/etc/hosts ÎļþÖеÄÖ÷»ú¼Ç¼¡£ÊÂʵÉÏ£¬Docker¹Ù·½ÍƼöʹÓÃ/etc/hosts
ÎļþÀ´Ìæ´ú»·¾³±äÁ¿£¬ÒòΪÈç¹ûÔ´ÈÝÆ÷ÖØÆôµÄʱºò£¬»·¾³±äÁ¿²¢²»»á×Ô¶¯¸üС£
¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª
½ÓÏÂÀ´½«ÎÒÃÇʹÓÃÁíÒ»ÖÖ·½·¨À´¹¹½¨NodeÈÝÆ÷¡£ÎÒÃÇ´ÓÒ»¸ö»ù±¾µÄUbuntu¾µÏñ¿ªÊ¼£¬²¢Öð²½ÔÚÉÏÃæÌí¼ÓNodeºÍËüµÄÒÀÀµÏî¡£
Node Dockerfile:
# Set the base image to Ubuntu FROM
ubuntu # File Author / Maintainer MAINTAINER Anand Mani
Sankar # Update the repository RUN apt-get update #
Install Node.js and other dependencies RUN apt-get -y
install curl RUN curl -sL https://deb.nodesource.com/setup
| sudo bash - RUN apt-get -y install python build-essential
nodejs # Install nodemon RUN npm install -g nodemon
# Bundle app source COPY . /src # Install app dependencies
RUN cd /src; npm install # Expose port EXPOSE 8080 #
Run app using nodemon CMD ["nodemon", ¡°/src/index.js"] |
ÉÏÃæµÄDockerfile½âÊÍÈçÏ£º
´ÓDocker HubÀÈ¡Ubuntu»ù´¡¾µÏñ
ʹÓÃapt-get°²×°Node.jsÒÔ¼°ÒÀÀµ
ʹÓÃnpm°²×°nodemon
´ÓhostĿ¼¸´ÖÆÓ¦ÓÃÔ´Âëµ½ÈÝÆ÷ÄÚ src
ÔËÐÐ npm install °²×°NodeÓ¦ÓÃÒÀÀµ
¶Ë¿Ú8080´ÓÈÝÆ÷Å׳ö£¬Ê¹ÓÃnodemonÔËÐÐÓ¦ÓÃ
ʹÓÃDockerfile¹¹½¨Ò»¸öDocker¾µÏñ£º
docker build -t msanand/node . |
´Ó×Ô¶¨Òå¾µÏñÖд´½¨Ò»¸öNodeÈÝÆ÷²¢Á¬½ÓRedisÈÝÆ÷£º
docker run -d --name node -p 8080 --link redis:redis
msanand/node |
ÓÉÓÚÎҼƻ®ÔÚ3¸önode·þÎñÆ÷Ö®¼ä×ö¸ºÔؾùºâ£¬Îһᴴ½¨3¸öÈÝÆ÷ £ node1¡¢node2ºÍnode3¡£
Çë×¢Ò⣬RedisÈÝÆ÷½«»áÁ¬½Óµ½NodeÈÝÆ÷£¬ËùÒÔNodeÈÝÆ÷¿ÉÒÔͨ¹ýDocker´´½¨µÄÖ÷»ú¼Ç¼»òÕß»·¾³±äÁ¿¶¨ÒåµÄIPµØÖ·ºÍ¶Ë¿ÚÀ´ÓëRedisÈÝÆ÷½»»¥¡£
ÓÐÁËÕâÒ»µã£¬ÎÒÓÐÒ»¸öNodeÓ¦ÓÃÏÔʾһ¸öÊÓͼ¼ÆÊýÆ÷²¢½«Êý¾Ý±£´æÔÚRedis¡£ÈÃÎÒÃÇÀ´¿´¿´ÈçºÎʹÓÃNginxÀ´×ö¸ºÔؾùºâ¡£
NGINXÈÝÆ÷
NginxµÄºËÐÄÊÇËüµÄÅäÖãºÒ»¸öconfÎļþ¡£ÎÒʹÓÃÒ»¸ö¼òµ¥µÄNginxÅäÖÃÎļþ¶¨Òå3¸öupstream
server£º
worker_processes 4; events { worker_connections 1024;
} http { upstream node-app { least_conn; server node1:8080
weight=10 max_fails=3 fail_timeout=30s; server node2:8080
weight=10 max_fails=3 fail_timeout=30s; server node3:8080
weight=10 max_fails=3 fail_timeout=30s; } server { listen
80; location / { proxy_pass http://node-app; proxy_http_version
1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header
Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass
$http_upgrade; } } } |
ÎÒÒѾע²áÒ»¸ö node-app upstream server£¬Ëü»á¸ºÔؾùºâ3¸ö·þÎñ£ºnode1¡¢node2¡¢node3¡£ÎÒ»¹Í¨¹ýÒ»¸öÈ«µÈ¼ÓȨleast_conn
¸ºÔØÆ½ºâ²ßÂÔÖ¸¶¨ÁËÿ¸ö·þÎñÆ÷ÉϵĻÁ¬½ÓÊýµÄ¸ºÔؾùºâ¡£»òÕߣ¬Äã¿ÉÒÔʹÓÃÒ»¸ö»ùÓÚ¸ºÔؾùºâ·½·¨µÄÂÞ±öÑ»·£¨
round robin£©»òIP¹þÏ£»ò¼ü¹þÏ£¡£Nginx¼àÌý80¶Ë¿Ú£¬Ëü»ùÓÚ¸ºÔؾùºâ²ßÂÔ´úÀíÇëÇóµ½ÉÏÓηþÎñÆ÷
node-app¡£Èç¹ûÒªÁ˽â¸ü¶àµÄNginxµÄÅäÖÃÎÒ»áÁíÍâÌÖÂÛ¡£
ΪÁ˹¹½¨NginxÈÝÆ÷£¬ÎҼƻ®´ÓDocker HubÉÏʹÓÃÕýʽµÄNignx¾µÏñ¡£ÎÒ½«Ê¹ÓÃÒ»¸öDockerfileÒÔ¼°ÎÒ×Ô¶¨ÒåµÄNginx
confÎļþÅäÖÃNignx¡£
¸ÃDockerfileÊÇ×îСµÄ£Ê¹ÓÃNginx¾µÏñºÍ¸±±¾×Ô¶¨ÒåNginxµÄÅäÖãº
# Set nginx base image FROM nginx # File Author / Maintainer
MAINTAINER Anand Mani Sankar # Copy custom configuration
file from the current directory COPY nginx.conf /etc/nginx/nginx.conf |
¹¹½¨Docker¾µÏñ£º
docker build -t msanand/nginx .
´Ó¾µÏñÖд´½¨Ò»¸öNginxÈÝÆ÷£¬²¢Á¬½Óµ½NodeÈÝÆ÷£º
docker run -d --name nginx -p 80:80
--link node:node msanand/nginx
×îºó£¬ÎÒÃÇÓиöNginx·þÎñÆ÷¸ºÔؾùºâ3¸öNode·þÎñÆ÷¡£»Ø¹ýÀ´Ì¸Node·þÎñÆ÷£¬ËûÃÇÿһ¸öÔËÐÐÔÚ×Ô¼ºµÄÈÝÆ÷ÖУ¡
Èç¹ûÎÒÃÇÒª´´½¨Ò»¸ö»ù±¾µÄUbuntu¾µÏñ¶¨ÖÆNginxµÄ¾µÏñ£¬Dockerfile»áÊÇÕâ¸öÑù×Ó£º
# Set the base image to Ubuntu FROM ubuntu # File Author
/ Maintainer MAINTAINER Anand Mani Sankar # Install
Nginx # Add application repository URL to the default
sources # RUN echo "deb http://archive.ubuntu.com/ubuntu/
raring main universe" >> /etc/apt/sources.list
# Update the repository RUN apt-get update # Install
necessary tools RUN apt-get install -y nano wget dialog
net-tools # Download and Install Nginx RUN apt-get install
-y nginx # Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf # Copy a configuration
file from the current directory ADD nginx.conf /etc/nginx/
# Append "daemon off;" to the configuration
file RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# Expose ports EXPOSE 80 # Set the default command to
execute when creating a new container CMD service nginx
start |
Dockerfile£¨ daemon off£©ÅäÖÃÁËNginx²»ÒÔÊØ»¤½ø³ÌÔËÐУ¬ÕâÒ²ÊDZØÐëµÄ£¬ÒòΪDockerÈÝÆ÷±¾Éí¾ÍÊÇÎÞ״̬µÄ£¬Ö»Óе±ËûÃÇËù³ÐÔØµÄ½ø³ÌÔËÐеÄʱºò£¬ÈÝÆ÷²ÅÓдæÔÚµÄÒâÒå¡£ËùÒÔ°ÑNginxµ±³Éºǫ́½ø³ÌÔËÐиù±¾²»¿ÉÄÜ¡£Ïà·´£¬°ÑNginx×÷Ϊһ¸ö·þÎñÔËÐпÉÒÔÈ·±£ÈÝÆ÷µÄÕý³£ÔËÐС£¹Ù·½Nginx¾µÏñĬÈÏÅäÖÃÒ²ÊÇÕâÑùµÄ¡£
Docker Compose±àÅÅÓ¦ÓÃ
ComposeÊÇÒ»¸öʹÓÃDocker¶¨ÒåºÍÔËÐи´ÔÓÓ¦ÓõŤ¾ß¡£
ʹÓõ¥¶ÀµÄÃüÁîÀ´¹¹½¨¾µÏñ²¢ÔËÐкÍÁ¬½ÓÈÝÆ÷·Ç³£·±ËöºÍ¸´ÔÓ£¬ÌرðÊÇÄãÒªÔËÐжà¸öÈÝÆ÷µÄʱºò¡£
Docker ComposeÈÃÄãÔÚÒ»¸öÎļþÖж¨Òå¶àÈÝÆ÷Ó¦Óò¢ÓÃÒ»¸öÃüÁîʹӦÓóÌÐòÔËÐÐÆðÀ´¡£
ÎÒÒѾ¶¨ÒåÒ»¸öDocker Compose YAMLÎļþ£¬ÈçÏ£º
nginx: build: ./nginx links: - node1:node1 - node2:node2
- node3:node3 ports: - "80:80" node1: build:
./node links: - redis ports: - "8080" volumes:
- node:/src node2: build: ./node links: - redis ports:
- "8080" volumes: - node:/src node3: build:
./node links: - redis ports: - "8080" volumes:
- node:/src redis: image: redis ports: - ¡°6379" |
YAMLÎļþ¶¨Òåÿ¸öÈÝÆ÷µÄÃû×Ö£¬Ö¸ÏòÒ»¸öÓÃÓÚ¹¹½¨µÄDockerfile¡£´ËÍ⣬Ëü°üº¬ËùÊöÈÝÆ÷Á¬½Ó²¢Í¨¹ýËüÃDZ©Â¶¶Ë¿Ú¡£ÓÉÓÚRedisÈÝÆ÷ʹÓÃRedis¹Ù·½¾µÏñ£¬ËùÒÔ²»±Ø¹¹½¨¡£
Ö»ÐèÒªÒ»¸öÃüÁDocker Compose¾Í¿ÉÒÔ¹¹½¨ËùÐè¾µÏñ£¬²¢µ¼³öËùÐè¶Ë¿Ú£¬È»ºóͨ¹ýYAMLÖе͍ÒåÔËÐкÍÁ¬½ÓÈÝÆ÷¡£ËùÓÐÄãÐèÒª×öµÄ¾ÍÊÇÔËÐÐ
docker-compose up£¬È»ºóÄãµÄ5¸öÈÝÆ÷Ó¦ÓþͻáÆô¶¯²¢ÔËÐС£ÊäÈëÄãµÄÖ÷»úURLºÍ80¶Ë¿Ú£¬Äã¾Í¿ÉÒÔ¿´µ½ÄãµÄÊÓͼ¼ÆÊýÆ÷£¡
Docker ComposeµÄÒ»¸öÏÔÖøÌØµã¾ÍÊǾßÓж¯Ì¬À©Õ¹ÈÝÆ÷µÄÄÜÁ¦¡£Ê¹ÓÃÃüÁî docker-compose
scale node=5¿ÉÒÔÀ©Õ¹ÈÝÆ÷µÄÊýÁ¿À´ÔËÐÐÒ»¸ö·þÎñ¡£Èç¹ûÄãÒÑÓÐÒ»¸ö»ùÓÚ΢·þÎñ¼Ü¹¹µÄDocker£¬Äã¿ÉÒÔÇáËɵØÀ©Õ¹£¬²¢¶¯Ì¬µØ¸ù¾Ý¸ºÔØ·ÖÅä¾ßÌå·þÎñ¡£ÀíÏëÇé¿öÏ£¬ÎÒÄþÔ¸¶¨ÒåÒ»¸önode·þÎñ²¢Ê¹ÓÃDocker
ComposeÀ´À©Õ¹Ëü¡£µ«ÎÒ»¹Ã»ÓÐÏë³öÒ»¸ö·½·¨À´¶¯Ì¬µØµ÷ÕûNginxµÄÅäÖá£Èç¹ûÄãÓÐÕâ·½ÃæµÄÏë·¨£¬ÇëÔÚ±¾ÎÄºó»Ø¸´¡£
µ«ÕâÀïÓиöÐèҪעÒâµÄÊÇ£¬Docker Compose»¹²»ÄÜÓÃÓÚÉú²ú»·¾³¡£Îĵµ½¨ÒéʹÓÃÔÚ¿ª·¢»·¾³ÖУ¬¶ø²»ÊÇÉú²ú»·¾³¡£µ«Ò²ÓÐÆäËüµÄÈÝÆ÷±àÅÅÒýÇæÈçÎÒ֮ǰµÄÎÄÕÂÌÖÂÛµÄKubernetes¡£
³ÖÐø¼¯³ÉºÍ²¿Êð
ÎÒÔÚÎÒµÄGitHub²Ö¿âÖÐÅäÖÃÁË2¸öhook·þÎñ£¨ÒëÕß×¢£º×÷ÕßÖ¸µÄÊÇGitHub
Webhook£©¡£
CircleCI£ÓÃÓÚ³ÖÐø¼¯³É£¨ÒÔ¼°²¿Êð£©
Docker Hub -ÓÃÓÚDocker¹¹½¨£¨continuous Docker
builds£©
CircleCI YAMLÅäÖÃÎļþ¿´Õâ¶ù£º
machine: services: - docker dependencies: override:
- sudo pip install -U docker-compose test: override:
- docker-compose run -d --no-deps node1 - cd node; mocha |
YAMLÅäÖÃÎļþʹÓÃCircleCIÌṩµÄDocker·þÎñ£¬²¢°²×°Docker
ComposeÒÀÀµ£¬´´½¨ÁËNodeÈÝÆ÷£¨Î´Á¬½Óµ½RedisÈÝÆ÷£©¡£ËüʹÓÃMocha£¨ÒëÕß×¢£ºMochaÊÇÒ»¸ö»ùÓÚNode.jsºÍä¯ÀÀÆ÷µÄ¼¯ºÏ¸÷ÖÖÌØÐÔµÄJavaScript²âÊÔ¿ò¼Ü£¬²¢ÇÒ¿ÉÒÔÈÃÒì²½²âÊÔÒ²±äµÄ¼òµ¥ºÍÓÐȤ¡£MochaµÄ²âÊÔÊÇÁ¬ÐøµÄ£¬ÔÚÕýÈ·µÄ²âÊÔÌõ¼þÖÐÓöµ½Î´²¶»ñµÄÒ쳣ʱ£¬»á¸ø³öÁé»îÇÒ׼ȷµÄ±¨¸æ¡£MochaÍйÜÔÚGithubÉÏ£©ÔÚNodeÓ¦ÓÃÉÏ´¥·¢²âÊÔ£¬ÕâÈ·±£ÁËGitHubÉÏÿ¸öÌá½»¶¼»á¶ÔÓ¦Ò»¸ö²âÊÔ¡£

ÿ´ÎÌá½»¶¼»á´¥·¢ÎÒµÄDocker Hub Repository½øÐÐÒ»´Î¹¹½¨¡£ÕâÈ·±£ÔÚDocker HubÖÐͨ¹ý³ÖÐø²¿Êðµ½Éú²ú»·¾³µÄ×îÖÕ¾µÏñ×ÜÊÇ¿ÉÓõġ£Éú²ú»·¾³ÄÜÔÚÈκÎʱ¼ä´ÓDocker
HubºÍ´ÓÈÝÆ÷ÖбàÅŵÄÓ¦ÓÃÖÐÄÜÀµ½×îÖÕ¾µÏñ¡£
ÒÔÉÏÊÇÎÒµÄÒ»¸ö»ùÓÚNginx¡¢Node.jsºÍRedisµÄDockerÁ÷³ÌʵÀý¡£Èç¹ûÄãÓÐÈκν¨ÒéºÍ¸üºÃµÄ·½·¨£¬Çë·¢±íÆÀÂÛ¡£ |