docker入門之鏡像

docker鏡像類似于虛擬機鏡像,可以將它理解為一個只讀的模板。例如,一個鏡像可以包含一個基本的操作系統,里面安裝了tomcat(或者其它軟件),我們把它稱為tomcat鏡像。鏡像是創建docker容器的基礎。通過版本管理和增量的文件系統,docker提供了十分簡單的機制來創建和更新的現有的鏡像,也可以從鏡像倉庫里pull鏡像,就像git pull代碼一樣。

獲取鏡像

鏡像是容器運行的前提條件,官方Docker Hub 鏡像倉庫提供了10W+個鏡像提供大家開放下載。我們可以直接使用docker pull命令直接從Docker Hub鏡像源下載鏡像
命令格式:docker pull name:tagname為鏡像名稱,tag為鏡像的標簽(通常用來表示版本信息)
獲取一個Ubuntu 14.04系統鏡像可以使用docker pull ubuntu:14.04

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

如果不指定tag,則默認會選擇latest標簽,下載倉庫中最新版本的鏡像。
嚴格地講倉庫名稱還要添加鏡像地址(即registry,注冊服務器)為前綴,我們使用的是官方Docker Hub,所以前綴可以省略,完整命令為docker pull docker.io/library/ubuntu:14.04
如果下載非官方的鏡像,倉庫名稱前要指定完整的倉庫地址。例如我們從網易的鏡像源下載ubuntu 14.04 正確命令為

docker pull hub.c.163.com/ubuntu:latest

pull子命令支持的選項主要包括-a, --all-tags=true|false 是否獲取從那個庫中的所有鏡像,默認為false,具體的選項可以通過 docker pull --help 命令查看。有了鏡像后,我們就可以以這個鏡像為基礎啟動一個容器來運行。以上面的 ubuntu:14.04 為例,如果我們打算啟動里面的 bash 并且進行交互式操作的話,可以執行下面的命令。

[root@localhost ~]# docker run -it --rm ubuntu:14.04 bash
root@21762fe64d8f:/# cat /etc/os-release 
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@21762fe64d8f:/# exit
exit
[root@localhost ~]# 

docker run 就是運行容器的命令,我們這里簡要的說明一下上面用到的參數。
-it:這是兩個參數,一個是 -i:交互式操作,一個是 -t 終端。我們這里打算進入 bash 執行一些命令并查看返回結果,因此我們需要交互式終端。--rm:這個參數是說容器退出后隨之將其刪除。默認情況下,為了排障需求,退出的容器并不會立即刪除,除非手動 docker rm 我們這里只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。
ubuntu:14.04:這是指用 ubuntu:14.04 鏡像為基礎來啟動容器。
bash:放在鏡像名后的命令,這里我們希望有個交互式 Shell,因此用的是 bash。
進入容器后,我們可以在 Shell 下操作,執行任何所需的命令。這里,我們執行了 cat /etc/os-release,這是 Linux 常用的查看當前系統版本的命令,從返回的結果可以看到容器內是 Ubuntu 14.04.5 LTS 系統。最后我們通過 exit 退出了這個容器。

查看鏡像信息

使用docker images命令可以查看本地已存在鏡像
[root@localhost ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    14.04               ccc7a11d65b1        4 weeks ago         120.1 MB
docker.io/ubuntu    latest              ccc7a11d65b1        4 weeks ago         120.1 MB

在列出的信息中有5個字段,分別是鏡像來自哪個倉庫、標簽、鏡像ID、創建時間。

  • docker images -a列出所有鏡像文件
  • docker images -q僅列出鏡像ID
  • docker images -f dangling=true列出沒有別使用的鏡像
使用docker tag命令添加鏡像標簽
[root@localhost ~]# docker tag ubuntu:14.04 ubuntu:14

然后使用docker images查看鏡像,多了一個擁有ubuntu:14標簽的鏡像

[root@localhost ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    14                  ccc7a11d65b1        4 weeks ago         120.1 MB
docker.io/ubuntu    14.04               ccc7a11d65b1        4 weeks ago         120.1 MB
docker.io/ubuntu    latest              ccc7a11d65b1        4 weeks ago         120.1 MB
使用docker inspect命令查看鏡像詳細信息。包括制作者、適應架構、各層的數字摘要等。信息比較多就不放出來了
使用docker history name:tag查看鏡像歷史

比如查看ubuntu:latest鏡像的創建過程

[root@yangjian06 wso2am]# docker history ubuntu:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
ccc7a11d65b1        5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           5 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'doc   7 B                 
<missing>           5 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   2.759 kB            
<missing>           5 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B                 
<missing>           5 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /u   745 B               
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:39d3593ea220e686d5   120.1 MB  

過長的命令被截斷了,可以使用--no-trunc選項輸出完整命令

搜索鏡像

使用docker search命令可以搜索鏡像庫里中共享的鏡像,默認搜索官方倉庫的鏡像。比如我們搜索nginx鏡像

[root@yangjian06 wso2am]# docker search -s 40 nginx
INDEX       NAME                                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/nginx                                    Official build of Nginx.                        6865      [OK]       
docker.io   docker.io/jwilder/nginx-proxy                      Automated Nginx reverse proxy for docker c...   1124                 [OK]
docker.io   docker.io/richarvey/nginx-php-fpm                  Container running Nginx + PHP-FPM capable ...   439                  [OK]
docker.io   docker.io/jrcs/letsencrypt-nginx-proxy-companion   LetsEncrypt container to use with nginx as...   223                  [OK]
docker.io   docker.io/kong                                     Open-source Microservice & API Management ...   112       [OK]       
docker.io   docker.io/webdevops/php-nginx                      Nginx with PHP-FPM                              90                   [OK]
docker.io   docker.io/kitematic/hello-world-nginx              A light-weight nginx container that demons...   85                   

輸出結果將按照星級評級進行排訓,-s參數表示星級40以上的nginx鏡像,支持的參數還有

  • --automated=true|false 僅顯示自動創建的鏡像,默認為否
  • --no-trunc=true|false 輸出信息不截斷提示,默認為否

刪除鏡像

使用標簽刪除鏡像,命令docker rmi可以刪除鏡像

例如我們刪除ubuntu:14鏡像

[root@localhost ~]# docker rmi ubuntu:14
Untagged: ubuntu:14

如果該鏡像有多個標簽的話刪除的只是標簽并不會刪除鏡像。如果只有一個標簽的話docker rmi命令會徹底刪除鏡像。

使用id刪除鏡像

使用命令docker rmi ID命令可以刪除鏡像

當有該鏡像創建的容器存在時,鏡像是無法刪除的。如果要強行刪除的話可以使用docker rmi -f ID

創建鏡像

創建鏡像的方法主要有三種:基于已有鏡像的容器創建,基于本地模板導入,基于dockerfile創建

基于已有鏡像的容器創建

該方法主要是用docker commit命令創建鏡像,主要參數為

  • -a,--auther="" 作者信息
  • -m, --message="" 提交信息

首先我們啟動一個nginx鏡像,然后進入容器,創建一個test文件,退出。

[root@localhost ~]# docker run -d -p 80:80 nginx
00fb093d0ec2044f6a5d62fe2aa64c487e427456bd53cb6dc8b6462be4e25167
[root@localhost ~]# docker exec -it 00fb093d0 bash 
root@00fb093d0ec2:/# touch test
root@00fb093d0ec2:/# exit
[root@localhost ~]#

這時容器已發生了改變,使用docker commit命令創建一個新的鏡像

[root@localhost ~]# docker commit -a rgl -m "add a new file"    00fb093d0ec2  test:0.1
sha256:bcaa64525c2bde4e1329f7b28bc2c98b2947f83a5cb0efff6e9d968a85618930

創建成功的話會返回新鏡像的id。

存出和載入鏡像

如果要存出鏡像到本地文件,可以使用docker save命令

[root@localhost ~]# docker save -o nginx.tar nginx:latest

這樣就可以通過復制該鏡像文件分享給其他人
如果要把鏡像文件載入到本地鏡像庫,使用命令docker load

[root@localhost ~]# docker load --input nginx.tar 
Loaded image: nginx:latest

或者

[root@localhost ~]# docker load < nginx.tar 
Loaded image: nginx:latest

上傳鏡像

使用docker push命令上傳鏡像到倉庫,默認上傳到Docker官方倉庫(需要登錄)。例如我們自制的nginx:1.10.0鏡像上傳,首先我們要添加新的標簽user/nginx:1.10.0 ,然后用docker push上傳鏡像,user改成你的用戶名。

[root@localhost ~]# docker push user/nginx:1.10.0
The push refers to a repository [docker.io/user/nginx]
110566462efa: Mounted from library/nginx 
305e2b6ef454: Mounted from library/nginx 
1.10.0: digest: sha256:d8565c25b654da69bc9b837a0dee713c988f0276e90564aa8fd12ebf4c2ff11e size: 948
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容