docker系列-02操作镜像

seefly 2020年07月30日 76次浏览

使用镜像

1、docker pull 拉取镜像

    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。
由于镜像是分层的,所以下载起来也是一层一层的去下载

2、docker image ls 列出镜像

  • 列出所有镜像
[root@izwz9fu4aeb6g5axg6bpmfz ~]# docker image ls
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
gitdoit/centos              6.7                 9e5d227c72eb        7 months ago        191 MB
gitdoit/tag                 ub18                6d81aba96798        7 months ago        95.5 MB
gitdoit/test                ubuntu18            6d81aba96798        7 months ago        95.5 MB
docker.io/ubuntu            18.04               7698f282e524        7 months ago        69.9 MB

列包含了 仓库名、标签、镜像id、创建时间、以及占用空间,其中占用空间和再Docker Hub上看到的不一样是因为,在DockerHub上的是压缩的,这里是解压的。

  • 列出部分镜像
    docker image ls ubuntu 列出ubuntu仓库中的镜像
  • 列出指定镜像
    docker image ls ubuntu:18.04
  • 带过滤条件的列出镜像
    docker image ls -f since=mongo:3.2 列出mongo:3.2之后建立的镜像
    docker image ls -f label=key 列出带有指定标签的镜像
    docker image ls -f label=key=value 列出带有指定标签且指定值的镜像
  • 显示指定列
    docker image ls -q 只显示镜像的id
    docker image ls --format "{{.ID}}:{{.Repository}}" 自定义显示列

3、虚悬镜像

有时候会看到仓库名和标签都为 的镜像,这就是虚悬镜像,一般是因为后面构建的镜像跟之前的镜像重名了,所以旧镜像就成了虚悬镜像。

# 查看虚悬镜像
docker image ls -f dangling=true
# 一般来说虚悬镜像已经没有价值了,可以删除
# 但有的虚悬镜像之前已经被用来创建容器了,需要先删除容器
docker image prune

4、中间层镜像

由于镜像是分层的,所以在构建的过程中会利用这些中间层镜像。且 docker image ls 只会显示顶层镜像,可以通过下面这个命令查看所有镜像,包括中间层镜像

[root@izwz9fu4aeb6g5axg6bpmfz ~]# docker image ls -a
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
gitdoit/centos              6.7                 9e5d227c72eb        7 months ago        191 MB
<none>                      <none>              72cc28c117a5        7 months ago        191 MB
<none>                      <none>              42d959b85e35        7 months ago        191 MB
<none>                      <none>              3bcbd4f43006        7 months ago        191 MB
<none>                      <none>              a83f26761fbf        7 months ago        191 MB
<none>                      <none>              3edcbfd4c8e2        7 months ago        191 MB
<none>                      <none>              0fda7b8d4f2f        7 months ago        191 MB

可以看到很多无标签的镜像,这和之前的虚悬镜像不一样,这些无标钱的镜像大都是中间层镜像,是其他镜像所依赖的镜像。这些镜像不应该删除,否则顶层镜像会出问题,而且在构建新的镜像时可能会复用这些中间层镜像。

5、删除镜像

# docekr rmi 和 docekr image rm 一样吧???
docker rmi [-f(强制) ] <镜像id|名称|摘要>

docker image rm [-f] <imageID|names|digist>

我们可以利用 镜像长ID,镜像短ID,镜像名、摘要来删除镜像

  • 镜像长ID :即镜像的整个ID,如 9e5d227c72eb....,通过ls显示的其实是短id
  • 镜像短ID :可以取长id的最少前3个字符,用以区分。
  • 镜像名 :就是<仓库名>:<标签>
  • 摘要 :很长很长的
[root@izwz9fu4aeb6g5axg6bpmfz ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
gitdoit/centos              6.7                 9e5d227c72eb        7 months ago        191 MB
gitdoit/tag                 ub18                6d81aba96798        7 months ago        95.5 MB
gitdoit/test                ubuntu18            6d81aba96798        7 months ago        95.5 MB
hello/fuck                  21                  6d81aba96798        7 months ago        95.5 MB
docker.io/ubuntu            18.04               7698f282e524        7 months ago        69.9 MB
docker.io/centos            6.7                 9f1de3c6ad53        10 months ago       191 MB
docker.io/hello-world       latest              fce289e99eb9        12 months ago       1.84 kB
docker.io/training/webapp   latest              6fae60ef3446        4 years ago         349 MB
[root@izwz9fu4aeb6g5axg6bpmfz ~]# docker image rm hello/fuck
Error response from daemon: No such image: hello/fuck:latest
[root@izwz9fu4aeb6g5axg6bpmfz ~]# docker image rm hello/fuck:21
Untagged: hello/fuck:21
[root@izwz9fu4aeb6g5axg6bpmfz ~]# 

1、使用镜像名删除时,如果不指定tag,默认就是latest,如果镜像被打了多个标签,那此时只是删除了当前标签,并没有删除镜像。若只有当前标签,那就连标签带镜像都删除了
2、使用id删除时,如果镜像有多个标签,会执行失败,并返回错误说:image is referenced in multiple repositories ,意思就是你删除的镜像被其他仓库引用了,需要先删除它们,再删除镜像。或者加上 -f 强制删除。

6、永远不要利用 docker commit

建议永远不要利用docker commit制作镜像,这样做出来的镜像就是个黑盒子,没人知道里面都有什么,不好维护。