Docker 学习

Docker 学习 - 2. docker的镜像

2019-05-21  本文已影响0人  消失黎明

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

如上所示,可以看到几个字段信息:

其中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.

创建镜像

创建镜像的方法有三种:

基于已有镜像的容器创建

该方法主要是使用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

本人编撰,严禁抄袭

上一篇下一篇

猜你喜欢

热点阅读