Docker學習筆記之使用鏡像


概述

在上一篇文章 Docker學習筆記之安裝 中,我們學習了docker在Centos7中的安裝,接下來我們學習Docker鏡像的使用。這一篇中,關於鏡像的使用所涉及的命令有:pull、images、ls、tag、inspect、search、rm、rmi、run、commit、import、build、save、load、push等命令,但由於篇幅有限,對於相關的命令的參數,無法一一介紹,有興趣的同學,需要自己在使用中細細的理解,對於有些理解有誤的,也請多多指正。



獲取鏡像:pull命令

鏡像是運行容器的前提,在官方的Docker Hub 網站上已經有幾十萬個鏡像可以供大家下載,打開后,簡單注冊一下登錄,即可,這里我們先學習pull子命令。可以通過 docker [image] pull 命令從Docker hub 鏡像下載到指定的鏡像,命令格式為:docker [image] pull name[:TAG] ,其中,[image]指的就是鏡像的意思,可以忽略,name 是鏡像在倉庫的名稱,[:TAG]是鏡像的標簽,一般來說指的是鏡像的版本信息,如果不輸入的話,則默認為:latest ,也可以指定TAG信息,下面以 ubuntu 為例:

[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker image pull ubuntu:14.04


查看鏡像:images 命令

這里下載了ubuntu 14.04 版本的鏡像,下載的過程,會有進度提示,下載完成后,可以通過命令 docker images 查看機器中現存在的docker

[root@localhost ~]# docker images

可以看到 紅色框住的鏡像為前面下載到的鏡像,我機器上之前有操作過其他的鏡像,顯示的列表信息會跟你們的不同。REPOSITORY 為鏡像的名稱,TAG 就是上面提到的 標簽(版本信息),IMAGE ID 為容器的ID,CREATED 為容器被創建的時間,我們可以看到 ubuntu 14:04 這版本的容器被創建的時間為 6 months ago ,並不是上面的下載到本地的時間。SIZE 為容器的大小

值得一說的是,如果有其他特殊的需要,我們也可以從指定的倉庫下載到指定的鏡像,例如:

[root@localhost ~]# docker pull hub.c.163.com/public/centos:6.5

這里pull 指定的 centos:6.5版本的鏡像,默認是從Docker hub 下載



運行鏡像:run命令

鏡像下載完成后,我們即可使用run命令運行鏡像,例如利用鏡像創建一個容器,在其中運行bash應用,執行打印命令:

[root@localhost ~]# docker run -it ubuntu:14.04 bash

說到run命令,我們這里也順便提一下Dockerfile文件,我們可以新建Dockerfile文件,用於將一些命令通過Dockerfile運行(不等於shell文件),用於構建自己的鏡像,比如:我們使用Dockerfile創建一個.Net Core 的Web項目的鏡像,然后運行,又或者是JAR的Web項目,這都是可以的。這里不詳細展開,將在在后續的文章中說明。

從上面的圖片,我們可以看到有 7f7c716106b6 的這樣標識,這個就是容器的ID,說明通過run進入了 ubuntu:14.04鏡像內部,並且可以通過參數i用於接收用戶的輸入,同進可以通過ps查看到鏡像里面,運行了 bash和ps 兩個程序,參數說明:
i:打開STDIN,用於控制台交互;
t:分配置tty設備,可以支持終端登錄,默認為false;


其他常用的參數有:
P:指定容器暴露的端口;
d:指定容器運行於前台還是后台,默認為false;
v:給容器掛載存儲卷,掛載到容器的某個目錄;
w:指定容器的工作目錄;

run的參數還有很多,這里就不一一說明了,需要大家使用的過程中慢慢體會。


添加鏡像標簽:tag 命令

為了方便在使用過程中的識別,常常需要使用到tag命令,該命令可以用來為本地鏡像任意添加新的標簽,例如:添加一個新的 myubuntu:latest鏡像標注:

[root@localhost ~]# docker tag ubuntu:latest myubuntu:latest

從上面的圖片中,我們可以看到,新增了 名稱為 myubuntu 的鏡像,但細心的同學,可能會發現 它的鏡像ID 為 825d55fb6340,這與 名稱 為 ubuntu TAG 為 latest 的鏡像ID 是一致的,這是什么原因?它們實際上指向了同一個鏡像文件,只是名稱不同而已,docker tag 命令添加標簽,實際上只是起到了類似鏈接的作用,而已並不是新增鏡像文件。


查看詳細信息:inspect命令

使用 docker [image] inspect 命令可以查看鏡像的詳細信息,包括制作者、適應架構、版本等、顯示出來的信息,默認是以JSON格式展示的。例如,查看 ubuntu:latest 的信息:

[root@localhost ~]# docker inspect ubuntu:latest

這里只截取部分信息的圖片,在不加其他參數的情況下,展示的信息類似上圖所示,但如果你只想顯示你想要的那部分信息,而且你也知道這個信息的位置(層級),那么,你可以使用 format 參數,只展示你想要的那部分信息,如:

[root@localhost ~]# docker inspect ubuntu:latest --format='{{.ContainerConfig.Hostname}}'

如上圖,便可以只展示 Hostname 的信息了。

搜索鏡像:search命令

可以通過search子命令搜索Docker Hub官方倉庫中的鏡像,用法為:docker search [option] keyword
有如下參數:
-f, --filter filter:過濾輸出內容;
--format string:格式化輸出內容;
--limit int:限制輸出結果個數,默認為25個;
--no-trunc:不截斷輸出結果;
例如,搜索官方的ubuntu鏡像:

[root@localhost ~]# docker search --filter=is-official=true ubuntu


刪除和清理:rmi、rm和prune 命令

接下來我們學習 rmi 命令刪除鏡像,命令格式為 docker rmi IMAGE [IMAGE], 其中 IMAGE 可以是標簽,也可以是 鏡像ID,刪除多個鏡像,則鏡像之間用空格分開,按順序逐個刪除,如其中有鏡像因其他原因無法刪除時,則停止刪除。
可選參數有:
-f, -force:強制刪除鏡像,即使是有容器依賴或使用它;
-no-prune:不要清理未帶標簽的父鏡像;

例如刪除 鏡像ID為 a7876479f1aa 的鏡像,可以使用 命令:

[root@localhost ~]# docker rmi a7876

如上圖所示 a7876 為鏡像ID a7876479f1aa 的前5個字符,在多個鏡像時,可以使用鏡像名稱中前幾個唯一識別鏡像名稱的部分字符即可,也可以使用 鏡像的名稱,如存在多個鏡像名稱相同的鏡像中,則需要加上TAG,
如:docker rmi ubuntu:14.04 ,如果TAG沒有指定,默認為 latest。


rm刪除容器。命令格式為 docker rm CONTAINER ID ,其中 CONTAINER ID 為容器的ID
它的參數有:
-f:強制刪除;
-l:移除容器間的網絡連接,而非容器本身;
-v:刪除與容器關聯的卷

為了刪除例子,我們先運行一個容器:

[root@localhost ~]# docker run -itd ubuntu:14.04 bash
a4de125a8ce69b89a1df51b8e38ecb05dd9b4d39ba3ee589bd2c7f01c4c515d9

然后,我們使用 docker ps 命令查看運行的容器:

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS                                                 NAMES
a4de125a8ce6   ubuntu:14.04   "bash"                   9 seconds ago   Up 8 seconds                                                          clever_hellman

現在,我們嘗試使用命令刪除容器:

[root@localhost ~]# docker rm a4de125a8ce6
Error response from daemon: You cannot remove a running container a4de125a8ce69b89a1df51b8e38ecb05dd9b4d39ba3ee589bd2c7f01c4c515d9. Stop the container before attempting removal or force remove

很顯然,這個容器已經在運行,我們無法正常刪除它,那么這個時候,想要刪除它,就必需要對它進行強制刪除了,命令如下:

[root@localhost ~]# docker rm -f a4de125a8ce6


說到刪除,這里也不得不說一下 **prune** 命令,它是用來刪除不再使用的 docker 對象的,什么意思?就是用於釋放一些可釋放而又沒有被釋放的資源,常用的用法有:

1、清理沒有使用的數據,包括鏡像數據,已經停止的容器

[root@localhost ~]# docker system prune

2、刪除所有未被 tag 標記和未被容器使用的鏡像:

docker image prune

3、刪除所有未被容器使用的鏡像:

docker image prune -a

4、刪除所有停止運行的容器:

docker container prune

5、刪除所有未被掛載的卷:

docker volume prune

6、刪除所有網絡:

docker network prune

創建鏡像:commit、import和build命令

1、基於已有的容器創建,命令格式為:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:tag]]
OPTIONS說明有:
-a, --author="":作者信息;
-c,--change=[]:提交的時候執行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
-m,--message="":提交信息;
-p,--pause=true:提交時暫停容器運行。

示例如下:

[root@localhost ~]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED         SIZE
ubuntu                                                18.04             f5cbed4244ba   13 days ago     63.2MB
[root@localhost ~]# docker run -itd f5cbed4244ba bash
6443da401f83f7ab1379047f2b78ac6b1a9a05d0cabc2e324177d1d6733b5dc7
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                 NAMES
6443da401f83   f5cbed4244ba   "bash"                   13 seconds ago   Up 11 seconds                                                         nostalgic_rosalind
[root@localhost ~]# docker commit -a "jlonghe" -m "Hello cnlbogs" 6443da401f83 cnblogs-ubuntu:v1
sha256:d5ffb9a720b2178cbc491768a49794f8bdf4afa9501bf31a7ae21e14b3ee64bb
[root@localhost ~]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED          SIZE
cnblogs-ubuntu                                        v1                d5ffb9a720b2   10 minutes ago   63.2MB
ubuntu                                                18.04             f5cbed4244ba   13 days ago      63.2MB


從上面的示例中,可以看到,首先以鏡像 ubuntu:18.04 為基礎,運行了一個ID為6443da401f83的容器,然后再以ID為6443da401f83的容器為基礎,通過commit 命令創建了一個名稱為 cnblogs-ubuntu 的容器。


2、基於本地模板的導入 可以通過網站 OpenVZ 提供的模板,導入鏡像,下載地址:https://download.openvz.org/template/precreated/,在這里,我選擇的是 ubuntu 14.04 的模板,下載地址:https://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz 首先 在宿主機上創建一個目錄(目錄換成自己的):
[root@localhost ~]# mkdir home/www/docker-test
[root@localhost ~]# cd /home/www/docker-test
[root@localhost docker-test]# wget https://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
--2022-04-19 10:42:28--  https://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
正在解析主機 download.openvz.org (download.openvz.org)... 130.117.225.97
正在連接 download.openvz.org (download.openvz.org)|130.117.225.97|:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:78421150 (75M) [application/x-gzip]
正在保存至: “ubuntu-14.04-x86_64-minimal.tar.gz”

100%[=======================================================================================================================================================================================================>] 78,421,150  6.99MB/s 用時 17s    

2022-04-19 10:42:46 (4.47 MB/s) - 已保存 “ubuntu-14.04-x86_64-minimal.tar.gz” [78421150/78421150])

[root@localhost docker-test]# ls
ubuntu-14.04-x86_64-minimal.tar.gz
[root@localhost docker-test]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:v14.04
sha256:2ebc9dbb347f5eda5519f81f1d4668a701b2e4a6b7ed18f1c89a4311a65eb95d
[root@localhost docker-test]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED          SIZE
ubuntu                                                v14.04            2ebc9dbb347f   12 seconds ago   215MB

通過上面的操作,可以可看到創建一個 名稱 ubuntu:v14.04 的鏡像(因為我本地存在 14.04 的鏡像,所在這里導入TAG為 v14.04 ,以免沖突),這里需要注意一下 docker import 后面是有一個 "-" 字符的。


3、基於Dockerfile文件的創建
基於Dockerfile創建是很常見的方式,Dockerfile是一個文本文本,沒有后綴名,利用編寫的指令描述基於父鏡創建新鏡像的過程。下面的示例為基於debian:stretch-slim鏡像安裝Python3環境,構建一個新的python:3鏡像:
在宿主機上指定的一個目錄下,創建 Dockerfile 文件,編輯 Dockerfile文件的內容如下:

FROM debian:stretch-slim

LABEL version="1.0" maintainer="jlonghe<jlonghe@mail.com>"

RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/lists/*

Dockerfile 中的 maintainer 的值,不要有空格,否則可能會報錯,執行如下命令:

[root@localhost python]# ls
Dockerfile
[root@localhost python]# docker build -t python:3.0 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM debian:stretch-slim
 ---> 431201ea8a27
Step 2/3 : LABEL version="1.0" maintainer="jlonghe<jlonghe@mail.com>"
 ---> Using cache
 ---> b9a89b4bbe71
Step 3/3 : RUN apt-get update &&     apt-get install -y python3 &&     apt-get clean &&     rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> b8da5b2aa3b4
Successfully built b8da5b2aa3b4
Successfully tagged python:3.0
[root@localhost python]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED             SIZE
python                                                3.0               b8da5b2aa3b4   1 minutes ago      95.3MB

這里需要注意的是 docker build -t python:3.0 . 命令后尾是有一個 點 的。


保存和載入鏡像:save 和 load 命令

save 命令。對於鏡像,我們可以通過保存鏡像的方式導出指定的鏡像,命令的格式為:docker [image] save 。該命令支持的參數有:
-o、 -output string:導出鏡像到指定的文件中。示例如下:

[root@localhost docker-test]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED             SIZE
ubuntu                                                v14.04            2ebc9dbb347f   About an hour ago   215MB
cnblogs-ubuntu                                        v1                d5ffb9a720b2   2 hours ago         63.2MB
[root@localhost docker-test]# ls
[root@localhost docker-test]# docker save -o ubuntu_14.04.tar 2ebc9dbb347f
[root@localhost docker-test]# ls
ubuntu_14.04.tar


load 命令。可以使用load命令,將導出的tar文件再導入到本地的鏡像庫中,命令格式為:docker [image] load 。
支持參數有:-i、 -input string 選項,從指定文件中載入鏡像庫。示例如下:

[root@localhost docker-test]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED         SIZE
ubuntu                                                v14.04            2ebc9dbb347f   3 hours ago     215MB
[root@localhost docker-test]# ls
ubuntu_14.04.tar
[root@localhost docker-test]# docker load < ubuntu_14.04.tar 
Loaded image ID: sha256:2ebc9dbb347f5eda5519f81f1d4668a701b2e4a6b7ed18f1c89a4311a65eb95d
[root@localhost docker-test]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED         SIZE
ubuntu                                                v14.04            2ebc9dbb347f   3 hours ago     215MB

從上面的執行結果來看,當本地的鏡像存在同一版本鏡像時,雖然docker提示載入成功,但細心查看,輸出的鏡像ID,實際是與前面的鏡像ID一致的,而且沒有載入的進度提示,因此鏡像並不會多次載入重。我們可以嘗試把原來的鏡像刪除后,再載入,輸出的信息,將會有所區別。

[root@localhost docker-test]# docker rmi 2ebc9dbb347f
Untagged: ubuntu:v14.04
Deleted: sha256:2ebc9dbb347f5eda5519f81f1d4668a701b2e4a6b7ed18f1c89a4311a65eb95d
Deleted: sha256:fd58c1324b91bf2a58fa7267ac56de93048f689454d0530cc17ac8b9cbb7ab9d
[root@localhost docker-test]# docker load < ubuntu_14.04.tar 
fd58c1324b91: Loading layer [==================================================>]  225.8MB/225.8MB
Loaded image ID: sha256:2ebc9dbb347f5eda5519f81f1d4668a701b2e4a6b7ed18f1c89a4311a65eb95d


上傳鏡像:push命令

接下來我們學習push命令,這個命令可以使我們在本地的鏡像上傳到Docker Hub的官方倉庫。
在操作之前,我們要在Docker 官方網站注冊一個賬號,注冊地址:https://hub.docker.com/ ,注冊完成后,我們可以通過注冊的賬號在控制台上登錄,然后再能上傳鏡像到我們在Docker官網的賬號下。

登錄的命令的格式如下:docker login -u USERNAME -p PASSWORD

對於本地的鏡像,在push之前,通常我們需要更改鏡像的名稱,例如,例如本機存在一個名稱為 ubuntu TAG 為 18.04 的鏡像,那么我們需要將名稱更改為 [USERNAME]/ubuntu:18.04,這樣子,才能在push的時候,上傳到Docker對應的用戶倉庫下,示例如下:

[root@localhost ~]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED         SIZE
ubuntu                                                18.04             f5cbed4244ba   13 days ago     63.2MB
[root@localhost ~]# docker tag ubuntu:18.04 jlonghe/ubuntu:18.04
[root@localhost ~]# docker images
REPOSITORY                                            TAG               IMAGE ID       CREATED         SIZE
ubuntu                                                latest            825d55fb6340   13 days ago     72.8MB
jlonghe/ubuntu                                        18.04             f5cbed4244ba   13 days ago     63.2MB
ubuntu                                                18.04             f5cbed4244ba   13 days ago     63.2MB
[root@localhost ~]# docker push jlonghe/ubuntu:18.04
The push refers to repository [docker.io/jlonghe/ubuntu]
95c443da13bf: Mounted from library/ubuntu 
18.04: digest: sha256:512274f1739676880585e70eea6a883db7b6d92841b02647b6c92b478356572c size: 529

上傳成功后,在Docker Hub 會有對應的鏡像記錄,如下圖所示:


感謝您能看到這里,在下一篇 Docker學習筆記之容器的操作(1),我們將學習Docker的相關操作。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM