Docker 学习 - 2. docker的镜像
Docker运行容器钱需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认的镜像仓库下载。
获取镜像
镜像是Docker运行容器的前提。
可以通过使用docker pull命令从网络上下载镜像。该命令的格式为docker pull NAME[:TAG]
.
对于Docker镜像来说,如果没有显式指定TAG,则会默认选择latest标签,也就是下载仓库中最新版本的镜像。例如,我们想从Docker hub的ubuntu仓库中下载一个新的Ubuntu操作系统的镜像。
$ sudo docker pull ubuntu
ubuntu:latest: The image you are pulling has been verified
d504ab3987c2: Downloading [========> ] 25.41 MB/201.6 MB 51m14s
ccb62158e970: Download complete
34a7qade2bec: Download complete
...
下载过程中可以看出,镜像文件一般由若干层组成,行首的d504ab3987c2或者ccb62158e970字符串代表了各层的ID,下载过程中会获取并输出镜像的各层信息。层(Layer)其实是AUFS(联合文件系统)中的重要概念,是实现增量保存和更新的基础。
此外用户也可以选择通过指定标签下载,
$ sudo docker pull ubuntu:14.04
或者特定的仓库下载,不过需要在仓库名称之前指定完整的仓库注册服务器地址。
$ sudo docker pull dl.dockerpool.com:5000/ubuntu
查看镜像信息
使用docker images
命令可以列出本地主机上已有的镜像。
例如,下面的命令列出了本地刚从官方下载的 ubuntu:14.04 镜像,以及DockerPool镜像源下载的ubuntu:latest 镜像。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.0 5506de2b643b 1 weeks ago 197.8 MB
dl.dockerpool.com: 5000/ubuntu latest 5506de2b643b 1 weeks ago 197.8 MB
如上所示,可以看到几个字段信息:
- 来自于哪个仓库,比如ubuntu仓库
- 镜像的TAG,即标签信息, 比如14.04
- 镜像 ID
- 创建时间
- 镜像大小
其中ID信息十分重要,它唯一地标识了镜像。
TAG信息是为了标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG来区分发行版本,例如10.04、12.04、12.10、13.04、14.04等标签。
为了方便在后续工作中使用这个镜像,还可以使用 docker tag
命令为本地镜像添加新的标签。例如添加一个新的 ubuntu:latest镜像标签如下:
$ sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
再次使用docker images
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.0 5506de2b643b 1 weeks ago 197.8 MB
dl.dockerpool.com: 5000/ubuntu latest 5506de2b643b 1 weeks ago 197.8 MB
ubuntu latest 5506de2b643b 1 weeks ago 192.8 MB
我们会发现,不同标签的镜像ID 是一致的,这说明他们实际上指向了同一个镜像文件,只不过别名不同而已。
使用docker inspect
命令可以获取该镜像的详细信息。
$ sudo docker inspect 5506de2b643b
[{
"Architecture": "amd64",
"Author": "",
"Comment": "",
"Config": {
...
}
...
}]
执行docker inspect
命令返回的是一个json的字符串,如果只是需要其中一项内容,可以使用 -f
参数来指定,例如,获取镜像的Architecture信息.
$ sudo docker inspect -f {{".Architecture"}} 550
注:550
是该镜像ID的前3个字符,通常可以使用该ID的前若干字符组成的可区分子串来替代完整的ID.
搜索镜像
使用docker search
命令可以搜索远程仓库中共享的镜像,例如,搜索带mysql关键字的镜像如下所示:
dp_user@rqalnxgrid4:~> sudo docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 8178 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2785 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 610 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 192 [OK]
...
删除镜像
使用docker rmi
命令可以删除镜像,命令格式为docker rmi IMAGE
,IMAGE可以使标签或者ID。
例如,要删除 dl.dockerpool.com:5000/ubuntu:latest镜像,可以使用如下命令:
$ sudo rmi dl.dockerpool.com:5000/ubuntu
Untagged: dl.dockerpool.com:5000/ubuntu:latest
有的人可能会担心,本地的ubuntu:latest镜像是否会受影响,关于这个问题,无需担心,因为当一个镜像拥有多个标签的时候,docker rmi命令指示删除了该镜像多个标签中的指定标签,并不影响镜像文件。但如果当镜像只剩下一个标签就需要小心了,这时候如果再使用docker rmi有可能就会彻底删除该镜像。
不过需要注意的是,有的时候,在删除镜像之后,假如利用该镜像已经创建了一个容器,那么直接删除镜像,Docker就会提示有容器正在运行,无法删除。
$ sudo docker rmi ubuntu
Error response from daemon: Conflict, cannot delete 5506de2b643b because the container e812617b41f6 is using it, use -f to force
因此正确的做法是,先删除依赖该镜像的所有容器,然后再删除镜像。首先删除容器 e812617b41f6.
创建镜像
创建镜像的方法有三种:
- 基于已有镜像的容器创建
- 基于本地模板导入
- 基于Dockerfile创建
基于已有镜像的容器创建
该方法主要是使用docker commit
命令,其命令格式是docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
,主要选项是
-a, --author="" 作者信息
-m, --message="" 提交消息
-p, --pause=true 提交时暂时容器运行
下面做一个演示,演示过程是,首先启动一个镜像,并在其中进行修改,创建一个test文件,然后退出。
$ sudo docker run -it ubuntu:14.04 /bin/bash
root@a925cbb40b3f0: /# touch test
root@a925cbb40b3f0: /# exit
此时,容器的ID是a925cbb40b3f0, 这与原来的ubuntu:14.04镜像相比,已经发生了改变,可使用docker commit命令提交一个新的镜像。提交时可以使用id或者名称指定容器。
$ sudo docker commit -m "Add a new file" -a "Docker Newbee" a925cbb40b3f0 test
************adbewedf9834**************
然后就能够看到镜像的ID 信息了,************adbewedf9834**************
基于本地模板导入
也可以直接从一个操作系统模板文件导入一个镜像。OPENVZ模板的下载地址为http://openvz.org/Download/templates/precreated.
比如,我下载了一个ubuntu14.04的模板压缩包以后,使用以下命令导入:
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
存出和载入镜像
存出镜像
如果要存出镜像到本地文件,可以使docker save
命令,例如,存出本地ubuntu:14.04镜像为文件ubuntu_14.04.tar:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 c4ff7513909d 5 weeks ago 225.4MB
载入镜像
可以使用docker load
从存出的本地文件中再导入到本地镜像库,例如从文件ubuntu_14.04.tar 导入镜像到本地镜像列表,如下所示:
$ sudo docker load --input ubuntu_14.04.tar
或者是
$ sudo docker load < ubuntu_14.04.tar
这将导入镜像以及其相关的元数据信息,可以使用docker images命令进行查看。
上传镜像
可以使用docker push
命令上传镜像到仓库,命令格式为docker push NAME[:TAG]
.用户在DockerHub网站注册以后,即可上传自制的镜像,例如用户user上传本地的 test:latest 镜像,可以先添加新的标签 user/ test:latest,然后用docker push
命令上传镜像。
$sudo docker tag test: latest user/test:latest
$sudo docker push user/test: latest
The push refers to a repository [base/163] (len:1)
Sending image list
Please login prior to push:
Username:
Password:
Email: xxx@xxx.com
本人编撰,严禁抄袭