镜像
它是Docker的三大核心之一。
Docker运行容器前需要本地存在对应的镜像,如果本地没有存在对应的镜像,Docker将会尝试从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),当然,我们也可以通过配置,使用自定义的镜像仓库,如DaoCloud、阿里云镜像、网易蜂巢。
本节将介绍围绕镜像这一核心的具体操作:
【1】如何使用pull命令从Docker公有仓库中下载镜像到本地
【2】如何查看本地已有的镜像信息
【3】如何在远端仓库使用serach命令进行搜索和过滤
【4】如何删除镜像标签和镜像文件
【5】如何创建用户定制的镜像并且保存为外部文件
【6】如何向Docker Hub仓库推送自己的镜像
...... .......
1、搜索镜像
使用docker search命令搜索镜像,命令格式如下:
docker search <images>
例如:搜索一个CentOS系统的镜像
docker search centos
搜索结果如下:
字段信息说明:
NAME:镜像的仓库名字 查看帮助:man docker-search |
2、获取镜像
镜像是Docker容器运行的前提。
下载镜像命令:docker pull NAME[:TAG]
对于Docker镜像来说,如果不显式地指定TAG,则会默认选择latest标签,即下载仓库中最新版本的镜像。
如:下载centos镜像,实际上就是下载centos:latest镜像,即目前最新版本的镜像。
[root@master03 /]#
[root@master03 /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:b40cee82d6f98a785b6ae35748c958804621dc0f2194759a2b8911744457337d
Status: Downloaded newer image for centos:latest
[root@master03 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3556258649b2 13 days ago 64.2MB
centos latest 9f38484d220f 4 months ago 202MB
[root@master03 /]#
下载过程,镜像文件是由若干层组成的,行首类似于f476d66f5408这样的数字表示各层的ID。下载过程中会获取并输出镜像的各层信息。
层layer实际上是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实际增量保存与更新的基础。
当然,我们可以通过制定标签来下载特定版本的某一镜像:
$ docker pull centos:7.2
最后使用镜像创建一个容器,并进入容器查看下版本
[root@master03 /]#
[root@master03 /]# docker run -it centos /bin/bash
[root@39327f2deca5 /]# cat /etc/re
redhat-release resolv.conf
[root@39327f2deca5 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@39327f2deca5 /]# exit
exit
[root@master03 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@master03 /]#
3、查看镜像
查看docker镜像:
docker images
字段信息说明:
REPOSITORY:仓库,当前镜像来自于哪个仓库 TAG:镜像标签信息,版本 IMAGE ID:镜像ID,具有唯一性 CREATED:镜像创建的时间 SIZE:镜像大小 |
4、删除镜像
当一个镜像有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件。但当该镜像只剩下一个标签的时候,此时删除该标签的时候会彻底删除该镜像。使用docker rmi 镜像ID号命令时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉指向该镜像的所有标签,然后删除镜像本身。
注意:运行中的Docker容器是无法删除的!这个时候镜像创建的容器存在,而且镜像文件是无法被删除的,所以应该先删除依赖该镜像的所有容器,再删除镜像。
必须通过docker stop或者docker kill命令停止容器,才能将其删除。否则将出现以下报错:
[root@master03 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3556258649b2 13 days ago 64.2MB
centos latest 9f38484d220f 4 months ago 202MB
[root@master03 /]#
[root@master03 /]# docker rmi 355625
Error response from daemon: conflict: unable to delete 3556258649b2 (must be forced) - image is being used by stopped container 08ea8b861134
可以看到,我们直接去删除一个docker镜像是不行的,这个镜像目前正在被某个容器使用。
删除docker镜像思路:
docker save保存容器
docker images
docker save REPOSITORY > XX.tar
【1】删除镜像容器:
docker ps -a:查看目前Docker镜像的详细信息,及容器ID
docker rm CONTAINER ID:删除Docker容器
我们可以发现ID为08ea8b861134的容器已经被删除掉了。这时,我们就可以进行下一步删除镜像操作了。
【2】删除镜像:
docker images:查看Docker镜像
docker rmi IMAGE ID:删除Docker镜像
可以看到,这一步操作后,我们已成功删除Docker镜像。
【3】多个镜像ID相同时,删除其中一个镜像
当我们复制出来多个镜像时,它们共用一个镜像ID,这个时候我们停止容器后,直接按镜像ID去删除镜像时,会把这个相同镜像ID的所有镜像删除,这种操作实际上是很危险的。
为了避免上边的问题,我们可以按镜像名称和TAG标签来删除指定镜像:
docker rmi [REPOSITORY:TAG]
上述操作将删除我们指定的镜像文件,可以看到已经删除成功。
5、创建镜像
创建镜像的方法有三种:【1】基于已有镜像的容器创建;【2】基于本地模板导入;【3】基于DockerFile创建;
这里我们重点介绍前两种方法,最后一种将在后面单独列一节内容详解。
【1】基于已有镜像的容器创建
主要使用docker commit命令,我们在提交一个容器的时候就指定镜像的名称和tag标签。
格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
- -a:--author=" "作者信息;
- -m:--message=" "提交信息
- -p:--pause=true提交时暂停容器运行
下面将使用该docker run命令。首先,启动一个镜像,并在其中进行修改操作:
[root@master03 /]# docker run -it ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
a7344f52cb74: Pull complete
515c9bb51536: Pull complete
e1eabe0537eb: Pull complete
4701f1215c13: Pull complete
Digest: sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90
Status: Downloaded newer image for ubuntu:14.04
root@05ae2239bb06:/# touch test
root@05ae2239bb06:/# exit
exit
容器ID为:05ae2239bb06
此时该容器跟源ubuntu:14.04镜像相比,已发生变化,使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
[root@master03 /]# docker commit -m "Added a new file" -a "Docker Newbee" 05ae2239bb06 test
sha256:d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3
[root@master03 /]#
返回了新创建的镜像的ID信息:
d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3
查看本地镜像列表,即可看到新创建的镜像信息:
【2】基于本地模板导入
可以直接从一个操作系统模板文件导入一个镜像。这里我们先使用docker export导出一个容器。
[root@master03 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05ae2239bb06 ubuntu:14.04 "/bin/bash" 10 minutes ago Up 2 seconds zealous_elion
5517d6d70a09 microsoft/dotnet-samples "dotnet dotnetapp.dl…" 45 hours ago Exited (0) 45 hours ago romantic_goodall
39327f2deca5 centos "/bin/bash" 2 days ago Exited (1) 44 hours ago gifted_elbakyan
[root@master03 /]#
[root@master03 /]# docker export 05ae2239bb06 >test_export.tar
[root@master03 /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test_export.tar test_for_run.tar test_for_stop.tar tmp usr var
[root@master03 /]#
然后,执行导入容器模板操作:
[root@master03 /]# cat test_export.tar | docker import - test/ubuntu:v1.0
sha256:9e06207a54143ade6761d07c7394bbbdad1bd8d66dd6b15373531852407ac578
[root@master03 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.0 9e06207a5414 4 seconds ago 64.2MB
centos latest 9f38484d220f 4 months ago 202MB
microsoft/dotnet-samples latest 70e25069fca7 5 months ago 181MB
[root@master03 /]#
可以看到,新导入的镜像已经在本地存在了。
6、导出/载入、上传镜像
导出镜像也就是将镜像保存到本地文件,可以使用docker save命令,会保存该镜像的所有历史记录和元数据信息。
docker save [IMAGE ID] > [SAVE_FILE.tar]
或者
docker save [IMAGE ID] [SAVE_FILE.tar]
或者:
docker save -o 存储文件名 存储的镜像
导入镜像
#可以用docker load命令将导出的tar文件导入到镜像库中
docker load < NAME.tar
#导入后会发现,该镜像的所有历史记录和元数据信息,全部都在。
例如,将ubuntu-latest.tart文件导入到本地镜像仓库中
设置镜像标签
本地存储的镜像越来越多,我们就需要制定一个专门的仓库来存放这些镜像文件,也就是镜像仓库。
我们可以使用docker tag命令,为镜像打上一个新的标签。
docker tag [IMAGE ID/NAME] [IMAGE ID/NAME:TAG]
docker tag 3556258649b2 ubuntu-targ-test:dev
docker tag 镜像ID,这里是 3556258649b2 ,用户名称、镜像源名(repository name)和新的标签名(tag)。
docker images命令可以看到,ID为3556258649b2的镜像多了一个标签dev。
然后用docker push命令上传镜像。
docker push [IMAGE TAG]
如:docker push test/ubuntu:v1.0
基于DockerFile创建镜像------【此处省略,后边我们在Dockerfile文件方式创建镜像时详解】
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1.从已经创建的容器中更新镜像,并且提交这个镜像
- 2.使用 Dockerfile 指令来创建一个新的镜像
构建镜像,我们使用docker build,从零开始创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含指令来告诉我们Docker如何构建我们的镜像。