1. 程式人生 > >Docker學習之鏡像操作

Docker學習之鏡像操作

執行 .tar.gz ini fab bin rust size 操作系統 ddb

使用Docker鏡像

以下都是Docker鏡像的一系列重要名操作,包括獲取、查看、搜索、刪除、創建、存出或載入、上傳等。可使用docker image help命令查看幫助。

1.獲取鏡像(pull)

  • 使用pull子命令下載鏡像
    格式為: docker [image] pull NAME[:TAG],其中,NAME是鏡像倉庫名稱,用以區分鏡像,
    TAG是鏡像的標簽,往往用來表示版本信息,如果不顯示指定TAG,則默認為latest標簽,這會下載倉庫中最新版本的鏡像。

    例如獲取一個centos系統的基礎鏡像可以使用如下的命令:

    $ docker pull centos
    sudo docker pull centos
    Using default tag: latest
    latest: Pulling from library/centos
    a02a4930cb5d: Pull complete 
    Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
    Status: Downloaded newer image for centos:latest

    鏡像文件一般由若幹層(layer)組成,每一層都對應一個唯一的id(完整的id包括256比特,64個十六進制字符組成)

    docker默認是從官方倉庫下載鏡像,官方的鏡像註冊服務器可省略。
    docker pull ubuntu:18.04命令相當於:
    docker pull registry.hub.docker.com/ubuntu:18.04

    如果從其他地址下載,需要填寫鏡像註冊服務器地址,例如從網易蜂巢的鏡像源來下載ubuntu18.04鏡像:
    text docker pull hub.c.163.com/public/ubuntu:18.04

    pull子命令支持的選項主要包括:
    text -a, --all-tags=true|false: 是否獲取鏡像中的所有鏡像,默認為否; --disable-content-trust: 取消鏡像的內容校驗,默認為真 --registry-mirror=proxy_url:指定鏡像代理服務地址(如:https://registry.docker-cn.com)

    使用centos鏡像創建一個容器,並在其中運行bash應用:

    $ docker run -it centos
    [root@5797962d59c1 /]# echo "Hello World"
    Hello World
    [root@5797962d59c1 /]#

2. 查看鏡像(images & tag & inspect & history)

使用Docker鏡像的images、tag、inspect和history子命令。

  • 使用images命令列出鏡像
    使用docker images或docker image ls命令,可以列出本地主機上已有鏡像的基本信息。

    $ sudo docker images 
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              latest              1e1148e4cc2c        3 months ago        202MB

    各字段詳細描述如下:
    REPOSITORY:來源於哪個倉庫,比如ubuntu表示ubuntu系列的基礎鏡像
    TAG:鏡像的標簽信息,比如18.04、latest表示不同的版本信息
    IMAGE ID:鏡像ID(唯一標識鏡像),如果兩個鏡像的ID相同,則它們指向同一個鏡像,只是具有不同標簽名。
    CREATE:創建時間,說明鏡像最後的最新時間
    SIZE:鏡像大小

  • 使用tag命令添加鏡像標簽

    $ sudo docker tag centos:latest mycentos:latest
    $ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              latest              1e1148e4cc2c        3 months ago        202MB
    mycentos            latest              1e1148e4cc2c        3 months ago        202MB  
  • 使用inspect命令查看詳細信息
    使用docker [image] inspect 命令可以獲取該鏡像的詳細信息,包括作者、適應架構、各層的數字摘要等。

    $ sudo docker inspect centos
    [
        {
            "Id": "sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb",
            "RepoTags": [
                "centos:latest"
            ],
            "RepoDigests": [
                "centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426"
            ],
            "Parent": "",
            "Comment": "",
            "Created": "2018-12-06T00:21:07.135655444Z",
            "Container": "1fdbb0fcc184eb795364f7aa5fdc00299d0a2b90d8e26b4696217c22da7f983f",
            "ContainerConfig": {
                ...
            },
            "DockerVersion": "17.06.2-ce",
            "Author": "",
            "Config": {
                ...
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 201779604,
            "VirtualSize": 201779604,
            "GraphDriver": {
                "Data": {
                    "MergedDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/merged",
                    "UpperDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/diff",
                    "WorkDir": "/var/lib/docker/overlay2/b46b82dcbe576848eb5ab37f99d47a6053ea31fab8561bc2fd80b3157a82f774/work"
                },
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]

    docker [image] inspect centos返回的是一個JSON格式的消息,如果只需要其中一項內容時,可以使用-f子命令指定,
    例如,獲取鏡像的Architecture:

    $ docker [image] inspect -f {{.Architecture}} centos
    amd64
  • 使用history命令查看鏡像歷史
    history子命令,可以查看鏡像各層的創建信息

    $ docker history centos
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT  
    e1148e4cc2c         3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                    
    <\missing>          3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
    <\missing>          3 months ago        /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

    可使用history子命令--no-trunc查看被截短的命令

3. 搜尋鏡像(search)

  • 使用search子命令搜索鏡像
    語法為:docker search [option] keyword。支持的命令選項可以通過docker search "-" + "TAB"提示補充。

    $ docker search [option] keyword

4. 刪除和清理鏡像(rmi & rm)

  • 使用標簽刪除鏡像
    使用docker rmi或docker image rm命令可以刪除鏡像,命令格式為docker rmi IMAGE [IMAGE...],其中IMAGE可以為標簽或ID

    $ docker rmi IMAGE [IMAGE...]
    $ docker image rm label IMAGE [IMAGE...]
    
    支持的選項有:
    -f, -force: 強制刪除鏡像,即使有容器依賴它
    -no-prune:  不要清理未帶標簽的父鏡像

    當同一個鏡像擁有多個標簽的時候,docker rmi命令只是刪除了該鏡像多個標簽中的指定標簽而已,並不影響鏡像文件。
    當鏡像只剩下一個標簽的時候,docker rmi命令會刪除這個鏡像文件的所有文件層

  • 使用鏡像ID來刪除鏡像
    先使用docker rm id刪除容器,然後再使用docker rmi id刪除鏡像。

    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    210a3d3375d4        ubuntu:18.04        "/bin/bash"         7 seconds ago       Exited (0) 3 seconds ago                       brave_bardeen
    
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              18.04               47b19964fb50        4 weeks ago         88.1MB
    
    $ docker rm 210a3d3375d4
    210a3d3375d4
    
    $ docker rmi 47b19964fb50
    Untagged: ubuntu:18.04
    Untagged: ubuntu@sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5b35a24b41a86077c650210
    Deleted: sha256:47b19964fb500f3158ae57f20d16d8784cc4af37c52c49d3b4f5bc5eede49541
    Deleted: sha256:d4c69838355b876cd3eb0d92b4ef27b1839f5b094a4eb1ad2a1d747dd5d6088f
    Deleted: sha256:1c29a32189d8f2738d0d99378dc0912c9f9d289b52fb698bdd6c1c8cd7a33727
    Deleted: sha256:d801a12f6af7beff367268f99607376584d8b2da656dcd8656973b7ad9779ab4
    Deleted: sha256:bebe7ce6215aee349bee5d67222abeb5c5a834bbeaa2f2f5d05363d9fd68db41

    當有容器運行時,使用docker -rmi id刪除容器是無法成功的,如果想強制刪除使用-f參數。一般推薦使用以上方法,
    先刪除鏡像對應的所有容器,然後再刪除鏡像。

  • 清除鏡像
    使用Docker一段時間後,系統中可異能遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,可以通過命令清理:

    docker image prune
    
    支持的選項有:
    -a, -all:刪除所有無用鏡像,不光是臨時鏡像;
    -filter filter:只清理復合給定過濾器的鏡像;
    -f, -force:強制刪除鏡像,而不進行提示確認;

5. 創建鏡像(commit & import & Dockerfile)

創建鏡像的方法有三種:基於已有的容器創建、基於本地模板導入、基於Dockerfile創建

  • 基於已有容器創建(commit子命令)

    該方法主要是使用docker commit命令

    命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    支持選項:
    -a, --author="": 作者信息;
    -c, --change=[]: 提交的時候執行Dokerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
    -m, --message="": 提交消息;
    -p, --pause=true: 提交時暫停容器運行
    
    實例如下:
    $ docker run -it ubuntu:18.04 /bin/bash
    root@25b742d78f24:/# touch test
    root@25b742d78f24:/# exit

    當前容器相比於原ubuntu:18.04鏡像,已經發生了改變,可以使用docker commit命令來提交為一個新的鏡像。

    $ docker [container] commit -m "Added a new file" -a "[email protected]"  25b742d78f24:1.0.0
    sha256:59fc18f43457af8ba1084094f1c7b33edb7a0d263409fb0912ba280fdd1a30ca
    
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    test                1.0.0               59fc18f43457        17 seconds ago      88.1MB
    ubuntu              18.04               47b19964fb50        4 weeks ago         88.1MB
    ubuntu              latest              47b19964fb50        4 weeks ago         88.1MB
  • 基於本地模板導入(import子命令)
    可以直接從一個操作系統模板文件導入一個鏡像,使用docker import命令,

    命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

    要直接導人一個鏡像,可以使用 OpenVZ 提供的模板來創建,或者用其他已導出的鏡像模板來創建 。
    OPENVZ 模板的下載地址為 http://openvz.org/Download/templates/precreated。

    例如,下載了 ubuntu-18.04 的模板壓縮包,之後使用以下命令導人即可:

    $ cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04

    然後查看新導入的鏡像,已經在本地存在了:

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              18.04               47b19964fb50        4 weeks ago         88.1MB
  • 基於Dockerfile創建
    基於Dockerfile創建是常見的方式。Dockerfile是一個文本文件,利用給定的指令描述基於某個父鏡像創建新鏡像的過程。
    見其他章節詳解。

6. 存出和載入鏡像(save & load)

Docker鏡像的save和load命令。

  • 存出鏡像
    如果要導出鏡像到本地文件,可以使用docker [image] save命令,支持 -o、-output string參數,導出鏡像到指定的文件中。

    導出本地的ubuntu:18.04鏡像到文件ubuntu_18.04.tar:
    ```text
    $ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    test 1.0.0 59fc18f43457 3 hours ago 88.1MB
    ubuntu 18.04 47b19964fb50 4 weeks ago 88.1MB
    ubuntu latest 47b19964fb50 4 weeks ago 88.1MB

    $ docker save -o ubuntu_18.04.tar ubuntu:18.04
    ```

    至此,可以將ubuntu_18.04.tar分享給別人。

  • 載入鏡像
    可以使用docker [image] load將導出的tar文件再導入到本地鏡像庫。支持-i、-input string選項,從指定文件中讀入鏡像內容。

    例如,從文件ubuntu_18.04.tar導入鏡像到本地鏡像列表,如下所示:

    $ docker load -i ubuntu_18.04.tar
    或者
    $ docker load < ubuntu_18.04.tar

    這將導入鏡像及其相關的元數據信息(包括標簽等)。導入成功後,可以使用docker images命令進行查看,與原鏡像一致。

7. 上傳鏡像(push)

  • 上傳鏡像
    可以使用docker [image] push 命令上傳鏡像到倉庫,默認上傳到Docker Hub官方倉庫(需要登錄)。

    命令格式:docker [image] push NAME[:TAG],或者上傳到非官方倉庫
             docker [image] push [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]        
    
    例如:用戶user上傳本地的test:latest鏡像,可以先添加新的標簽user/test:latest,然後用docker [image] push命令上傳鏡像:
    $ docker tag test:latest user/test:latest
    $ docker push user/test:latest

    第一次上傳時,會提示輸入登錄信息或進行註冊,之後登錄信息會記錄到本地~/.docker目錄下

Docker學習之鏡像操作