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: Downloading7e2c5c55ef2c: Download completee04c66a223c4: Download completefa81ed084842: Download complete
層(Layer)其實是AUFS(Advanced Union File System,一種聯合文件系統)中的重要概念,是實現增量保存與更新的基礎。
在本地有了這個鏡像之后便可以使用,生成容器了,比如在這個ubuntu鏡像上生成一個容器,在其中運行bash應用:
sudo docker run –t –i ubuntu /bin/bashroot@636151e7941b:/#
這就是相當於用ubuntu這個鏡像創建了一個容器,並且你已經在這個容器里面了,在這里,你完全可以和使用普通的ubuntu系統一樣(可以認識為這個鏡像生成的虛擬機,不過所有同類容器只占有自身數據的大小,而鏡像部分共用),包括各種命令,甚至安裝軟件。
查看鏡像信息:
使用docker images命令可以列出本地主機上已有的鏡像:
sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 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 mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql 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]
返回很多包含關鍵字的鏡像,包括鏡像名、描述、星級(表示該鏡像的受歡迎程度)、是否官方創建、是否自動創建等。
刪除鏡像:
使用docker rmi命令可以刪除鏡像,命令格式為:
docker rmi IMAGE[IMAGE...]
其中IMAGE可是標簽或ID。
因為一個鏡像可以有多個標簽,如果rmi一個標簽時不能找到唯一的鏡像,便會刪除這個標簽,直到一個標簽能確定唯一鏡像為止。所以,如果一個標簽可以確定這個鏡像,再執行這個命令便危險了,因為將直接刪除這個鏡像。
如果一個鏡像已經創建了容器,那么這個鏡像文件默認是無法被刪除的,例如剛才的ubuntu鏡像以及創建了一個執行bash 的容器,可以用docker ps -a命令查看所有容器:
sudo docker ps –aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES636151e7941b ubuntu:latest “/bin/bash” 28 minutes ago Exited (0) 22minutes ago hopeful_rosalind
會發現后台存在一個處於Exited退出狀態的容器,那么是無法刪除ubuntu鏡像的。如果想要強行刪除,可以加-f參數,但這樣往往遺留一些問題。比如刪除之后,docker images中會存在一個名為none 的臨時鏡像。
正確的做法應該是先刪除依賴該鏡像的所有容器:
sudo docker rm 636151e7941b
然后再刪除鏡像。
PS:通過測試只要鏡像id相同,不管鏡像標簽及其來源如何,都可以認為它們就是同一鏡像文件,就像java中變量和對象變量一樣,標簽就是變量,所有id相同的標簽都引用同一個鏡像,按標簽刪除鏡像把這里體現的淋漓盡致,只要還有一個標簽引用這個鏡像id,這個鏡像就不會被刪除。