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
root@636151e7941b:/#
这就是相当于用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
然后再删除镜像。