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
然後再刪除映象。
歡迎到微信裡去當吃瓜群眾