當然,它也能很好的完成查詢其他類型的(Docker-esque) API生成的JSON(e.g Marathon, Mesos, Consul etc.)JQ提供瞭一個非常廣泛的API,用於訪問和處理JSON.更多信息可以在這裡找到:https://stedolan.github.io/jq/
在Docker hub中有大量可以使用的的不同使用場景的鏡像。我們註意到,雖然有很多可用的鏡像,但是很多時候我們不得對他們做一些修改。
比如更好的健康檢查consul,通過系統變量或命令行參數的其他配置,為更好地設置或增加我們的集群,這是不容易做到的。如果我們碰到這個是剛剛創建自己的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瞭。我們也有一個本地註冊表運行鏡像在創建後,我們隻是標記生成的鏡像,並將其推到我們的本地註冊表。
$ docker build .
…
$ docker tag a3157e9edc18 /consul-local:some-tag
$ docker push /consul-local:some-tag
現在,它可以提供給我們的開發者瞭。並且也可在我們的不同的測試環境中使用。
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啟動。如果你有你的後臺程序運行的控製,以及安全的網絡,你可以很容易地從一臺機器控製所有的。
當你正在使用你的容器,你有時需要得到容器裡面的一些數據。您可以復製它,或者通過使用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
現在,我們可以解決與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$
使用Docker CLI來查看Docker容器所發生的一切並不難。很多時候,雖然你並不需要的Docker CLI的全部功能,但隻是想快速瀏覽其中的容器運行,看看發生瞭什麼。
Docker UI (https://github.com/crosbymichael/dockerui)就是一個這樣偉大的項目,並且他是開源的。
有瞭這個工具,你可以看到一個特定的Docker deamon的容器和鏡像的最重要的東西。
有時候一個容器隻是沒有做你想要它做的事情,你已經重新創建瞭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:/#
當你編寫自己的腳本,或者隻是想瞭解發生瞭什麼,你可以Docker event command運行你的鏡像,為此編寫腳本很容易。