在第一個筆記中我們已經(jīng)說過了 Docker 三大核心概念, 其中鏡像是最為重要的, 因?yàn)?Docker 運(yùn)行容器前需要本地存在對應(yīng)的鏡像, 如果鏡像沒有保存在本地, Docker 會嘗試從默認(rèn)鏡像倉庫下載, 用戶也可以通過配置, 使用自定義鏡像倉庫.
查詢鏡像
由于容器的創(chuàng)建需要鏡像, 那么我們就先說說如何查詢鏡像
我們使用 docker search
命令可以搜索遠(yuǎn)程倉庫共享的鏡像.
例如
docker search nginx
//輸出如下信息
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 6267 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1054 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 392 [OK]
webdevops/php-nginx Nginx with PHP-FPM 82 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 77 [OK]
h3nrik/nginx-ldap NGINX web server with LDAP/AD, SSL and pro... 38 [OK]
bitnami/nginx Bitnami nginx Docker Image 30 [OK]
evild/alpine-nginx Minimalistic Docker image with Nginx 16 [OK]
funkygibbon/nginx-pagespeed nginx + ngx_pagespeed + openssl on docker-... 11 [OK]
webdevops/nginx Nginx container 8 [OK]
webdevops/php-nginx-dev PHP with Nginx for Development (eg. with x... 7 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 5 [OK]
1science/nginx Nginx Docker images that include Consul Te... 4 [OK]
frekele/nginx docker run --rm --name nginx -p 80:80 -p 4... 3 [OK]
ixbox/nginx Nginx on Alpine Linux. 3 [OK]
dock0/nginx Arch container running nginx 2 [OK]
xataz/nginx Light nginx image 2 [OK]
servivum/nginx Nginx Docker Image with Useful Tools 2 [OK]
drupaldocker/nginx NGINX for Drupal 2 [OK]
tozd/nginx Dockerized nginx. 1 [OK]
xutongle/nginx nginx http 1 [OK]
c4tech/nginx Several nginx images for web applications. 0 [OK]
unblibraries/nginx Baseline non-PHP nginx container 0 [OK]
funkygibbon/nginx nginx + openssl automated build, customisa... 0 [OK]
watsco/nginx nginx:1.11-alpine 0 [OK]
可以看到返回了很多包含關(guān)鍵字的鏡像, 其中包括鏡像名字, 描述, 星級(表示該鏡像的歡迎程度), 是否官方創(chuàng)建, 是否自動創(chuàng)建.
注意: 默認(rèn)的輸出結(jié)果將按照星級評價進(jìn)行排序.
用的人越多星級就越高, 所以我們?nèi)绻幌氩榭吹偷男羌壴趺崔k呢?
我們可以通過 search
命令的參數(shù)-s, --stars=X
來進(jìn)行指定.
docker search -s 300 nginx
//輸出如下信息
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 6267 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1054 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 392 [OK]
這樣就會輸出星級大于或等于300的鏡像.
可以看到我們查詢的鏡像中的描述信息被截斷顯示了, 這樣我們不是很方便了解這個鏡像, 所以我們需要將所有的描述進(jìn)行顯示; 我們可以使用--no-trunc=true|false
來輸出詳細(xì)的描述信息.
docker search --no-trunc=true -s 300 nginx
//輸出如下信息
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 6267 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker containers 1054 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of pulling application code from git 392 [OK]
還有一個參數(shù)的作用是僅顯示自動創(chuàng)建的鏡像, --automated=true|false
當(dāng)然我們也可以從 Docker Hub 網(wǎng)站搜索鏡像
獲取鏡像
本筆記前面, 我們已經(jīng)說過了, 容器運(yùn)行前提需要本地存在對應(yīng)的鏡像, 如果本地沒有保存鏡像, 那么就需要在倉庫下載.
可以使用docker pull
命令直接從 Docker Hub鏡像源來下載鏡像, 該命令的格式為docker pull NAME[:TAG]
.
其中, NAME 是鏡像倉庫的名稱(用來區(qū)分鏡像), TAG 是鏡像的標(biāo)簽(往往用來表示版本信息). 通常情況下, 描述一個鏡像需要包括 "名稱+標(biāo)簽" 信息.
我們來實(shí)戰(zhàn)獲取一個鏡像
docker pull centos:6.8
//輸出如下信息
6.8: Pulling from library/centos
67f15db7c18f: Pull complete
Digest: sha256:37ee2dcd9a3a430136b566efb4aa1111ed332bfdef8b0de51a25d26891689fd7
Status: Downloaded newer image for centos:6.8
這樣我們就已經(jīng)下載下來了我們需要的鏡像.
如果不顯示指定 TAG, 則默認(rèn)會選擇 latest 標(biāo)簽, 這會下載倉庫中最新版本的鏡像.
docker pull centos
//輸出如下信息
Using default tag: latest
latest: Pulling from library/centos
d5e46245fe40: Pull complete
Digest: sha256:aebf12af704307dfa0079b3babdca8d7e8ff6564696882bcb5d11f1d461f9ee9
Status: Downloaded newer image for centos:latest
下面的截圖是我在 Docker Hub 查找的 CentOS 鏡像截圖, 方便大家理解.
可以看到有一個 TAG 為 latest 的.
注意: 一般來說, 鏡像的 latest 標(biāo)簽意味著該鏡像的內(nèi)容會跟蹤最新的非穩(wěn)定版本而發(fā)布, 內(nèi)容是不穩(wěn)定的.
從穩(wěn)定性上考慮, 不要在生產(chǎn)環(huán)境中忽略鏡像的標(biāo)簽信息或使用默認(rèn)的 latest 標(biāo)簽中的鏡像.
我們再下載一個鏡像 ubuntu 鏡像
docker pull ubuntu
//輸出如下信息
Using default tag: latest
latest: Pulling from library/ubuntu
75c416ea735c: Pull complete
c6ff40b6d658: Pull complete
a7050fc1f338: Pull complete
f0ffb5cf6ba9: Pull complete
be232718519c: Pull complete
Digest: sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4
Status: Downloaded newer image for ubuntu:latest
下載過程中可以看出, 鏡像文件一般由若干層(layer)組成, 75c416ea735c這樣的串是層的唯一 id(實(shí)際上完整的 id 包括256比特, 由64個十六進(jìn)制字符串組成).
使用 docker pull
命令下載時會獲取輸出鏡像的各層信息. 當(dāng)不同的鏡像包括相同的層時, 本地僅存儲,層的一份內(nèi)容, 這樣減少了需要的存儲空間.
我們查詢鏡像的時候發(fā)現(xiàn), 查詢出了很多鏡像
docker search -s 300 nginx
//輸出如下信息
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 6267 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1054 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 392 [OK]
例如jwilder/nginx-proxy, jwilder 屬于用戶名, nginx-proxy 屬于鏡像名.
當(dāng)你想將這些鏡像全部下載下來的時候, 可以使用-a
參數(shù), 來下載我們查詢到的所有鏡像.
docker pull -a ubuntu
查看鏡像信息
當(dāng)我們電腦上的鏡像越來越多的時候, 我們怎么能知道我們的本地主機(jī)上有多少鏡像呢? 我們可以使用docker images
命令來列出本地主機(jī)上的所有鏡像信息.
docker images
//輸出如下信息
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest d355ed3537e9 4 days ago 119 MB
hello-world latest 1815c82652c0 10 days ago 1.84 kB
centos latest 3bee3060bfc8 2 weeks ago 193 MB
centos 6.8 0cd976dc0a98 9 months ago 195 MB
REPOSITORY: 來自于哪個倉庫, 比如centos倉庫用來保存centos系列的基礎(chǔ)鏡像.
TAG: 鏡像的標(biāo)簽信息, 比如6.8 latest用來標(biāo)注不同的版本信息. 標(biāo)簽只是標(biāo)志, 并不能標(biāo)識鏡像內(nèi)容.
IMAGE ID: 鏡像的 ID.
CREATED: 創(chuàng)建時間
SIZE: 鏡像大小, 優(yōu)秀的鏡像往往體積都非常小.
images
命令支持的參數(shù)
-a, --all=true|false: 顯示所有圖像(默認(rèn)不顯示中間圖像圖層). 默認(rèn)值為false
--digests=true|false: 顯示鏡像摘要. 默認(rèn)值為false.
還有其它的 大家可以使用docker images --help
或 man docker-images
命令查看
使用 inspect 命令查看詳細(xì)信息
使用docker inspect
命令可以獲取該鏡像的詳細(xì)信息, 包括制作者 適應(yīng)架構(gòu) 各層的數(shù)字摘要等.
docker inspect centos:6.8
//輸出信息
[
{
"Id": "sha256:0cd976dc0a9881f77d054ca36c8700c3d66ac77121a1869ad8223a53edf123e9",
"RepoTags": [
"centos:6.8"
],
"RepoDigests": [
"centos@sha256:37ee2dcd9a3a430136b566efb4aa1111ed332bfdef8b0de51a25d26891689fd7"
],
"Parent": "",
"Comment": "",
"Created": "2016-08-30T18:20:34.565935321Z",
"Container": "4a66b6a87804820f367b575e18d52e7227b8d3cb40fbe55e05871b70bd091641",
"ContainerConfig": {
"Hostname": "75ac91db8d44",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"Image": "sha256:bfcabb206d5af74961b49d4584c4b16ef3658b05d5c969ed0f038a5c49d3296f",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"build-date": "2016-06-02",
"license": "GPLv2",
"name": "CentOS Base Image",
"vendor": "CentOS"
}
},
"DockerVersion": "1.12.1",
"Author": "The CentOS Project <cloud-ops@centos.org>",
"Config": {
"Hostname": "75ac91db8d44",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "sha256:bfcabb206d5af74961b49d4584c4b16ef3658b05d5c969ed0f038a5c49d3296f",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"build-date": "2016-06-02",
"license": "GPLv2",
"name": "CentOS Base Image",
"vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 194545356,
"VirtualSize": 194545356,
"GraphDriver": {
"Name": "devicemapper",
"Data": {
"DeviceId": "7",
"DeviceName": "docker-253:1-256921-57c4711bc6f1fbc6d91e79ffa7e1428bd57c55001d905d7734a7e028dddd5f81",
"DeviceSize": "10737418240"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:b1b065555b8aba5ae83d5d59d611a6b0cc470e9c14b7e4bee081398309e474a5"
]
}
}
]
如果我們只要其中一項(xiàng)內(nèi)容時, 可以使用-f
來指定, 例如,獲取鏡像的Architecture:
docker inspect centos:6.8 -f {{".Architecture"}}
//輸出信息
amd64
**使用 history 命令查看鏡像歷史
既然鏡像由多個層組成, 那么怎么知道各個層的具體內(nèi)容是什么呢? 可以使用history
命令, 該命令列出各個層的創(chuàng)建信息.
docker history centos:6.8
//輸出信息
IMAGE CREATED CREATED BY SIZE COMMENT
0cd976dc0a98 9 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 9 months ago /bin/sh -c #(nop) LABEL name=CentOS Base ... 0 B
<missing> 9 months ago /bin/sh -c #(nop) ADD file:beeefa390db7bc0... 195 MB
<missing> 9 months ago /bin/sh -c #(nop) MAINTAINER The CentOS P... 0 B
刪除鏡像
使用 docker rmi
命令可以刪除鏡像, 命令格式為docker rmi IMAGE [IMAGE...]
, 其中IMAGE可以為標(biāo)簽或 ID.
docker rmi ubuntu:latest
//輸出信息
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4
Deleted: sha256:d355ed3537e94e76389fd78b77241eeba58a11b8faa501594bc82d723eb1c7f2
Deleted: sha256:dd864b96a38e849779c42a04159bbb39c7ab47253bf222049b471d8f26b60d14
Deleted: sha256:80e85c818fa0447c96a42501ca7457ad83e5834aa76f22c366342106889b7411
Deleted: sha256:11a2a269cf6ec2cefcb4e24370b8b2d7a4875450bafd3a70bd42eb787481d798
Deleted: sha256:1118f33a0ee7a874a04318248a886b2bdaf44cba286644ab7ded870aefe64b62
Deleted: sha256:cb11ba6054003d39da5c681006ea346e04fb3444086331176bf57255f149c670
創(chuàng)建鏡像
創(chuàng)建鏡像的方法主要有三種: 基于已有鏡像的容器創(chuàng)建 基于本地模板導(dǎo)入 基于 Dockerfile 創(chuàng)建
基于已有鏡像的容器創(chuàng)建
該方法主要是使用 docker commit
命令. 命令格式為 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要選項(xiàng)包括:
-a, --author="": 作者信息.
-c, --change=[]: 提交的時候執(zhí)行 Dockerfile 指令, 包括 CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等.
-m, --message="": 提交消息
-p, --pause=true: 提交時暫停容器運(yùn)行.
我們使用centos 來創(chuàng)建或啟動一個容器, 并在容器中創(chuàng)建一個文件夾之后推出
docker run -it centos:6.8
[root@080ce2211b8a /]# mkdir test
[root@080ce2211b8a /]# exit
此刻該容器跟原 centos:6.8 鏡像相比, 已經(jīng)發(fā)生改變, 可以使用docker commit
命令來提交為一個新的鏡像.
docker commit 的語法格式為:
docker commit [選項(xiàng)] <容器ID或容器名> [<倉庫名>[:<標(biāo)簽>]]
容器名是 啟動容器時通過--name
所指定
容器ID是 root@080ce2211b8a
中的 080ce2211b8a
docker commit \
> --author "作者" \
> --message "說明" \
> 080ce2211b8a \
> test:0.1
sha256:bfc1e916eb6e787afab5be9e3b25ea29e799d2bcd7b461e22d666b0ec406606a
順利的話, 會返回新創(chuàng)建的鏡像的 ID 信息, 例如bfc1e916eb6e787afab5be9e3b25ea29e799d2bcd7b461e22d666b0ec406606a
基于本地模板導(dǎo)入
用戶也可以直接從一個操作系統(tǒng)模板文件導(dǎo)入一個鏡像, 主要使用 docker import
命令. 命令格式為 docker import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]
要直接導(dǎo)入一個鏡像, 可以使用 OpenVZ 提供的模板來創(chuàng)建, 或者用其他已導(dǎo)出的鏡像模板來創(chuàng)建.
例如, 下載了 ubuntu-14.04 的模板壓縮包, 之后使用以下命令導(dǎo)入:
$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
然后查看新導(dǎo)入的鏡像, 會發(fā)現(xiàn)她們已經(jīng)在本地存在了.
導(dǎo)出和導(dǎo)入鏡像
用戶可以使用 docker save
和 docker load
命令來導(dǎo)出和導(dǎo)入鏡像.
docker save -o ubuntu_14.04.tar ubuntu:14.04
docker load --input ubuntu_14.04.tar
或:
docker load < ubuntu_14.04.tar
上傳鏡像
可以使用 docker push
命令上傳鏡像到倉庫, 默認(rèn)上傳到Docker Hub官方倉庫.
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORY]/]NAME[:TAG]
在第一次上傳時, 會提示輸入登錄信息或進(jìn)行注冊.