內容提要
docker鏡像相關操作,包括獲取,查看,搜索,刪除,創建,存出和載入,上傳等。
1.啓動
servie start docker
爲了避免每次使用docker命令都要用特權身份
將當前用戶加入docker用戶組
sudo usermod -aG docker USER_NAME
2.獲取鏡像
可以使用**docker pull NAME[:TAG]**直接從DockerHub鏡像源下載鏡像。NAME是鏡像倉庫名稱,TAG是鏡像標籤(版本信息),例如獲取一個Ubuntu14.04系統基本鏡像
如果不顯式指定TAG,則默認會選擇latest 標籤,這會下載倉庫中最新版本的鏡像(最新鏡像一般非穩定版本)
pulling from library/ubuntu
非官方的倉庫下載,則需要在倉庫名稱前指定完整的倉庫地址。
例如從網易蜂巢的鏡像源來下載ubuntu: 14.04 鏡像,可以使用如下命令,此
時下載的鏡像
docker pull hub.c.163.com/public/ubuntu:14.04
子命令詳解
-a,--all-tags=true| false:是否獲取倉庫中的所有鏡像,默認爲否。
3.鏡像操作
1.安裝Nginx 並啓動
pull鏡像,並啓動 -d後臺啓動 -p宿主機端口映射容器端口。
sudo docker run -d -p 80:80 --restart=always nginx:latest
此時訪問即可80端口即可。
2.images列出鏡像
docker images
在列出的信息中,可以看到的信息:
- 來自於哪個倉庫,比如 ubuntu 倉庫用來保存 ubuntu 系列的基礎鏡像;
- 鏡像的標籤信息,比如14.04、latest用來標註不同的版本信息。
- 鏡像的ID(唯一標識鏡像)如oracle11g與registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g鏡像ID相同證明實際上指向的是同一鏡像。
- 創建時間,說明鏡像最後的更新時間;
- 鏡像大小
鏡像ID信息十分重要,它標識了鏡像。在使用時前若干個字符串來代替完整ID.
TAG 信息用來標記來自同一個倉庫的不同鏡像。通過TAG信息來區分發行版本。
子命令詳解
-a,--all=true| false:列出所有的鏡像文件(包括臨時文件),默認爲否;
--digests=true| false:列出鏡像的數字摘要值,默認爲否
-f,--filter=[]:過濾列出的鏡像,如 dangling=true 只顯示沒有被使用
的鏡像;也可指定帶有特定標註的鏡像等
--format="TEMPLATE":控制輸出格式,如.ID代表 ID信息,.Repository代表倉庫信息等;
-no-trunc=true| false:對輸出結果中太長的部分是否進行截斷,如鏡像的ID 信息,默認爲是
-q,--quiet=true|false:僅輸出ID信息,默認爲否。
更多子命令選項還可以通過 man docker-images 來查看
3.使用tag 命令添加鏡像標籤
爲了方便在後續工作中使用特定鏡像,還可以使用 docker tag命令來爲本地鏡像任意添加新的標籤。例如添加一個新的oracle鏡像標籤
docker tag registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g oracle11g:latest
也可以指定鏡像ID來修改其標籤
```shell``
docker tag 5sbdf471761 test/oracle11g:latest
### 4.使用inspect 命令查看詳細信息
使用**docker inspect** 命令可以獲取該鏡像的詳細信息,包括製作者、架構、各層的數字摘要等
```json
[
{
"Id": "sha256:4152a960875253728e0ba43da37d023e4626c43a268ca0a9c6083119542119fb",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:9916837e6b165e967e2beb5a586b1c980084d08eb3b3d7f79178a0c79426d880"
],
"Parent": "",
"Comment": "",
"Created": "2019-11-20T01:15:47.501397881Z",
"Container": "b976da4ad5a3f13d191cfedd87ab06bc7b3bf0d5eb37876fa091c3aaae572056",
"ContainerConfig": {
"Hostname": "b976da4ad5a3",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.17.6",
"NJS_VERSION=0.3.7",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"ArgsEscaped": true,
"Image": "sha256:d96abf34b30211ae8cdb9700ff30dddb3b45ed410bb159fe562ea428b6280851",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <[email protected]>"
},
"StopSignal": "SIGTERM"
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.17.6",
"NJS_VERSION=0.3.7",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"ArgsEscaped": true,
"Image": "sha256:d96abf34b30211ae8cdb9700ff30dddb3b45ed410bb159fe562ea428b6280851",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <[email protected]>"
},
"StopSignal": "SIGTERM"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 126346569,
"VirtualSize": 126346569,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/da7346d91a599e73e4d394bb85a467ac618131460f846683aaa596c779b1ea07/diff:/var/lib/docker/overlay2/5c3cf4f87fe4f7f16433918981eb3471b5bc2b23eea1c0883db2d3561b73dd47/diff",
"MergedDir": "/var/lib/docker/overlay2/6168e5e9a57d684f9c5809e6e4722c73bc2434326d39e90cfcdefe0a1b84999d/merged",
"UpperDir": "/var/lib/docker/overlay2/6168e5e9a57d684f9c5809e6e4722c73bc2434326d39e90cfcdefe0a1b84999d/diff",
"WorkDir": "/var/lib/docker/overlay2/6168e5e9a57d684f9c5809e6e4722c73bc2434326d39e90cfcdefe0a1b84999d/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:b67d19e65ef653823ed62a5835399c610a40e8205c16f839c5cc567954fcf594",
"sha256:de1b802e9897894b1f7e78346beda84dce9ba1c5514f3d479d40bb553bc623f8",
"sha256:c2d3130eb3f6afd3ad600119c363e84f33b0d05837de48adf7b638bc66403397"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
返回的是一個json格式的信息,如果要獲取其中一項內容可使用-f來指定
docker inspect -f {{".Architecture"}}
amd64
5.使用history 命令查看鏡像歷史
例如,查看ubuntu: 14.04 鏡像的創建過程,可以使用如下命令:
docker history ubuntu:14.04 -- no-trunc
過長的命令會被自動截斷,可以使用-- no-trunc 選項來輸出完整命令。
6.搜尋鏡像
查找遠端倉庫鏡像,默認搜索官方倉庫鏡像
docker search --automated -s 10 redis
上述命令:查找自動創建評價爲10+帶redis關鍵字的鏡像
7.刪除鏡像
1.使用標籤刪除
命令格式爲 docker rmi IMAGE[IMAGE…],其中IMAGE可以爲標籤或ID
例如刪除redis:latest鏡像
docker rmi redis:latest
當多個標籤指向同一鏡像文件時,rmi命令只刪除該鏡像的指定標籤。當只有一個鏡像標籤時使用命令時需注意,此時會刪除鏡像文件。
2.使用鏡像ID刪除
當使用docker rmi 後面跟上了鏡像的ID,此時會先刪除所有指向該鏡像的標籤,然後刪除鏡像。但是當該鏡像創造的容器還存在時,鏡像是無法被刪除的。
如果想強行刪除鏡像可以使用 -f 參數強制刪除一個存在容器依賴的鏡像。但是不推薦這麼使用
docker rmi -f redis:4.0
正確做法是先找到依賴該鏡像的容器依次刪除,然後再執行docker rm 命令刪除鏡像。
8.創建鏡像
創建鏡像的方法主要有三種:基於已有鏡像的容器創建、基於本地模板
導入、基於 Dockerfile 創建。(Dockerfile 方法後續補充)
1. 基於已有鏡像的容器創建
在原有鏡像中進行改動後提交,其中51a551dea4f7爲容器ID.
docker commit -m'Add a new file' -a "lfc" 51a551dea4f7 test:0.1
子命令
·-a,--author="":作者信息;
·- c,--change=[]:提交的時候執行 Dockerfile指令,包括CMD|
ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR
等;
·-m,--message="":提交消息;
·- p,--pause=true:提交時暫停容器運行。
2. 基於本地模板導入
使用鏡像模版來創建,OPENVZ模板的下載地址爲http://openvz.org/Download/templates/precreated。
命令格式爲
docker import[OPTIONS]file|URL| [REPOSITORY[:TAG]]
例如下載Ubuntu模版壓縮包,之後用命令導入
cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
9.鏡像導出和載入
1.鏡像導出
docker save -o ubuntu_14.04.tar ubuntu:14.04
或 docker save nginx >/tmp/nginx.tar.gz
導出本地Ubuntu鏡像爲文件Ubuntu14,04.tar
2.鏡像載入
可以使用docker load將導出的tar文件導入到本地鏡像庫,例如
docker load --input ubuntu_14.04.tar
或:
docker load < ubuntu_14.04.tar
注:
另外 docker load 和 docker import都可以導入一個鏡像存儲文件, 區別:
docker import:丟棄了所有的歷史記錄和元數據信息,僅保存容器當時的快照狀態。在導入的時候可以重新制定標籤等元數據信息。
docker load:將保存完整記錄,體積較大。
10.上傳鏡像
使用docker push 命令上傳鏡像到倉庫,默認上傳到docker hub官方倉庫。
命令格式:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
例如將test鏡像添加新的標籤user/test:latest 然後用docker push 上傳鏡像。
docker tag test:latest user/test:latest
docker push user/test:latest
參考資料:Docker技術入門與實戰