docker隨筆

jysli發表於2024-05-27

目錄
  • docker
    • 一、docker簡介
    • 二、docker的基礎組成部分
      • 2.1 images
        • 2.1.1 分層儲存
      • 2.2 container
      • 2.3 repository
    • 三、docker映象使用
      • 3.1 映象獲取
      • 3.2 映象顯示
      • 3.3 映象刪除

docker

一、docker簡介

Docker 是一個開源的容器化平臺,它徹底改變了應用程式的開發、部署和執行方式。透過 Docker,開發者可以將應用程式及其所有依賴打包進一個輕量級、可移植的容器中。這些容器包含了執行應用程式所需的一切,從程式碼、執行時環境、庫到配置檔案,確保了應用在不同環境間的一致性,無論是開發者的桌面、測試伺服器還是最終的生產環境。

二、docker的基礎組成部分

  • images
  • container
  • repository

2.1 images

Docker 映象 是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象 不包含 任何動態資料,其內容在構建之後也不會被改變。

docker映象透過分層儲存的方式進行儲存。

2.1.1 分層儲存

docker image 構建是一層層的構建,每一層相對來說都是獨立。每一層構建完成後都不會在發生改變,第一層構建完成,第二層刪除第一層,事實上並不會真的刪除,相當於對第一層進行一個標記,不會使用第一層。分層儲存使得image的構建和服用都變得更加容易些。

2.2 container

container 與image的關係,image是靜態的,container是動態的。從java 物件的角度來看,image相當於 java中的類,而container相當於 例項後的物件。container可以進行刪除、停止等操作。對於container,同樣是採用了分層儲存,容器的實質是程序,但與直接在宿主執行的程序不同,容器程序執行於屬於自己的獨立的 [名稱空間 。容器擁有自己的 root 檔案系統(根目錄檔案系統)、自己的網路配置、自己的程序空間,甚至自己的使用者 ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來。對於使用container過程中產生的資料,最好是建立資料卷或者與宿主機目錄進行繫結,不要放在容器的儲存層中。

2.3 repository

就像一個image託管平臺,可以進行image上傳和下載。

三、docker映象使用

  • 映象獲取
  • 列出映象
  • 刪除映象

3.1 映象獲取

可以從docker hub 中獲取官方製作的image

透過git pull 指令獲取image 使用 指令+ --help 可以獲得提示文件

root@lss-virtual-machine:~# docker pull --help
# 獲得提示文件
Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 這裡還可以指定 從哪一個registry[registryaddr ip:port]中獲取image,如果沒有制定,則預設是docker hub
Download an image from a registry
# 通常是從docker hub中獲取
Aliases:
  docker image pull, docker pull
# 這兩個指令等價
Options:
  -a, --all-tags                Download all tagged images in the repository
  # 獲取一個映象的各個版本,如果使用的話 可能會下載大量的image,佔用硬碟空間
      --disable-content-trust   Skip image verification (default true)
  # 不進行安全性驗證
      --platform string         Set platform if server is multi-platform capable
  # 制定系統的架構
-q, --quiet                   Suppress verbose output
  # 讓輸出的日誌資訊更簡潔
  
---------------------------------拉去mysql image--------------------------------
root@lss-virtual-machine:~# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
# 從這裡也可以看出 image 是分層儲存的。

3.2 映象顯示

映象下載後可以透過docker images 命令檢視頂層映象,包括映象id、映象名、映象佔用的空間。具體的使用如下

root@lss-virtual-machine:~# docker image ls --help 

Usage:  docker image ls [OPTIONS] [REPOSITORY[:TAG]]

List images

Aliases:
  docker image ls, docker image list, docker images
# 列舉出映象的 命令別名
Options:
  -a, --all             Show all images (default hides intermediate images)
  # 會顯示 非頂層的image (image採用分層儲存)
      --digests         Show digests
      # 同時會顯示摘要資訊 加密方法
  -f, --filter filter   Filter output based on conditions provided
      --format string   Format output using a custom template:
      # 可以對於顯示的屬性進行格式化
                        'table':            Print output in table format with column headers (default)
                        'table TEMPLATE':   Print output in table format using the given Go template
                        'json':             Print in JSON format
                        'TEMPLATE':         Print output using the given Go template.
                        Refer to https://docs.docker.com/go/formatting/ for more information about formatting
                        output with templates
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs
  # 只顯示image id
  
  -----------------------------------docker images示例----------------------------------
  root@lss-virtual-machine:~# docker image ls -a
REPOSITORY                                                 TAG        IMAGE ID       CREATED         SIZE
redis                                                      latest     1a83fd5edeed   4 days ago      117MB
quay.io/minio/minio                                        latest     49c3911c1fe9   2 weeks ago     160MB
hello-world                                                latest     d2c94e258dcb   13 months ago   13.3kB
ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice   vuepress   5ea504439e5d   23 months ago   46MB
mysql                                                      latest     3218b38490ce   2 years ago     516MB
nacos/nacos-server                                         latest     bdf60dc2ada3   2 years ago     1.05GB
# 分別會顯示 image_name version image_id created_time size


------------------------------------------進行格式化輸出設定-----------------------------------------

root@lss-virtual-machine:~# docker image ls --format "table {{.Repository}}\t {{.ID}}\t{{.Size}}"
REPOSITORY                                                  IMAGE ID       SIZE
redis                                                       1a83fd5edeed   117MB
quay.io/minio/minio                                         49c3911c1fe9   160MB
hello-world                                                 d2c94e258dcb   13.3kB
ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice    5ea504439e5d   46MB
mysql                                                       3218b38490ce   516MB
nacos/nacos-server                                          bdf60dc2ada3   1.05GB

# table 模板語法 docker image list --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 常用的模板欄位
#這裡是一些常用的模板欄位:
#.Repository: 映象的倉庫名
#.Tag: 映象的標籤
#.ID: 映象的短ID
#.CreatedAt: 映象建立時間
#.Size: 映象大小
# 

3.3 映象刪除

關於映象刪除可以使用docker image rm 相應的用法如下

root@lss-virtual-machine:~# docker image rm --help

Usage:  docker image rm [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Aliases:
  docker image rm, docker image remove, docker rmi
# 命令別名
Options:
  -f, --force      Force removal of the image
  # 強制刪除
      --no-prune   Do not delete untagged parents
 	# 不刪除 沒有打標籤的 父映象(標籤:相當於給映象起一個別名,一個映象可以有多個標籤)

映象刪除

root@lss-virtual-machine:~# docker image rm -f  hello-world:latest 
# 用於存在容器引用該映象 所以需要-f 強制刪除
Untagged: hello-world:latest
Untagged: hello-world@sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a

從刪除的日誌中可以看出,刪除一個映象需要先去除標籤,在進行刪除。這樣做的原因是當刪除了所有的tag這個時候該映象沒用了存在的意義(在docker中,是透過tag來引用和識別一個映象的),同時也會觸發delete這個動作,才可以去刪除這個映象。刪除映象可以透過 摘要資訊和image id 或者 image name