你能夠用過
LABEL
把元數據應用到你的鏡像,容器或者是守護進程中。元數據能夠服務於普遍的用途。使用標籤能夠給鏡像添加註釋或者是許可信息,還能夠用來標誌你的主機docker
標籤是<key>
/ <value>
鍵值對,Docker以字符串的方式存儲標籤。你能夠指定多個標籤可是每個<key>
/ <value>
必須不一樣防止對已經存在的鍵值對覆蓋。若是你給同一個key
指定了多個不一樣的值,新的值會把以前的值覆蓋掉。記住,對於相同的key
,Docker只會應用你提供的最後一個值。shell
注意:Docker1.4.1以後的版本才支持daemon-labels,對標籤和容器的標籤支持是1.6.0中的新特性。ide
標籤的
鍵
,(也就是命名空間)工具
Docker對你建立的標籤中的鍵沒有什麼硬性的限制,可是簡單的鍵也有可能衝突。例如,你經過architecture
標籤來給你的鏡像分類:spa
languageLABEL architecture="amd64" LABEL architecture="ARMv7"
並且用戶也能夠經過不一樣風格的標籤來給鏡像打標籤:unix
languageLABEL architecture="Art Nouveau"
爲了防止命名衝突,Docker的命名空間標籤鍵使用反向域名
表示。參考下面來命名你的鍵:code
com.example.some-label
,com.example.some-auther="root"
com.docker.*
, io.docker.*
和com.dockerproject.*
保留給Docker內部使用-
表示,及[a-z0-9-.]
-
和點CLI
,這就容許最終用戶給容器和鏡像添加元數據而沒必要在終端輸入繁瑣的命令上面列舉的都是準則且Docker嚴格遵照執行。若是你沒有遵照這些準則有可能致使標籤名的衝突。若是恰巧你也在使用標籤構建工具的話,趕快爲你的標籤和鍵使用名稱空間吧orm
在標籤中存儲結構化數據dns
標籤中的值能夠包含任何能被存儲爲字符串的值,例以下面的JSON格式的數據:進程
shell{ "Description": "A containerized foobar", "Usage": "docker run --rm example/foobar [args]", "License": "GPL", "Version": "0.0.1-beta", "aBoolean": true, "aNumber" : 0.01234, "aNestedArray": ["a", "b", "c"] }
要想把這個結構存儲在標籤中,首先你要把它序列化爲字符串:
languageLABEL com.example.image-specs="{\"Description\":\"A containerized foobar\",\"Usage\":\"docker run --rm example\\/foobar [args]\",\"License\":\"GPL\",\"Version\":\"0.0.1-beta\",\"aBoolean\":true,\"aNumber\":0.01234,\"aNestedArray\":[\"a\",\"b\",\"c\"]}"
雖然能夠在標籤中存儲結構化的數據,可是Docker把它(結構化的數據)看做是普通的字符串。這意味着Docker自己並不提供基於嵌套屬性的查詢(過濾器)。若是你的工具須要經過嵌套屬性來過濾,那麼你的工具自己要實現這個功能,二不要讓Docker去作。
使用
LABEL
指令給鏡像添加標籤
languageLABEL [<namespace>.]<key>[=<value>] ...
LABEL指令用來給鏡像添加標籤,可選擇設置它的值。對於使用空格
的標籤,要用雙引號
或者反斜槓
。
e.g.
languageLABEL vendor=ACME\ Incorporated LABEL com.example.version.is-beta LABEL com.example.version="0.0.1-beta" LABEL com.example.release-date="2015-02-12"
注意:上面的第二行中只有鍵,沒有值。
LABEL指令支持在一個LABEL
下設置多個
e.g.
languageLABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
Docker容許使用反斜槓\
,將1行指令分割爲多個行
languageLABEL vendor=ACME\ Incorporated \ com.example.is-beta \ com.example.version="0.0.1-beta" \ com.example.release-date="2015-02-12"
Docker更推薦你在一個LABEL指令中設置多個標籤,每一個標籤都用指令單獨設置的話會讓你的鏡像很低效
,這是由於每個Dockerfile中的LABEL指令都會產生1個鏡像層(怒了,這個解釋直達本質啊)!!!
咱們可使用docker inspect
來查看鏡像或者容器的標籤
查詢標籤
標籤除了能夠用來存儲元數據,還能夠用來過濾鏡像和容器。下面的命令將會列出全部包含com.example.is-beta
標籤而且運行這的容器:
languagedocker ps --filter "label=com.example.is-beta"
color
標籤且值爲blue
的運行中的容器
languagedocker ps --filter "label=color=blue"
包含vendor
和ACME
的鏡像
languagedocker images --filter "label=vendor=ACME"
守護標籤
docker info
這條命令的解釋是:Display system-wide information(顯示所有信息)
下面是我電腦上的結果:
languageadolph@geek:~$ docker info Containers: 7 Images: 44 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 58 Dirperm1 Supported: false Execution Driver: native-0.2 Kernel Version: 3.13.0-52-generic Operating System: Ubuntu 14.04.2 LTS CPUs: 4 Total Memory: 7.687 GiB Name: geek ID: HGR7:UGWW:VQVV:WYMF:CSEE:KJ4C:QS4U:IRIU:LREB:M4YC:GDJY:YPI5 Username: adolphlwq Registry: [https://index.docker.io/v1/] WARNING: No swap limit support
能夠看出裏面主要是關於Docker daemon的信息,這裏並無關於它的標籤信息。可是咱們能夠經過``docker -d label=value`的方式給Docker daemon自己添加標籤:
languagedocker -d \ --dns 8.8.8.8 \ --dns 8.8.4.4 \ -H unix:///var/run/docker.sock \ --label com.example.environment="production" \ --label com.example.storage="ssd"