Docker-學習一(鏡像基本操作)

內容提要

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

dockerImages.png
在列出的信息中,可以看到的信息:

  • 來自於哪個倉庫,比如 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關鍵字的鏡像
dockerSearch.png

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技術入門與實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章