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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
10¸öÈÕ³£DockerʹÓü¼ÇÉ
 
×÷ÕߣºÐ»È¨  À´Ô´;ÍøÂç ·¢²¼ÓÚ 2016-9-21
  4752  次浏览      32
 

ÎÒÓлú»á½¨Á¢Ò»¸öÒÔDockerΪ»ù´¡µÄ΢·þÎñ¼Ü¹¹ÔÚÎÒÏÖÔڵŤ×÷ÖУ¬ºÜ¶àÈ˶¼»á·ÖÏíËûÃÇʹÓÃDockerµÄÐĵã¬ÎÒÏëÎÒÒ²²»»áÀýÍâ¡£Òò´ËÎÒ×ܽáÁËһЩ£¬¿ÉÄÜÄã»áÔÚÈÕ³£Ê¹ÓÃDockerµÄʱºò»áÓõ½¡£

1¡¢Ò»Ì¨Ö÷»ú²¿Êð¶à¸öDockerʵÀý

Èç¹ûÄãÏëÔËÐжà¸öDocker ÈÝÆ÷ÔÚһ̨Ö÷»úÉÏ£¬Èç¹ûÒªÉèÖò»Í¬µÄTLSÉèÖã¬ÍøÂçÉèÖã¬ÈÕÖ¾ÉèÖúʹ洢Çý¶¯³ÌÐòÌØ¶¨µÄÈÝÆ÷£¬ÕâÊÇÌØ±ðÓÐÓõġ£

ÀýÈ磬ÎÒÃÇĿǰÕýÔÚÔËÐÐÒ»¸ö±ê×¼ÉèÁ¢Á½¸öDockerÊØ»¤½ø³Ì¡£Ò»ÔËÐÐconsulÌṩDNS½âÎö£¬²¢×÷ΪȺ¼¯´æ´¢ÎªÆäËûDocker ÈÝÆ÷¡£

For example:

# start a docker daemon and bind to a specific port
docker daemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \
-p "/var/run/docker1.pid" \
-g "/var/lib/docker1" \
--exec-root="/var/run/docker1
# and start another daemon
docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \
-s devicemapper \
--storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \
-p "/var/run/docker2.pid" \
-g "/var/lib/docker2" --exec-root="/var/run/docker2"
--cluster-store=consul://$IP:8500 \
--cluster-advertise=$IP:2376

2¡¢Docker ExecµÄʹÓÃ

Docker ExecÊÇÒ»¸öºÜÖØÒªºÜ¶àÈ˶¼»áÓõ½µÄ¹¤¾ß£¬Ò²ÐíÄãʹÓÃDocker²»Ö»ÊÇΪÄãµÄÉý¼¶£¬Éú²úºÍ²âÊÔ»·¾³£¬Í¬Ê±Ò²¶Ô±¾µØ»úÆ÷ÉÏÔËÐеÄÊý¾Ý¿â£¬·þÎñÆ÷ÃÜÔ¿¿âµÈ£¬ÕâÊÇÄܹ»Ö±½ÓÔËÐеÄÈÝÆ÷µÄÉÏÏÂÎÄÖÐÔËÐеÄÃüÁ·Ç³£·½±ã¡£

ÎÒÃÇ×öÁË´óÁ¿µÄCassandra£¬²¢¼ì²é±íÊÇ·ñ°üº¬ÕýÈ·µÄÊý¾Ý¡£Èç¹ûÄãÖ»ÊÇÏëÖ´ÐÐÒ»¸ö¿ìËÙCQL²éѯ£¬Docker exec ¾ÍºÜÔÞ£º

$ docker ps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}"
CONTAINER ID NAMES STATUS
682f47f97fce cassandra Up 2 minutes
4c45aea49180 consul Up 2 minutes
$ docker exec -ti 682f47f97fce cqlsh --color
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
cqlsh>

 

»òÕßÖ»ÊÇ·ÃÎÊnodetool»ò¾µÏñÖпÉÓõÄÈÎºÎÆäËû¹¤¾ß£º

$ docker exec -ti 682f47f97fce nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 192.168.99.100 443.34 KB 256 ? 8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1
Note: Non-system keyspaces don't have the
same replication settings, effective ownership information

Õ⵱Ȼ¿ÉÒÔ±»Ó¦Óõ½ÈκΣ¨Client£©µÄ¹¤¾ßÀ¦°óÔÚÒ»ÆðµÄ¾µÏñÖС£ÎÒ¸öÈ˾õµÃÕâÑù»á±ÈËùÓпͻ§¶ËºÍ±¾µØ¸üиü¼òµ¥¡£

3¡¢Docker µÄ¼ì²é ºÍJQ

ÓëÆä˵ÕâÊÇÒ»¸öDocker¼¼ÇÉ£¬²»Èç˵ÊÇÒ»¸öJQ¼¼ÇÉ¡£Èç¹ûÄãûÓÐÌý¹ýJQ£¬ËüÊÇÒ»¸öÔÚÃüÁîÐнâÎöJSONµÄΰ´ó¹¤¾ß¡£ÒòΪÎÒÃÇ¿ÉÒÔ²»ÐèҪʹÓÃformat specifier¶øÄܹ»²é¿´ÈÝÆ÷ÀïÃæ·¢ÉúµÄÒ»ÇС£

# Get network information:
$ docker inspect 4c45aea49180 | jq '.[].NetworkSettings.Networks'
{
"bridge": {
"EndpointID": "ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
# Get the arguments with which the container was started
$ docker inspect 4c45aea49180 | jq '.[].Args'
[
"-server",
"-advertise",
"192.168.99.100",
"-bootstrap-expect",
"1"
]
# Get all the mounted volumes
11:22 $ docker inspect 4c45aea49180 | jq '.[].Mounts'
[
{
"Name": "a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f",
"Source": "/mnt/sda1/var/lib/docker/volumes/
a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true
}
]

µ±È»£¬ËüÒ²ÄܺܺõÄÍê³É²éѯÆäËûÀàÐ͵Ä(Docker-esque) APIÉú³ÉµÄJSON(e.g Marathon, Mesos, Consul etc.)JQÌṩÁËÒ»¸ö·Ç³£¹ã·ºµÄAPI£¬ÓÃÓÚ·ÃÎʺʹ¦ÀíJSON.¸ü¶àÐÅÏ¢¿ÉÒÔÔÚÕâÀïÕÒµ½:https://stedolan.github.io/jq/

4¡¢À©Õ¹ÏÖÓÐÈÝÆ÷ºÍÔÚ±¾µØ×¢²á

ÔÚDocker hubÖÐÓдóÁ¿¿ÉÒÔʹÓõĵIJ»Í¬Ê¹Óó¡¾°µÄ¾µÏñ¡£ÎÒÃÇ×¢Òâµ½£¬ËäÈ»Óкܶà¿ÉÓõľµÏñ£¬µ«ÊǺܶàʱºòÎÒÃDz»µÃ¶ÔËûÃÇ×öһЩÐ޸ġ£

±ÈÈç¸üºÃµÄ½¡¿µ¼ì²éconsul£¬Í¨¹ýϵͳ±äÁ¿»òÃüÁîÐвÎÊýµÄÆäËûÅäÖã¬Îª¸üºÃµØÉèÖûòÔö¼ÓÎÒÃǵļ¯Èº£¬ÕâÊDz»ÈÝÒ××öµ½µÄ¡£Èç¹ûÎÒÃÇÅöµ½Õâ¸öÊǸոմ´½¨×Ô¼ºµÄDockerµÄ¾µÏñºÍ°ÑËüÍÆµ½ÎÒÃǵı¾µØ×¢²á±í¡£ÎÒÃÇͨ³£ÊÇÕâô×öµÄ¡£

±ÈÈ磬ÎÒÃÇÏ£ÍûÓÐJQ¿ÉÔÚÎÒÃǵÄconsul ¾µÏñÖÐÕâÑùÎÒÃǾͿÉÒԺܷ½±ãµÄ¼ì²éÎÒÃǵķþÎñÊÇ·ñÕý³£¡£

FROM progrium/consul
USER root
ADD bin/jq /bin/jq
ADD scripts/health-check.sh /bin/health-check.sh

ÎÒÃÇÓÐÁËhealth check scripts and JQÎÒÃǾͿÉÒÔ´ÓÎÒÃÇ×Ô¼ºµÄconsul image×öhealth checkÁË¡£ÎÒÃÇÒ²ÓÐÒ»¸ö±¾µØ×¢²á±íÔËÐоµÏñÔÚ´´½¨ºó£¬ÎÒÃÇÖ»ÊDZê¼ÇÉú³ÉµÄ¾µÏñ£¬²¢½«ÆäÍÆµ½ÎÒÃǵı¾µØ×¢²á±í¡£

$ docker build .
...
$ docker tag a3157e9edc18 <local-registry>/consul-local:some-tag
$ docker push <local-registry>/consul-local:some-tag

ÏÖÔÚ£¬Ëü¿ÉÒÔÌṩ¸øÎÒÃǵĿª·¢ÕßÁË¡£²¢ÇÒÒ²¿ÉÔÚÎÒÃǵIJ»Í¬µÄ²âÊÔ»·¾³ÖÐʹÓá£

5¡¢·ÃÎÊÔ¶³ÌÖ÷»úµÄDocker

DockerµÄCLIÊÇÒ»¸ö·Ç³£¿áµÄ¹¤¾ß£¬ÆäÖÐÒ»¸öºÜ´óµÄÌØµãÊÇ£¬Äã¿ÉÒÔÓÃËüÀ´ÇáËɵطÃÎʶàDockerÊØ»¤½ø³Ì£¬¼´Ê¹ËüÃÇÔÚ²»Í¬µÄÖ÷»ú¡£

ÄãÐèÒª×öµÄ¾ÍÊÇÉèÖÃDOCKER_HOST»·¾³±äÁ¿Ö¸ÏòDocker daemonµÄ¼àÌýµØÖ·¡£Èç¹û¸Ã¶Ë¿ÚÊÇ¿ÉÒԵķÃÎÊ£¬Äã¿ÉÒÔÖ±½ÓÔÚÔ¶³ÌÖ÷»úÉϵÄDocker£¬ÕâºÍÄãÔËÐÐÒ»¸öDocker daemon £¬²¢ÉèÖÃΪͨ¹ýdocker-machine¼¸ºõÏàͬµÄÔ­Àí¡£

 $ docker-machine env demo
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH=
"/Users/jos/.docker/machine/machines/demo"
export DOCKER_MACHINE_NAME="demo"

µ«Äã²»±ØÏÞÖÆ×Ô¼ºDocker daemons ³Ìͨ¹ýdocker-machineÆô¶¯¡£Èç¹ûÄãÓÐÄãµÄºǫ́³ÌÐòÔËÐеĿØÖÆ£¬ÒÔ¼°°²È«µÄÍøÂ磬Äã¿ÉÒÔºÜÈÝÒ׵شÓһ̨»úÆ÷¿ØÖÆËùÓеġ£

6¡¢¼òµ¥µÄÖ÷»úĿ¼¹ÒÔØ

µ±ÄãÕýÔÚʹÓÃÄãµÄÈÝÆ÷£¬ÄãÓÐʱÐèÒªµÃµ½ÈÝÆ÷ÀïÃæµÄһЩÊý¾Ý¡£Äú¿ÉÒÔ¸´ÖÆËü£¬»òÕßͨ¹ýʹÓÃsshÃüÁî¡£µ«¶àÊýÇé¿öÏÂÊÇ×îÈÝÒ×µÄÊǽ«Ò»¸öÖ÷»úĿ¼Ìí¼ÓÈÝÆ÷ÖС£¿ÉÒÔºÜÈÝÒ×µØÍ¨¹ýÖ´ÐÐÏÂÃæµÄÃüÁîÍê³É²Ù×÷£º

$ mkdir /Users/jos/temp/samplevolume/
$ ls /Users/jos/temp/samplevolume/
$ docker run -v /
Users/jos/temp/samplevolume/:
/samplevolume -it --rm busybox
$ docker run -v /Users/jos/temp/samplevolume/:/
samplevolume -it --rm busybox
/ # ls samplevolume/
/ # touch samplevolume/hello
/ # ls samplevolume/
hello
/ # exit
$ ls /Users/jos/temp/samplevolume/
hello

Äã¿ÉÒÔ¿´µ½ÎÒÃÇÖ¸¶¨µÄĿ¼°²×°ÔÚÈÝÆ÷ÄÚ£¬¶øÇÒÎÒÃǰÑËùÓеÄÎļþ¶¼ÔÚÖ÷»úÉÏ£¬²¢ÔÚÈÝÆ÷Äڿɼû¡£ÎÒÃÇÒ²¿ÉÒÔʹÓÃinspect²é¿´£¬¿´¿´ÓÐʲô°²×°ÔÚÄÄÀï¡£

$ docker inspect 76465cee5d49 | jq '.[].Mounts'
[
{
"Source": "/Users/jos/temp/samplevolume",
"Destination": "/samplevolume",
"Mode": "",
"RW": true
}
]

ÎÒÃÇ¿ÉÒÔÔÚDocker¹ÙÍø¿´µ½¸ü¶àµÄÌØÐÔºÍʹÓ÷½·¨£ºhttps://docs.docker.com/engine/userguide/dockervolumes/

7¡¢Ìí¼ÓDNS½âÎöµ½ÄãµÄÈÝÆ÷

ÎÒ֮ǰÌáµ½¹ý£¬ÎÒÃÇ¿ÉÒÔͨ¹ýconsulÀ´¹ÜÀíÈÝÆ÷¡£ConsulÊÇÒ»¸öÖ§³Ö¶àÊý¾ÝÖÐÐÄ·Ö²¼Ê½¸ß¿ÉÓõķþÎñ·¢ÏÖºÍÅäÖù²ÏíµÄ·þÎñÈí¼þ£¬¿ÉÒÔΪÈÝÆ÷Ìṩ·þÎñ·¢Ïֺͽ¡¿µ¼ì²é¡£

¶ÔÓÚ·þÎñ·¢ÏÖConsulÌṩÎÞÂÛÊÇREST API»ò´«Í³DNS£¬ËûµÄΰ´óµÄÖ®´¦ÊÇ£¬µ±ÄãÔËÐÐÒ»¸ö¾ßÌåµÄ¾µÏñ£¬Äã¿ÉÒÔÖ¸¶¨ÄãµÄÈÝÆ÷DNS·þÎñÆ÷¡£

µ±ÄãÓÐConsulÔËÐÐ(»òÕ߯äËü DNS server)Äã¿ÉÒÔ°ÑËüÌí¼Óµ½ÄúµÄDocker daemon¾ÍÏñÕâÑù£º

docker run -d --dns $IP_CONSUL --dns-search service.consul <rest of confguration>

ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔ½â¾öÓëConsulµÄÃû×Ö×¢²áµÄËùÓÐÈÝÆ÷µÄIPµØÖ·£¬±ÈÈçÔÚÎÒÃǵĻ·¾³ÎÒÃÇÓÐÁËÒ»¸öcassandra ¼¯Èº¡£Ã¿¸öcassandra½«×Ô¼º×¢²áÃû³ÆÎª¡°cassandra¡±ÎÒÃǵÄConsul ¼¯Èº¡£

×î¿áµÄÊÇ£¬ÎÒÃÇÏÖÔÚÖ»Êǽâ¾ö¿¨cassandraµÄµØÖ·»ùÓÚÖ÷»úÃû£¨¶ø²»±ØÊ¹ÓÃDockerÁ´½Ó£©

$ docker exec -ti 00c22e9e7c4e bash
daemon@00c22e9e7c4e:/opt/docker$ ping cassandra
PING cassandra.service.consul (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms
64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms
^C--- cassandra.service.consul ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.053/0.065/0.077/0.000 ms
daemon@00c22e9e7c4e:/opt/docker$

8¡¢Docker-UIÊÇÒ»¸öºÜ°ôÀ´²é¿´ºÍ»ñÈ¡¶´²ìÄãÈÝÆ÷µÄ·½Ê½

ʹÓÃDocker CLIÀ´²é¿´DockerÈÝÆ÷Ëù·¢ÉúµÄÒ»Çв¢²»ÄÑ¡£ºÜ¶àʱºò£¬ËäÈ»Äã²¢²»ÐèÒªµÄDocker CLIµÄÈ«²¿¹¦ÄÜ£¬µ«Ö»ÊÇÏë¿ìËÙä¯ÀÀÆäÖеÄÈÝÆ÷ÔËÐУ¬¿´¿´·¢ÉúÁËʲô¡£

Docker UI (https://github.com/crosbymichael/dockerui)¾ÍÊÇÒ»¸öÕâÑùΰ´óµÄÏîÄ¿£¬²¢ÇÒËûÊÇ¿ªÔ´µÄ¡£

ÓÐÁËÕâ¸ö¹¤¾ß£¬Äã¿ÉÒÔ¿´µ½Ò»¸öÌØ¶¨µÄDocker deamonµÄÈÝÆ÷ºÍ¾µÏñµÄ×îÖØÒªµÄ¶«Î÷¡£

9¡¢Container ²»ÄÜÆô¶¯? Overwrite the Entry PointÄãÖ»ÐèÒª´ÓbashÆô¶¯¡£

ÓÐʱºòÒ»¸öÈÝÆ÷Ö»ÊÇûÓÐ×öÄãÏëÒªËü×öµÄÊÂÇ飬ÄãÒѾ­ÖØÐ´´½¨ÁËDocker ¾µÏñ£¬ÄãÔÚÆô¶¯Ê±ÔËÐÐÁ˼¸´Î£¬µ«²»ÖªºÎ¹Ê£¬¸ÃÓ¦ÓóÌÐòûÓз´Ó¦£¬È»ºóÈÕÖ¾ÏÔʾҲûʲôÓÐÓõÄÐÅÏ¢¡£

×î¼òµ¥µÄµ÷ÊÔ·½·¨ÊÇoverwrite the entry point £¬¿´¿´ÔÚÈÝÆ÷ÄÚ²¿·¢ÉúµÄÒ»ÇУ¬²é¿´ÎļþȨÏÞÊÇ·ñÕýÈ·¡£¿½±´½øÈë¾µÏñµÄÎļþÊÇ·ñÕýÈ·£¬»òÕßÈÎºÎÆäËü¿ÉÄܳöÏֵĴíÎó¡£

ÐÒÔ˵ÄÊÇ£¬DockerÓÐÕâÑù×öµÄÒ»¸ö¼òµ¥µÄ½â¾ö·½°¸¡£Äã¿ÉÒÔ´ÓÒ»¸öÑ¡ÔñµÄÈë¿ÚµãÆô¶¯ÄãµÄÈÝÆ÷£º

$ docker run -ti --entrypoint=bash cassandra
root@896757f0bfd4:/# ls
bin dev etc lib mediaopt root sbin sys usr
boot docker-entrypoint.sh home lib64 mntproc run srv tmp var
root@896757f0bfd4:/#

10¡¢¼àÌýÒ»¸öÈÝÆ÷µÄʼþ£º

µ±Äã±àд×Ô¼ºµÄ½Å±¾£¬»òÕßÖ»ÊÇÏëÁ˽ⷢÉúÁËʲô£¬Äã¿ÉÒÔDocker event commandÔËÐÐÄãµÄ¾µÏñ£¬Îª´Ë±àд½Å±¾ºÜÈÝÒס£

ÕâÊÇÎÒÃÇûÓÐʹÓÃDocker Compose ºÍSwarm yetºÍDocker 1.9ÍøÂç²ã ÌØÐÔµÄÇé¿ö£¬DockerÒ»¸öºÜ¿áµÄ¹¤¾ß£¬ÓÐÒ»Ì×ΰ´óµÄ¹¤¾ß¡£

   
4752 ´Îä¯ÀÀ       32
 
Ïà¹ØÎÄÕÂ

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

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

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

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

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

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