程式語言初學者 Docker 入門第三章 —— 映像檔 Image
Docker 執行容器前需要本地端具備相對應的映像檔,如果映像檔未存在本地端,Docker 會嘗試先從預設映像檔倉庫下載,使用者也可以透過設定,使用自訂的映像檔倉庫
取得映像檔
可以在 Docker Hub 找到相對應的 imagesdocker 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
查看 image 映像檔訊息
可以看到剛拉下來的 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' 指令
查看詳細資料
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 種
- 基於 現有映像檔產生的容器來建立
- 基於 Linux 容器 LXC 範例匯入
- 基於 Dockerfile 來建立
1. 現有映像檔產生的容器來建立
用 docker commit
-
啟動映像檔,在裡面進行修改操作
docker run -it ubuntu:14.04 /bin/bash
-
建立檔案
touch test
-
離開 exit
-
記住 Container ID b72bda722f22
-
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
Comments
Post a Comment