1. 程式人生 > >Docker映象的獲取與刪除

Docker映象的獲取與刪除

Docker執行容器前需要本地存在對應的映象,如果映象不存在本地,Docker會嘗試先從預設映象倉庫下載(預設使用Dicker Hub公共註冊伺服器中的倉庫),使用者也可以通過配置,使用自定義的映象倉庫。

獲取映象

映象是Docker執行容器的前提。 可以使用docker pull命令從網路上下載映象。該命令的格式為:

docker pull NAME[:TAG]

對於Docker映象來說,如果不顯示地制定TAG,則預設會選擇latest標籤,即下載倉庫中的最新版本的映象。 如果要獲取一個ubuntu映象,可以:

sudo docker pull ubuntu

這樣,便會從Docker的Ubuntu倉庫中下載一個最新的Ubuntu作業系統映象,也可以下載制定標籤的映象,比如下載14.04標籤的映象:

sudo docker pull ubuntu:14.04

上面的命令都相當於sudo docker pull registry.hub.docker.com/ubuntu:latest命令,即從預設的註冊伺服器registry.hub.docker.com中的ubuntu倉庫下載標記為lastest的映象。 當然,也可以選擇其他註冊伺服器的倉庫下載,此時只需要在倉庫前制定完整倉庫註冊伺服器地址,例如從DockerPool社群的映象源下載最新ubuntu:

sudo docker pull dl.dockerpool.com:5000/ubuntu

在下載過程中可以看到映象檔案一般是由若干層組成,行首是像e118faab2e16這樣的各層ID,下載過程中會獲取並輸出映象的各層資訊:

latest: Pulling from ubuntu
e118faab2e16: Downloading
7e2c5c55ef2c: Download complete 
e04c66a223c4: Download complete 
fa81ed084842: Download complete

層(Layer)其實是AUFS(Advanced Union File System,一種聯合檔案系統)中的重要概念,是實現增量儲存與更新的基礎。 在本地有了這個映象之後便可以使用,生成容器了,比如在這個ubuntu映象上生成一個容器,在其中執行bash應用:

sudo docker run -t -i ubuntu /bin/bash
[email protected]
:/#

這就是相當於用ubuntu這個映象建立了一個容器,並且你已經在這個容器裡面了,在這裡,你完全可以和使用普通的ubuntu系統一樣(可以認識為這個映象生成的虛擬機器,不過所有同類容器只佔有自身資料的大小,而映象部分共用),包括各種命令,甚至安裝軟體。

檢視映象資訊

使用docker images命令可以列出本地主機上已有的映象:

sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              fa81ed084842        3 days ago          188.3 MB

再勵出的資訊中分別是來自那個倉庫,比如ubuntu倉庫,映象標籤,映象ID(唯一),建立時間,映象大小。 為了管理方便,還可以使用docker tag命令為本地映象新增新的標籤,比如新增:

sudo docker tag pull dl.dockerpool.com:5000/ubuntu:lastest ubuntu:lastest

然後就會多出一個標籤為ubuntu:latest的新映象。 使用docker inspect [映象ID]可以獲取該映象的詳細資訊:

sudo docker inspect fa81ed084842
[{
    "Architecture": "amd64",
    "Author": "",
    "Comment": "",
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/bash"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": null,
        "Env": null,
        "ExposedPorts": null,
        "Hostname": "706cb4504c90",
        "Image": "e04c66a223c45a6247237510c40117cef92acb0a4355f1ba90580ef6274b490d",
        "Labels": {},
        "MacAddress": "",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": null,
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": ""
    },
    "Container": "ba8570386ba189dc1af092e141415fbf522e38915b991d6ac5d682c51f42c13f",
    "ContainerConfig": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) CMD [\"/bin/bash\"]"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": null,
        "Env": null,
        "ExposedPorts": null,
        "Hostname": "706cb4504c90",
        "Image": "e04c66a223c45a6247237510c40117cef92acb0a4355f1ba90580ef6274b490d",
        "Labels": {},
        "MacAddress": "",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": null,
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": ""
    },
    "Created": "2015-06-01T00:00:32.983571589Z",
    "DockerVersion": "1.6.0",
    "Id": "fa81ed084842076d1b39b56d084d99ec0011cd4a5ade1056be359486a8b213e4",
    "Os": "linux",
    "Parent": "e04c66a223c45a6247237510c40117cef92acb0a4355f1ba90580ef6274b490d",
    "Size": 0,
    "VirtualSize": 188281989
}
]

搜尋映象

可以使用docker search命令搜尋映象,比如搜尋帶mysql關鍵字的映象如下所示:

sudo docker search mysql
NAME                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                        MySQL is a widely used, open-source relati...   735       [OK]       
tutum/mysql                  MySQL Server image - listens in port 3306....   122                  [OK]
orchardup/mysql                                                              37                   [OK]
centurylink/mysql            Image containing mysql. Optimized to be li...   23                   [OK]
mysql/mysql-server           Optimized MySQL Server Docker images. Crea...   17                   [OK]
wnameless/mysql-phpmyadmin   MySQL + phpMyAdmin https://index.docker.io...   15                   [OK]
google/mysql                 MySQL server for Google Compute Engine          13                   [OK]
sameersbn/mysql                                                              11                   [OK]
ioggstream/mysql             MySQL Image with Master-Slave replication       5                    [OK]
appcontainers/mysql          CentOS 6.6 based Customizable MySQL 5.5 Co...   3                    [OK]
alreece45/phusion-mysql      Simple MySQL container with auto-creating ...   2                    [OK]
azukiapp/mysql               Docker image to run MySQL by Azuki - http:...   2                    [OK]
jdeathe/centos-ssh-mysql     CentOS-6 6.6 x86_64 / MySQL.                    2                    [OK]
frodenas/mysql               A Docker Image for MySQL                        1                    [OK]
phpmentors/mysql             MySQL server image                              1                    [OK]
lec00q/mysql                 A docker image for running a mysql server ...   0                    [OK]
jmoati/mysql                                                                 0                    [OK]
marvambass/mysql             MySQL Server based on Ubuntu 14.04              0                    [OK]
learninglayers/mysql                                                         0                    [OK]
cloyne/mysql                                                                 0                    [OK]
thomaswelton/mysql                                                           0                    [OK]
ahmet2mir/mysql              This is a Debian based image with MySQL se...   0                    [OK]
miko2u/mysql                 MySQL with groonga and ipv6                     0                    [OK]
horx/mysql                   Mysql server                                    0                    [OK]
ingoclaro/mysql                                                              0                    [OK]

返回很多包含關鍵字的映象,包括映象名、描述、星級(表示該映象的受歡迎程度)、是否官方建立、是否自動建立等。

刪除映象

使用dockerrmi命令可以刪除映象,命令格式為:

docker rmi IMAGE[IMAGE...]

其中IMAGE可是標籤或ID。 因為一個映象可以有多個標籤,如果rmi一個標籤時不能找到唯一的映象,便會刪除這個標籤,直到一個標籤能確定唯一映象為止。所以,如果一個標籤可以確定這個映象,再執行這個命令便危險了,因為將直接刪除這個映象。 如果一個映象已經建立了容器,那麼這個映象檔案預設是無法被刪除的,例如剛才的ubuntu映象以及建立了一個執行bash 的容器,可以用docker ps -a命令檢視所有容器:

sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
636151e7941b        ubuntu:latest       "/bin/bash"         28 minutes ago      Exited (0) 22 minutes ago                       hopeful_rosalind

會發現後臺存在一個處於Exited退出狀態的容器,那麼是無法刪除ubuntu映象的。如果想要強行刪除,可以加-f引數,但這樣往往遺留一些問題。比如刪除之後,docker images中會存在一個名為none 的臨時映象。 正確的做法應該是先刪除以來該驚險的所有容器:

sudo docker rm 636151e7941b

然後再刪除映象。


歡迎到微信裡去當吃瓜群眾