自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

強(qiáng)推!10個(gè)日常Docker使用技巧

云計(jì)算
如果你想運(yùn)行多個(gè)Docker 容器在一臺(tái)主機(jī)上,如果要設(shè)置不同的TLS設(shè)置,網(wǎng)絡(luò)設(shè)置,日志設(shè)置和存儲(chǔ)驅(qū)動(dòng)程序特定的容器,這是特別有用的。

我有機(jī)會(huì)建立一個(gè)以Docker為基礎(chǔ)的微服務(wù)架構(gòu)在我現(xiàn)在的工作中,很多人都會(huì)分享他們使用Docker的心得,我想我也不會(huì)例外。因此我總結(jié)了一些,可能你會(huì)在日常使用Docker的時(shí)候會(huì)用到。

 強(qiáng)推!10個(gè)日常Docker使用技巧

1. 一臺(tái)主機(jī)部署多個(gè)Docker實(shí)例

如果你想運(yùn)行多個(gè)Docker 容器在一臺(tái)主機(jī)上,如果要設(shè)置不同的TLS設(shè)置,網(wǎng)絡(luò)設(shè)置,日志設(shè)置和存儲(chǔ)驅(qū)動(dòng)程序特定的容器,這是特別有用的。例如,我們目前正在運(yùn)行一個(gè)標(biāo)準(zhǔn)設(shè)立兩個(gè)Docker守護(hù)進(jìn)程。一運(yùn)行consul提供DNS解析,并作為群集存儲(chǔ)為其他Docker 容器。

For example:

  1. # start a docker daemon and bind to a specific port 
  2.  
  3. docker daemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \ 
  4.  
  5. -p "/var/run/docker1.pid" \ 
  6.  
  7. -g "/var/lib/docker1" \ 
  8.  
  9. --exec-root="/var/run/docker1 
  10.  
  11. # and start another daemon 
  12.  
  13. docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \ 
  14.  
  15. -s devicemapper \ 
  16.  
  17. --storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \ 
  18.  
  19. -p "/var/run/docker2.pid" \ 
  20.  
  21. -g "/var/lib/docker2" --exec-root="/var/run/docker2" 
  22.  
  23. --cluster-store=consul://$IP:8500 \ 
  24.  
  25. --cluster-advertise=$IP:2376 
  1. # start a docker daemon and bind to a specific port 
  2.  
  3. dockerdaemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \ 
  4.  
  5. -p "/var/run/docker1.pid" \ 
  6.  
  7. -g "/var/lib/docker1" \ 
  8.  
  9. --exec-root="/var/run/docker1 
  10.  
  11. # and start another daemon 
  12.  
  13. docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \ 
  14.  
  15. -s devicemapper \ 
  16.  
  17. --storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \ 
  18.  
  19. -p "/var/run/docker2.pid" \ 
  20.  
  21. -g "/var/lib/docker2" --exec-root="/var/run/docker2" 
  22.  
  23. --cluster-store=consul://$IP:8500 \ 
  24.  
  25. --cluster-advertise=$IP:2376 

2. Docker Exec的使用

Docker Exec是一個(gè)很重要很多人都會(huì)用到的工具,也許你使用Docker不只是為你的升級(jí),生產(chǎn)和測(cè)試環(huán)境,同時(shí)也對(duì)本地機(jī)器上運(yùn)行的數(shù)據(jù)庫(kù),服務(wù)器密鑰庫(kù)等,這是能夠直接運(yùn)行的容器的上下文中運(yùn)行的命令,非常方便。

我們做了大量的Cassandra,并檢查表是否包含正確的數(shù)據(jù)。如果你只是想執(zhí)行一個(gè)快速CQL查詢,Docker exec 就很贊:

  1. $ docker ps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}" 
  2.  
  3. CONTAINER ID NAMES STATUS 
  4.  
  5. 682f47f97fce cassandra Up 2 minutes 
  6.  
  7. 4c45aea49180 consul Up 2 minutes 
  8.  
  9. $ docker exec -ti 682f47f97fce cqlsh --color 
  10.  
  11. Connected to Test Cluster at 127.0.0.1:9042. 
  12.  
  13. [cqlsh 5.0.1 | Cassandra 2.2.3 | CQL spec 3.3.1 | Native protocol v4] 
  14.  
  15. Use HELP for help. 
  16.  
  17. cqlsh> 
  1. $ dockerps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}" 
  2.  
  3. CONTAINERID NAMES STATUS 
  4.  
  5. 682f47f97fce cassandra Up 2 minutes 
  6.  
  7. 4c45aea49180 consul Up 2 minutes 
  8.  
  9. $ dockerexec -ti 682f47f97fce cqlsh --color 
  10.  
  11. Connectedto TestClusterat 127.0.0.1:9042. 
  12.  
  13. [cqlsh 5.0.1 | Cassandra 2.2.3 | CQLspec 3.3.1 | Native protocolv4] 
  14.  
  15. Use HELPfor help. 
  16.  
  17. cqlsh> 

或者只是訪問(wèn)nodetool或鏡像中可用的任何其他工具:

  1. $ docker exec -ti 682f47f97fce nodetool status 
  2.  
  3. Datacenter: datacenter1 
  4.  
  5. ======================= 
  6.  
  7. Status=Up/Down 
  8.  
  9. |/ State=Normal/Leaving/Joining/Moving 
  10.  
  11. -- Address Load Tokens Owns Host ID Rack 
  12.  
  13. UN 192.168.99.100 443.34 KB 256 ? 8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1 
  14.  
  15. Note: Non-system keyspaces don't have the same replication settings, effective ownership information 
  1. $ dockerexec -ti 682f47f97fce nodetoolstatus 
  2.  
  3. Datacenter: datacenter1 
  4.  
  5. ======================= 
  6.  
  7. Status=Up/Down 
  8.  
  9. |/ State=Normal/Leaving/Joining/Moving 
  10.  
  11. -- Address Load Tokens Owns HostID Rack 
  12.  
  13. UN 192.168.99.100 443.34 KB 256 ? 8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1 
  14.  
  15. Note: Non-systemkeyspacesdon't havethesamereplicationsettings, effectiveownershipinformation 

這當(dāng)然可以被應(yīng)用到任何(Client)的工具捆綁在一起的鏡像中。我個(gè)人覺(jué)得這樣會(huì)比所有客戶端和本地更新更簡(jiǎn)單。

3. Docker 的檢查 和JQ

與其說(shuō)這是一個(gè)Docker技巧,不如說(shuō)是一個(gè)JQ技巧。如果你沒(méi)有聽(tīng)過(guò)JQ,它是一個(gè)在命令行解析JSON的偉大工具。因?yàn)槲覀兛梢圆恍枰褂胒ormat specifier而能夠查看容器里面發(fā)生的一切。

  1. # Get network information: 
  2.  
  3. $ docker inspect 4c45aea49180 | jq '.[].NetworkSettings.Networks' 
  4.  
  5.  
  6. "bridge": { 
  7.  
  8. "EndpointID""ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075"
  9.  
  10. "Gateway""172.17.0.1"
  11.  
  12. "IPAddress""172.17.0.2"
  13.  
  14. "IPPrefixLen": 16, 
  15.  
  16. "IPv6Gateway"""
  17.  
  18. "GlobalIPv6Address"""
  19.  
  20. "GlobalIPv6PrefixLen": 0, 
  21.  
  22. "MacAddress""02:42:ac:11:00:02" 
  23.  
  24.  
  25.  
  26. # Get the arguments with which the container was started 
  27.  
  28. $ docker inspect 4c45aea49180 | jq '.[].Args' 
  29.  
  30.  
  31. "-server"
  32.  
  33. "-advertise"
  34.  
  35. "192.168.99.100"
  36.  
  37. "-bootstrap-expect"
  38.  
  39. "1" 
  40.  
  41.  
  42. # Get all the mounted volumes 
  43.  
  44. 11:22 $ docker inspect 4c45aea49180 | jq '.[].Mounts' 
  45.  
  46.  
  47.  
  48. "Name""a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f"
  49.  
  50. "Source""/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data"
  51.  
  52. "Destination""/data"
  53.  
  54. "Driver""local"
  55.  
  56. "Mode"""
  57.  
  58. "RW"true 
  59.  
  60.  
  1. # Get network information: 
  2.  
  3. $ dockerinspect 4c45aea49180 | jq '.[].NetworkSettings.Networks' 
  4.  
  5.  
  6. "bridge": { 
  7.  
  8. "EndpointID""ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075"
  9.  
  10. "Gateway""172.17.0.1"
  11.  
  12. "IPAddress""172.17.0.2"
  13.  
  14. "IPPrefixLen": 16, 
  15.  
  16. "IPv6Gateway"""
  17.  
  18. "GlobalIPv6Address"""
  19.  
  20. "GlobalIPv6PrefixLen": 0, 
  21.  
  22. "MacAddress""02:42:ac:11:00:02" 
  23.  
  24.  
  25.  
  26. # Get the arguments with which the container was started 
  27.  
  28. $ dockerinspect 4c45aea49180 | jq '.[].Args' 
  29.  
  30.  
  31. "-server"
  32.  
  33. "-advertise"
  34.  
  35. "192.168.99.100"
  36.  
  37. "-bootstrap-expect"
  38.  
  39. "1" 
  40.  
  41.  
  42. # Get all the mounted volumes 
  43.  
  44. 11:22 $ dockerinspect 4c45aea49180 | jq '.[].Mounts' 
  45.  
  46.  
  47.  
  48. "Name""a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f"
  49.  
  50. "Source""/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data"
  51.  
  52. "Destination""/data"
  53.  
  54. "Driver""local"
  55.  
  56. "Mode"""
  57.  
  58. "RW"true 
  59.  
  60.  

當(dāng)然,它也能很好的完成查詢其他類(lèi)型的(Docker-esque) API生成的JSON(e.g Marathon, Mesos, Consul etc.)JQ提供了一個(gè)非常廣泛的API,用于訪問(wèn)和處理JSON.更多信息可以在這里找到: https://stedolan.github.io/jq/

4. 擴(kuò)展現(xiàn)有容器和在本地注冊(cè)

在Docker hub中有大量可以使用的的不同使用場(chǎng)景的鏡像。我們注意到,雖然有很多可用的鏡像,但是很多時(shí)候我們不得對(duì)他們做一些修改。比如更好的健康檢查consul,通過(guò)系統(tǒng)變量或命令行參數(shù)的其他配置,為更好地設(shè)置或增加我們的集群,這是不容易做到的。如果我們碰到這個(gè)是剛剛創(chuàng)建自己的Docker的鏡像和把它推到我們的本地注冊(cè)表。我們通常是這么做的。

比如,我們希望有JQ可在我們的consul 鏡像中這樣我們就可以很方便的檢查我們的服務(wù)是否正常。

  1. FROM progrium/consul 
  2.  
  3. USER root 
  4.  
  5. ADD bin/jq /bin/jq 
  6.  
  7. ADD scripts/health-check.sh /bin/health-check.sh 
  1. FROMprogrium/consul 
  2.  
  3. USERroot 
  4.  
  5. ADDbin/jq /bin/jq 
  6.  
  7. ADDscripts/health-check.sh /bin/health-check.sh 

我們有了health check scripts and JQ我們就可以從我們自己的consul image做health check了。我們也有一個(gè)本地注冊(cè)表運(yùn)行鏡像在創(chuàng)建后,我們只是標(biāo)記生成的鏡像,并將其推到我們的本地注冊(cè)表

  1. $ docker build . 
  2.  
  3. ... 
  4.  
  5. $ docker tag a3157e9edc18 /consul-local:some-tag 
  6.  
  7. $ docker push /consul-local:some-tag 
  1. $ dockerbuild . 
  2.  
  3. ... 
  4.  
  5. $ dockertaga3157e9edc18 /consul-local:some-tag 
  6.  
  7. $ dockerpush /consul-local:some-tag 

現(xiàn)在,它可以提供給我們的開(kāi)發(fā)者了。并且也可在我們的不同的測(cè)試環(huán)境中使用。

5. 訪問(wèn)遠(yuǎn)程主機(jī)的Docker

Docker的CLI是一個(gè)非??岬墓ぞ撸渲幸粋€(gè)很大的特點(diǎn)是,你可以用它來(lái)輕松地訪問(wèn)多Docker守護(hù)進(jìn)程,即使它們?cè)诓煌闹鳈C(jī)。你需要做的就是設(shè)置DOCKER_HOST環(huán)境變量指向Docker daemon的監(jiān)聽(tīng)地址。如果該端口是可以的訪問(wèn),你可以直接在遠(yuǎn)程主機(jī)上的Docker,這和你運(yùn)行一個(gè)Docker daemon ,并設(shè)置為通過(guò)docker-machine幾乎相同的原理。

  1. $ docker-machine env demo 
  2.  
  3. export DOCKER_TLS_VERIFY="1" 
  4.  
  5. export DOCKER_HOST="tcp://192.168.99.100:2376" 
  6.  
  7. export DOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo" 
  8.  
  9. export DOCKER_MACHINE_NAME="demo" 
  1. $ docker-machineenvdemo 
  2.  
  3. exportDOCKER_TLS_VERIFY="1" 
  4.  
  5. exportDOCKER_HOST="tcp://192.168.99.100:2376" 
  6.  
  7. exportDOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo" 
  8.  
  9. exportDOCKER_MACHINE_NAME="demo" 

但你不必限制自己Docker daemons 程通過(guò)docker-machine啟動(dòng)。如果你有你的后臺(tái)程序運(yùn)行的控制,以及安全的網(wǎng)絡(luò),你可以很容易地從一臺(tái)機(jī)器控制所有的。

6. 簡(jiǎn)單的主機(jī)目錄掛載

當(dāng)你正在使用你的容器,你有時(shí)需要得到容器里面的一些數(shù)據(jù)。您可以復(fù)制它,或者通過(guò)使用ssh命令。但多數(shù)情況下是最容易的是將一個(gè)主機(jī)目錄添加容器中。可以很容易地通過(guò)執(zhí)行下面的命令完成操作:

  1. $ mkdir /Users/jos/temp/samplevolume/ 
  2.  
  3. $ ls /Users/jos/temp/samplevolume/ 
  4.  
  5. $ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox 
  6.  
  7. $ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox 
  8.  
  9. / # ls samplevolume/ 
  10.  
  11. / # touch samplevolume/hello 
  12.  
  13. / # ls samplevolume/ 
  14.  
  15. hello 
  16.  
  17. / # exit 
  18.  
  19. $ ls /Users/jos/temp/samplevolume/ 
  20.  
  21. hello 
  1. $ mkdir /Users/jos/temp/samplevolume/ 
  2.  
  3. $ ls /Users/jos/temp/samplevolume/ 
  4.  
  5. $ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox 
  6.  
  7. $ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox 
  8.  
  9. / # ls samplevolume/ 
  10.  
  11. / # touch samplevolume/hello 
  12.  
  13. / # ls samplevolume/ 
  14.  
  15. hello 
  16.  
  17. / # exit 
  18.  
  19. $ ls /Users/jos/temp/samplevolume/ 
  20.  
  21. hello 

你可以看到我們指定的目錄安裝在容器內(nèi),而且我們把所有的文件都在主機(jī)上,并在容器內(nèi)可見(jiàn)。我們也可以使用inspect查看,看看有什么安裝在哪里。

  1. $ docker inspect 76465cee5d49 | jq '.[].Mounts' 
  2.  
  3.  
  4.  
  5. "Source""/Users/jos/temp/samplevolume"
  6.  
  7. "Destination""/samplevolume"
  8.  
  9. "Mode"""
  10.  
  11. "RW"true 
  12.  
  13.  
  1. $ dockerinspect 76465cee5d49 | jq '.[].Mounts' 
  2.  
  3.  
  4.  
  5. "Source""/Users/jos/temp/samplevolume"
  6.  
  7. "Destination""/samplevolume"
  8.  
  9. "Mode"""
  10.  
  11. "RW"true 
  12.  
  13.  

我們可以在Docker官網(wǎng)看到更多的特性和使用方 法:https://docs.docker.com/engine/userguide/dockervolumes/

7.添加DNS解析到你的容器

我之前提到過(guò),我們可以通過(guò)consul來(lái)管理容器。Consul是一個(gè)支持多數(shù)據(jù)中心分布式高可用的服務(wù)發(fā)現(xiàn)和配置共享的服務(wù)軟件,可以為容器提供服務(wù)發(fā)現(xiàn)和健康檢查。對(duì)于服務(wù)發(fā)現(xiàn)Consul提供無(wú)論是REST API或傳統(tǒng)DNS,他的偉大的之處是,當(dāng)你運(yùn)行一個(gè)具體的鏡像,你可以指定你的容器DNS服務(wù)器。

當(dāng)你有Consul運(yùn)行(或者其它 DNS server)你可以把它添加到您的Docker daemon就像這樣:

 

  1. docker run -d --dns $IP_CONSUL --dns-search service.consul 

 

  1. dockerrun -d --dns $IP_CONSUL --dns-searchservice.consul 

現(xiàn)在,我們可以解決與Consul的名字注冊(cè)的所有容器的IP地址,比如在我們的環(huán)境我們有了一個(gè)cassandra 集群。每個(gè)cassandra將自己注冊(cè)名稱(chēng)為“cassandra”我們的Consul 集群。最酷的是,我們現(xiàn)在只是解決卡cassandra的地址基于主機(jī)名(而不必使用Docker鏈接)

  1. $ docker exec -ti 00c22e9e7c4e bash 
  2.  
  3. daemon@00c22e9e7c4e:/opt/docker$ ping cassandra 
  4.  
  5. PING cassandra.service.consul (192.168.99.100): 56 data bytes 
  6.  
  7. 64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms 
  8.  
  9. 64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms 
  10.  
  11. ^C--- cassandra.service.consul ping statistics --- 
  12.  
  13. 2 packets transmitted, 2 packets received, 0% packet loss 
  14.  
  15. round-trip min/avg/max/stddev = 0.053/0.065/0.077/0.000 ms 
  16.  
  17. daemon@00c22e9e7c4e:/opt/docker$ 
  1. $ dockerexec -ti 00c22e9e7c4e bash 
  2.  
  3. daemon@00c22e9e7c4e:/opt/docker$ pingcassandra 
  4.  
  5. PINGcassandra.service.consul (192.168.99.100): 56 databytes 
  6.  
  7. 64 bytesfrom 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms 
  8.  
  9. 64 bytesfrom 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms 
  10.  
  11. ^C--- cassandra.service.consulpingstatistics --- 
  12.  
  13. 2 packetstransmitted, 2 packetsreceived, 0% packetloss 
  14.  
  15. round-tripmin/avg/max/stddev = 0.053/0.065/0.077/0.000 ms 
  16.  
  17. daemon@00c22e9e7c4e:/opt/docker$ 

8. Docker-UI是一個(gè)很棒來(lái)查看和獲取洞察你容器的方式

使用Docker CLI來(lái)查看Docker容器所發(fā)生的一切并不難。很多時(shí)候,雖然你并不需要的Docker CLI的全部功能,但只是想快速瀏覽其中的容器運(yùn)行,看看發(fā)生了什么。Docker UI ( https://github.com/crosbymichael/dockerui )就是一個(gè)這樣偉大的項(xiàng)目,并且他是開(kāi)源的。

 

有了這個(gè)工具,你可以看到一個(gè)特定的Docker deamon的容器和鏡像的最重要的東西。

9. Container 不能啟動(dòng)? Overwrite the Entry Point你只需要從bash啟動(dòng)。

有時(shí)候一個(gè)容器只是沒(méi)有做你想要它做的事情,你已經(jīng)重新創(chuàng)建了Docker 鏡像,你在啟動(dòng)時(shí)運(yùn)行了幾次,但不知何故,該應(yīng)用程序沒(méi)有反應(yīng),然后日志顯示也沒(méi)什么有用的信息。最簡(jiǎn)單的調(diào)試方法是overwrite the entry point ,看看在容器內(nèi)部發(fā)生的一切,查看文件權(quán)限是否正確。拷貝進(jìn)入鏡像的文件是否正確,或者任何其它可能出現(xiàn)的錯(cuò)誤。幸運(yùn)的是,Docker有這樣做的一個(gè)簡(jiǎn)單的解決方案。你可以從一個(gè)選擇的入口點(diǎn)啟動(dòng)你的容器:

  1. $ docker run -ti --entrypoint=bash cassandra 
  2.  
  3. root@896757f0bfd4:/# ls 
  4.  
  5. bin dev etc lib mediaopt root sbin sys usr 
  6.  
  7. boot docker-entrypoint.sh home lib64 mntproc run srv tmp var 
  8.  
  9. root@896757f0bfd4:/# 
  1. $ dockerrun -ti --entrypoint=bashcassandra 
  2.  
  3. root@896757f0bfd4:/# ls 
  4.  
  5. bin dev etc libmediaopt root sbin sys usr 
  6.  
  7. boot docker-entrypoint.sh home lib64 mntproc run srv tmp var 
  8.  
  9. root@896757f0bfd4:/# 

10. 監(jiān)聽(tīng)一個(gè)容器的事件:

當(dāng)你編寫(xiě)自己的腳本,或者只是想了解發(fā)生了什么,你可以Docker event command運(yùn)行你的鏡像,為此編寫(xiě)腳本很容易。

 

這是我們沒(méi)有使用Docker Compose 和Swarm yet和Docker 1.9網(wǎng)絡(luò)層 特性的情況,Docker一個(gè)很酷的工具,有一套偉大的工具。在未來(lái)希望Docker越來(lái)越好,我也會(huì)給大家展示一些Docker更酷的東西。

責(zé)任編輯:何妍 來(lái)源: 推酷
相關(guān)推薦

2020-09-23 09:13:47

Docker

2021-12-16 10:53:23

shell命令腳本

2022-08-18 10:01:35

Jmeter技巧

2015-07-27 09:36:09

storyboard

2011-05-07 11:15:39

掃描儀使用技巧

2010-11-30 09:06:28

Visual Stud

2013-04-10 09:46:29

EclipseJava

2020-06-30 08:28:29

Vue開(kāi)發(fā)前端

2011-06-24 09:15:26

Chromebook谷歌

2019-04-30 09:40:41

Windows 10技巧Windows

2010-09-28 08:52:00

C#Visual Stud

2011-05-07 13:23:17

噴墨打印機(jī)使用技巧

2019-07-10 15:51:40

Python數(shù)據(jù)分析代碼

2019-02-25 15:15:44

Windows 10Windows技巧

2018-11-28 08:15:09

2011-07-07 10:21:56

2020-06-08 07:52:31

Python開(kāi)發(fā)工具

2021-03-15 08:13:19

JavaScript開(kāi)發(fā)代碼

2023-02-07 08:00:00

MySQL數(shù)據(jù)庫(kù)技巧

2014-07-29 13:55:10

程序員代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)