本文共 8406 字,大约阅读时间需要 28 分钟。
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
镜像是Docker运行容器的前提。
可以使用docker pull命令从网络上下载镜像。该命令的格式为:
docker pull NAME[:TAG]
备注:
NAME 下载镜像的名称
TAG 标签 通过指定标签来下载特定版本的某一镜像
对于Docker镜像来说,如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像。
演示一下如何从Ubuntu仓库下载一个最新的Ubuntu操作系统的镜像:
xiaosi@xiaosi:~$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
5ba4f30e5bea: Pull complete
9d7d19c9dc56: Pull complete
ac6ad7efd0f9: Pull complete
e7491a747824: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4
Status: 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/bash
root@fe7fc4bd8fc9:/#
可以使用如下命令列出本地主机上已有的镜像:
xiaosi@Qunar:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2fa927b5cdd3 3 weeks ago 122 MB
xiaosi@Qunar:~$
说明:
字段 | 描述 |
REPOSITORY | 来自于哪个仓库,比如ubuntu仓库 |
TAG | 镜像的标签信息,比如latest,用于标记同一仓库的不同镜像。 |
IMAGE ID | 镜像的ID(唯一) |
CREATED | 创建时间 |
SIZE | 镜像大小 |
可以使用如下命令查看具体某个镜像的详细信息:
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"}} 2fa927b5cdd3
amd64
xiaosi@Qunar:~$ docker inspect -f { { ".RootFS"}} 2fa927b5cdd3
{ layers [sha256:9436069b92a3ec23351313d6decc5fba2ce1cd52aac77dd8da3b03b3dfcb5382 sha256:19429b698a2283bfaece7f590e438662e2078351a9ad077c6d1f7fb12f8cd08d sha256:82b57dbc5385a2a0edd94dfc86f9e4d75487cce30250fec94147abab0397f2b8 sha256:737f40e80b7ff641f24b759d64f7ec489be0ef4e0c16a9780b795dbe972b38d2 sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef] }
xiaosi@Qunar:~$ docker inspect -f { { ".RootFS.Type"}} 2fa927b5cdd3
layers
xiaosi@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"}} 2fa9
amd64
使用docker search命令可以搜索远端仓库中共享的镜像
xiaosi@Qunar:~$ sudo docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql 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资源则允许用户验证镜像的来源和内容。
(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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65db087a3d0f ubuntu "echo 'hello! I am he" 56 seconds ago Exited (0) 55 seconds ago happy_brown
29590df260fb ubuntu "/bin/bash" 9 hours ago Exited (127) 9 hours ago romantic_williams
af5eda44bc58 ubuntu "/bin/echo hello worl" 8 days ago Exited (0) 8 days ago sad_bhaskara
以看到,后台存在退出状态的容器,是基于ubuntu:latest镜像创建的。
试图删除该镜像,Docker会提示有容器正在运行,无法删除:
xiaosi@Qunar:~$ docker rmi ubuntu
Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container af5eda44bc58 is using its referenced image 2fa927b5cdd3
docker rmi -f ubuntu
正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于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/bash
root@8b9353e12fae:/# touch test
root@8b9353e12fae:/# exit
exit
容器的ID为8b9353e12fae。此时该容器跟原ubuntu:latest镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
xiaosi@Qunar:~$ docker commit -m "ubuntu latest new images" -a "jifeng.si" 8b9353e12fae ubuntu:test
sha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e
可以看到命令返回新创建的镜像的ID信息:sha256:e74cfd9cf8086321a302dd54a4964de749fde1211915efc8d4c64514654a607e
我们再看看本地的镜像列表,即可看到新创建的镜像:
xiaosi@Qunar:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu test e74cfd9cf808 40 seconds ago 122 MB
ubuntu latest 2fa927b5cdd3 3 weeks ago 122 MB
可以使用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技术入门与实战》
转载地址:http://dtfbm.baihongyu.com/