[Docker]Docker镜像
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
1. 获取镜像
镜像是Docker运行容器的前提。
可以使用docker pull命令从网络上下载镜像。该命令的格式为:
docker pull NAME[:TAG]
备注:
NAME 下载镜像的名称
TAG 标签 通过指定标签来下载特定版本的某一镜像
对于Docker镜像来说,如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。
演示一下如何从Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像:
xiaosi@xiaosi:~$ sudo docker pull ubuntuUsing default tag: latestlatest: Pulling from library/ubuntu5ba4f30e5bea: Pull complete9d7d19c9dc56: Pull completeac6ad7efd0f9: Pull completee7491a747824: Pull completea3ed95caeb02: Pull completeDigest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4Status: Downloaded newer image for ubuntu:latest
从上可以看出我们没有显示指定TAG,则会默认选择latest标签,下载最新的版本的ubuntu镜像。
下载过程中可以看出,镜像文件一般由若干层组成,行首的5ba4f30e5bea这样的字串代表了各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其实是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实现增量保存与更新的基础。
还可以通过指定标签来下载特定版本的某一个镜像,例如14.04标签的镜像:
sudo docker pull ubuntu:14.04
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用:
sudo docker run -t -i ubuntu /bin/bashroot@fe7fc4bd8fc9:/#
2. 查看镜像信息
2.1 查看所有镜像
可以使用如下命令列出本地主机上已有的镜像:
xiaosi@Qunar:~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest 2fa927b5cdd3 3 weeks ago 122 MBxiaosi@Qunar:~$
说明:
| 字段 | 描述 |
| REPOSITORY | 来自于哪个仓库,比如ubuntu仓库 |
| TAG | 镜像的标签信息,比如latest,用于标记同一仓库的不同镜像。 |
| IMAGE ID | 镜像的ID(唯一) |
| CREATED | 创建时间 |
| SIZE | 镜像大小 |
2.2 查看具体镜像详细信息
可以使用如下命令查看具体某个镜像的详细信息:
xiaosi@Qunar:~$ docker inspect 2fa927b5cdd3[{"Id": "sha256:2fa927b5cdd31cdec0027ff4f45ef4343795c7a2d19a9af4f32425132a222330","RepoTags": ["ubuntu:latest"],"RepoDigests": [],"Parent": "","Comment": "","Created": "2016-05-27T14:15:02.359284074Z","Container": "b8bd6a8e8874a87f626871ce370f4775bdf598865637082da2949ee0f4786432","ContainerConfig": {"Hostname": "914cf42a3e15","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": [],"Cmd": ["/bin/sh","-c","#(nop) CMD [\"/bin/bash\"]"],"Image": "b873f334fa5259acb24cf0e2cd2639d3a9fb3eb9bafbca06ed4f702c289b31c0","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"DockerVersion": "1.9.1","Author": "","Config": {"Hostname": "914cf42a3e15","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": [],"Cmd": ["/bin/bash"],"Image": "b873f334fa5259acb24cf0e2cd2639d3a9fb3eb9bafbca06ed4f702c289b31c0","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"Architecture": "amd64","Os": "linux","Size": 121989688,"VirtualSize": 121989688,"GraphDriver": {"Name": "aufs","Data": null},"RootFS": {"Type": "layers","Layers": ["sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382","sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d","sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8","sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2","sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"]}}]
docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定:
xiaosi@Qunar:~$ docker inspect -f {{".Architecture"}} 2fa927b5cdd3amd64xiaosi@Qunar:~$ docker inspect -f {{".RootFS"}} 2fa927b5cdd3{layers [sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382 sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8 sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2 sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef] }xiaosi@Qunar:~$ docker inspect -f {{".RootFS.Type"}} 2fa927b5cdd3layersxiaosi@Qunar:~$ docker inspect -f {{".RootFS.Layers"}} 2fa927b5cdd3[sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382 sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8 sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2 sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef]
备注:
命令后的2fa927b5cdd3表示镜像ID
在指定镜像ID的时候,通常使用该ID的前若干个字符组成的可区分字串来替代完整的ID:
xiaosi@Qunar:~$ docker inspect -f {{".Architecture"}} 2fa9amd64
2.3 搜索镜像
使用docker search命令可以搜索远端仓库中共享的镜像
xiaosi@Qunar:~$ sudo docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relati... 2533 [OK]mysql/mysql-server Optimized MySQL Server Docker images. Crea... 161 [OK]centurylink/mysql Image containing mysql. Optimized to be li... 45 [OK]sameersbn/mysql 36 [OK]google/mysql MySQL server for Google Compute Engine 16 [OK]appcontainers/mysql Centos/Debian Based Customizable MySQL Con... 8 [OK]marvambass/mysql MySQL Server based on Ubuntu 14.04 6 [OK]drupaldocker/mysql MySQL for Drupal 2 [OK]alterway/mysql Docker Mysql 2 [OK]yfix/mysql Yfix docker built mysql 2 [OK]azukiapp/mysql Docker image to run MySQL by Azuki - http:... 2 [OK]kaluzki/mysql mysql 1 [OK]sin30/mysql MySQL images with my own config files. 1 [OK]phpmentors/mysql MySQL server image 1 [OK]tetraweb/mysql 1 [OK]lancehudson/docker-mysql MySQL is a widely used, open-source relati... 0 [OK]akilli/mysql akilli/base based MySQL image 0 [OK]projectomakase/mysql Docker image for MySQL 0 [OK]dockerizedrupal/mysql docker-mysql 0 [OK]ahmet2mir/mysql This is a Debian based image with MySQL se... 0 [OK]nanobox/mysql MySQL service for nanobox.io 0 [OK]vukor/mysql Build for MySQL. Project available on http... 0 [OK]tozd/mysql MySQL (MariaDB fork) Docker image. 0 [OK]cloudposse/mysql Improved `mysql` service with support for ... 0 [OK]livingobjects/mysql MySQL 0 [OK]
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
默认的输出结果将按照星级评价进行排序。官方的镜像说明是官方项目组创建和维护的,automated资源则允许用户验证镜像的来源和内容。
2.4 删除镜像
(1)使用镜像的标签删除镜像
使用docker rmi命令可以删除镜像,命令格式为
docker rmi IMAGE[IMAGE...]
其中IMAGE可以为标签或ID。
但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除该镜像。
(2)使用镜像ID删除镜像
当使用docker rmi命令后面跟上镜像的ID(也可以是ID能进行区分的部分前缀串)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的
先利用ubuntu镜像创建一个简单的容器,输出一句话“hello!I am here!”:
xiaosi@Qunar:~$ docker run ubuntu echo 'hello! I am here!'hello! I am here!
xiaosi@Qunar:~$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES65db087a3d0f ubuntu "echo 'hello! I am he" 56 seconds ago Exited (0) 55 seconds ago happy_brown29590df260fb ubuntu "/bin/bash" 9 hours ago Exited (127) 9 hours ago romantic_williamsaf5eda44bc58 ubuntu "/bin/echo hello worl" 8 days ago Exited (0) 8 days ago sad_bhaskara
以看到,后台存在退出状态的容器,是基于ubuntu:latest镜像创建的。
试图删除该镜像,Docker会提示有容器正在运行,无法删除:
xiaosi@Qunar:~$ docker rmi ubuntuError response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container af5eda44bc58 is using its referenced image 2fa927b5cdd3
如果要想强行删除镜像,可以使用-f参数:
docker rmi -f ubuntu
不推荐使用-f参数来强制删除一个存在容器依赖的镜像,因为这样往往会造成一些遗留问题。
正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
2.5 创建镜像
创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
在这说一下基于已有镜像的容器创建:
该方法主要是使用docker commit命令,其命令格式为:
docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]
OPTIONS参数: -a (--author) 作者信息 ; -m(--message) 提交信息 ; -p(--pause=true) 提交时暂停容器运行;
下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出
xiaosi@Qunar:~$ docker run -t -i ubuntu /bin/bashroot@8b9353e12fae:/# touch testroot@8b9353e12fae:/# exitexit
容器的ID为8b9353e12fae。此时该容器跟原ubuntu:latest镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
xiaosi@Qunar:~$ docker commit -m "ubuntu latest new images" -a "jifeng.si" 8b9353e12fae ubuntu:testsha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e
可以看到命令返回新创建的镜像的ID信息:sha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e
我们再看看本地的镜像列表,即可看到新创建的镜像:
xiaosi@Qunar:~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu test e74cfd9cf808 40 seconds ago 122 MBubuntu latest 2fa927b5cdd3 3 weeks ago 122 MB
2.6 存出和载入镜像
可以使用docker save和docker load命令来存出和载入镜像。
(1)存出镜像
如果要存出镜像到本地文件,可以使用docker save命令。例如,存出本地的ubuntu:latest镜像为文件ubuntu_latest.tar:
xiaosi@Qunar:~$ docker save -o ubuntu_latest.tar ubuntu:latest
(2)载入镜像
可以使用docker load从存出的本地文件中再导入到本地镜像库,例如从文件ubuntu_latest.tar导入镜像到本地镜像列表
xiaosi@Qunar:~$ docker load --input ubuntu_latest.tar
来源于:《docker技术入门与实战》