程式語言初學者 Docker 入門第三章 —— 映像檔 Image

Docker 執行容器前需要本地端具備相對應的映像檔,如果映像檔未存在本地端,Docker 會嘗試先從預設映像檔倉庫下載,使用者也可以透過設定,使用自訂的映像檔倉庫

取得映像檔

可以在 Docker Hub 找到相對應的 images
docker pull NAME[:TAG]

NAME 是映像檔倉庫名稱; TAG 是映像檔的標籤(通常用來表示版本資訊,不寫就是預設:latest)

  • 官方的 image 在 pull 時可以不寫 registry

$ docker pull ubuntu 
# 完整指令
$ docker pull registry.hub.docker.com/ubuntu:14.04

registry(倉庫位址 docker hub IP):registry.hub.docker.com/

>>> Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest

  • 非官方的 image 要寫 registry

docker pull gcr.io/tensorflow/tensorflow:latest-gpu

Google Container Registry: gcr.io/tensorflow/tensorflow

-a, —all-tags=true|false:是否取得倉庫中的所有標籤之映像檔,default = false

實戰

取得映像檔 pull image

╰─$ docker pull postgres

拉取 ubuntu image
╰─$ docker pull ubuntu

查看 image 映像檔訊息

docker images 指令
╰─$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f825f99d3d8a 8 days ago 101MB
postgres latest 6c9aa6ecd71d 3 weeks ago 456MB

可以看到剛拉下來的 postgres image 跟 ubuntu images

使用 tag 命令增加映像檔標籤

docker tag ubuntu:latest myubuntu:latest
myubuntu     latest       7e0aa2d69a15   6 weeks ago    72.7MB
ubuntu       latest       7e0aa2d69a15   6 weeks ago    72.7MB ID 一樣

利用 ubuntu 映像檔建立容器,用運 bash 執行 echo 'hello world' 指令

// 從上面可以看到 ubuntu 的 IMAGE ID 為 f825f99d3d8a
// 用 run 指令啟動 container 並用 -it 進入背景模式執行,執行完畢後關閉 container
╰─$ docker run -it f825f99d3d8a echo 'hello world'
hello world
// 想直接用 image name 執行也可以
╰─$ docker run -it ubuntu echo 'hello world'
hello world

查看詳細資料

docker inspect ubuntu
[
    {
        "Id": "sha256:7e0aa2d69a153215c790488ed1fcec162015e973e49962d438e18249d16fa9bd",
        "RepoTags": [
            "myubuntu:latest",
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-04-23T22:21:37.49442735Z",
        "Container": "8be4461fbc3e2d9db869e63a5e140b10a085b1799c12e8a83b32aba9344eba78",
        "ContainerConfig": {
            "Hostname": "8be4461fbc3e",
            "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:9d6065aabb67e06ae6b6db4f0ed5ac83f5e83a147fa5eb32b414d10583f6ce2d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "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:9d6065aabb67e06ae6b6db4f0ed5ac83f5e83a147fa5eb32b414d10583f6ce2d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 72704716,
        "VirtualSize": 72704716,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/eb167f3c0a443141bab098d044b9e4273ee24f722837c62a1ac274cc3513c413/diff:/var/lib/docker/overlay2/68b823d3a0626bfe7704ffb8539b4ad923bc6d7933d3aeb5ceadaddf9816ac68/diff",
                "MergedDir": "/var/lib/docker/overlay2/a39563fdca4287f7dc32aaee9355713493192ad820d999cc593d4327dcb5f620/merged",
                "UpperDir": "/var/lib/docker/overlay2/a39563fdca4287f7dc32aaee9355713493192ad820d999cc593d4327dcb5f620/diff",
                "WorkDir": "/var/lib/docker/overlay2/a39563fdca4287f7dc32aaee9355713493192ad820d999cc593d4327dcb5f620/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439",
                "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107",
                "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"
            ]
        },
        "Metadata": {
            "LastTagTime": "2021-06-07T21:27:02.525910923+08:00"
        }
    }
]

看其中一項資料

docker inspect ubuntu -f {{".DockerVersion"}}

搜尋映像檔

docker search nginx

預設收尋 Docker Hub 包含 nginx 的 image, 可以用 docker search --help 查看更多

刪除映像檔

  • 標籤 (有多個相同 image 時,會先刪除其中一個標籤,但是當標籤只剩一個,會徹底刪掉 )

    docker rmi myubuntu:latest
    
  • 映像檔 ID (刪除所有指向該映像檔的標籤,然後刪除該檔案本身)

    docker rmi 13b66b487594 
    

ℹ️ 當該映像檔建立的容器存在時,映像檔預設是無法被刪除的,可以用 docker ps -a 查看 如果要強制刪除 

docker rmi -f ubuntu:14.04

docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS  docker ps -a                      PORTS     NAMES
3bb803d46960   ubuntu:14.04   "/bin/bash"              21 seconds ago   Exited (0) 4 seconds ago                sad_golick
063108c52641   ubuntu:14.04   "/bin/bash"              35 seconds ago   Exited (0) 35 seconds ago               fervent_gauss
3e97a5f01852   ubuntu         "/bin/bash"              25 minutes ago   Exited (0) 25 minutes ago               pedantic_hodgkin
d3cc1bc5d3e4   ubuntu         "/bin/bash"              27 minutes ago   Exited (0) 27 minutes ago               gifted_mayer
b82b4cb59125   7e0aa2d69a15   "/bin/bash"              27 minutes ago   Exited (127) 27 minutes ago             pedantic_mclean
29d1a7355c84   ubuntu         "/bin/bash"              13 hours ago     Exited (127) 13 hours ago               busy_chatelet
8af6dec29ebc   nginx          "/docker-entrypoint.…"   13 hours ago     Exited (0) 13 hours ago                 nostalgic_sinoussi
5f392441e864   nginx          "/docker-entrypoint.…"   13 hours ago     Exited (0) 13 hours ago                 ecstatic_margulis
782368f61dc7   nginx          "/docker-entrypoint.…"   6 days ago       Exited (0) 5 days ago                   webserver

通常先刪除相依於該映像檔的所有容器,再刪除映像檔

docker rm 3bb803d46960
docker rm 063108c52641
docker rmi 13b66b487594

建立映像檔

方式有 3 種

  1. 基於 現有映像檔產生的容器來建立
  2. 基於 Linux 容器 LXC 範例匯入
  3. 基於 Dockerfile 來建立

1. 現有映像檔產生的容器來建立

用 docker commit

  1. 啟動映像檔,在裡面進行修改操作

    docker run -it ubuntu:14.04 /bin/bash
    
  2. 建立檔案

    touch test
    
  3. 離開 exit

  4. 記住 Container ID b72bda722f22

  5. commit

    docker commit -m "add: test file" -a "Docker NEWbee" b72bda722f22 test:0.1
    

    會回傳新建映像檔 ID

    sha256:846886761e0ce84a2457ac606f9eb423e97d6b551d74a575e422d453798fceee
    

    查看 docker images

    REPOSITORY   TAG          IMAGE ID       CREATED              SIZE
    test         0.1          846886761e0c   About a minute ago   197MB
    

2. Linux 容器 LXC 範例匯入

直接從一個作業系統範本檔匯入一個映像檔

可以使用 OpenVZ 提供的飯本來建立,或其他已經匯出的映像檔飯本來建立

儲存和載入

docker save -o ubuntu_14.04.tar ubuntu:14.04

將本機上的 ubuntu:14.04 儲存為 ubuntu_14.04.tar (存在當前目錄)

從壓縮檔載入映像檔到本機

docker load --input ubuntu_14.04.tar or docker load < ubuntu_14.04.tar

上傳映像檔

docker push ubuntu:latest

3. 使用 Dockerfile 建立映像檔(見十章)

Comments

Popular posts from this blog

《 Imgproxy 使用分析一:圖片下載速度優化分析:Akamai CDN vs Imgproxy 效能比較》

《 Akamai + S3 與 CloudFront + Imgproxy + S3 使用分析二:壓縮圖片設計流程:檔案大小 vs 載入時間的權衡》

程式語言初學者 Docker 入門第二章 —— 安裝與驗證 (Mac)