前面的推文我们初步了解了Docker容器的一些知识,今天开始给大家分享更详细的一系列关于Docker容器技术,欢迎关注。Docker不管是程序员,架构师或者测试工程师都必须要掌握的一门主流技术,如果需要领取同步资料可以文末联系老师。

01认识docker镜像

Docker镜像是由文件系统叠加而成,最低端是一个引导文件系统,即bootfs,这个很像Linux/Unix的引导文件系统,Docker用户几乎永远不和引导文件系统有交互。Docker看起来很像一个Linux虚拟化栈,Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上,rootfs可以是一种或多种操作系统。

在传统的Linux引导过程中,root文件系统会先以只读的方式加载,当引导结束并完成完整性检查后,它才会被切换成读写模式,但是在Docker中,root文件系统永远只能是只读状态,并且Docker利用联合加载(union mount)技术会在root文件系统层上加载更多的只读文件系统,联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统称为镜像,一个镜像可以放到另一个镜像的顶部,位于下面的镜像称之为父镜像(parent image),可以依次类推,直到镜像栈的最底部,最底部的镜像称之为基础镜像(base image)。最后当从一个镜像启支容器时,Docker会在该镜像的最顶层加载一个读写文件系统。

图片

02拉取镜像

镜像是运行容器的前提, 官方的Docker Hub 网站已经提供了数十万个镜像供大家开放下载。

本节主要介绍docker 镜像的pull 子命令;

可以使用docker [image] pull 命令直接从Docker Hub 镜像源来下载镜像。

该命令的格式为:

docker [image] pull NAME [ :TAG]

NAME 是镜像仓库名称(用来区分镜像), TAG 是镜像的标签(往往用来表示版本信息) 。通常情况下, 描述一个镜像需要包括“名称+标签“ 信息。如果在下载镜像时没有标示版本,那么下载下来的将是最新版本,标签为latest。

[root@localhost ~]# docker pull httpd
latest: Pulling from httpd //表示下载最新版的httpd镜像
e41adbd1cb5b: Pull complete
14d0dfd633f4: Pull complete
505c936535a7: Pull complete
427c82bd70cd: Pull complete
Digest: sha256:3884dc098e89d69066965a2084884f47fed0be76461b5c6c96559b1328298e31Status: Downloaded newer image for httpd:latest

下载过程中可以看出,镜像文件一般由若干层(layer)组成,427c82bd70cd这样的串是层的唯一id(实际上完整的id包括256比特,64个十六进制字符组成)。

可能有人会想到, 在不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry, 注册服务器)作为前缀,只是默认使用的是官方DockerHub服务,该前缀可以忽略。

例如, docker pull httpd命令相当于

docker pull registry.hub.docker.com/httpd命令,即从默认的

注册服务器DockerHub Registry中的httpd仓库来下载标记为latest的镜像。

03查看镜像

查看镜像的命令通常有:images、tag和inspect子命令。

1.使用images命令列出本地镜像

使用docker images 命令可以列出本地主机上已有镜像的基本信息。

docker images

例如:​​​​​​​

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
VIRTUAL SIZE
chuanshi/my_tomcat 1.1 8741c7742307 2 days ago
681.3 MB
tomcat latest 299d4c2f91fd 11 days ago
679.5 MB
httpd latest 427c82bd70cd 12 days ago
137.8 MB
registry latest 6dbc9d47b4a0 2 weeks ago
26.23 MB
redis latest a6edd7a55846 4 weeks ago
105.4 MB
mysql latest cd6bac612785 4 weeks ago
513.8 MB

REPOSITORY:表示来自于哪个仓库;

TAG:表示镜像的标签信息,标签只是标记,并不能标识镜像内容;

IMAGE ID:镜像ID,镜像的唯一标识,如果两个镜像ID相同,则说明它们实际上指向了同一个镜像,只是具有不同标签名而已;

CREATED:表示镜像最后的更新时间;

VIRTUAL SIZE:表示镜像大小,好的镜像往往体积会较小。

2.使用tag命令为镜像添加标签

为了方便在后续工作中使用特定镜像,还可以使用docker tag命令为本地镜像任意添加新的标签。

举例:​​​​​​​

[root@localhost ~]# docker tag redis:latest test_redis:1.1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
VIRTUAL SIZE
chuanshi/my_tomcat 1.1 8741c7742307 2 days ago
681.3 MB
tomcat latest 299d4c2f91fd 11 days ago
679.5 MB
httpd latest 427c82bd70cd 12 days ago
137.8 MB
registry latest 6dbc9d47b4a0 2 weeks ago
26.23 MB
redis latest a6edd7a55846 4 weeks ago
105.4 MB
test_redis 1.1 a6edd7a55846 4 weeks ago
105.4 MB
mysql latest cd6bac612785 4 weeks ago
513.8 MB

其中test_redis和redis镜像的ID号是相同的,其实对应的是同一个镜像,只是使用不同的标签而已。

3.使用inspect命令查看镜像详细信息

使用inspect命令可以获取镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。

命令的语法如下:

docker inspect 镜像名

举例:​​​​​​​

[root@localhost ~]# docker inspect redis
[
{
"Id": "a6edd7a55846043cdc25121900dee5f244334c08ddcfd9995bed9708395dac3a",
"Parent":
"5b5acb53ad733373bc3d6bbb1169d84892c42cd871c16041b9fe38126dd2d658",
"Comment": "",
"Created": "2021-08-17T14:30:06.550779326Z",
"Container":
"fa59f1c2817c9095f8f7272a4ab9b11db0332b33efb3a82c00a3d1fec8763684",
"ContainerConfig": {
"Hostname": "fa59f1c2817c",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"PortSpecs": null,
"ExposedPorts": {
"6379/tcp": {}
}

上面返回的是一个JSON格式的消息,如果只要其中某一项的内容时,可以使用-f来指定,语法格式如下:

docker insepect -f {{".项名"}} 镜像名
    [root@localhost ~]# docker inspect -f {{".Id"}} redis
    a6edd7a55846043cdc25121900dee5f244334c08ddcfd9995bed9708395dac3a

    4.使用history命令查看镜像历史

    既然镜像文件由多个层组成,那么怎么才知道各层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。​​​​​​​

    [root@localhost ~]# docker history redis
    IMAGE CREATED CREATED BY
    SIZE COMMENT
    a6edd7a55846 4 weeks ago /bin/sh -c #(nop) CMD ["redis-server"]
    0 B
    5b5acb53ad73 4 weeks ago /bin/sh -c #(nop) EXPOSE 6379
    0 B
    14890a0e7ff6 4 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["dockerentryp
    0 B
    b7a37aa916bd 4 weeks ago /bin/sh -c #(nop) COPY
    file:df205a0ef6e6df894 374 B
    e5b8c5fd5ee8 4 weeks ago /bin/sh -c #(nop) WORKDIR /data0

    04查找镜像

    使用docker search 命令可以搜索Docker Hub 官方仓库中的镜像,语法为:

    docker search [option] keyword

    举例:​​​​​​​

    [root@localhost ~]# docker search redis
    NAME DESCRIPTION
    STARS OFFICIAL AUTOMATED
    redis Redis is an open source key-value store th...
    9921 [OK]
    sameersbn/redis
    83 [OK]
    grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2
    79
    rediscommander/redis-commander Alpine image for redis-commander - Redis m...
    65 [OK]
    redislabs/redisearch Redis With the RedisSearch module pre-load...
    38
    redislabs/redisinsight RedisInsight - The GUI for Redis

    OFFICIAL:表示是官方认证的镜像;STARS:表示获得的点赞扬数

    05删除和清理镜像

    1.使用标签删除镜像

    使用docker rmi或docker image rm命令可以删除镜像,命令格式为:

    docker rmi image [image...]
      [root@localhost ~]# docker images
      REPOSITORY TAG IMAGE ID CREATED
      VIRTUAL SIZE
      centos latest cee773705895 13 hours ago
      231.2 MB
      my_centos 2.0 cee773705895 13 hours ago
      231.2 MB
      my_centos 1.0 cee773705895 13 hours ago
      231.2 MB
      上面有三个关于centos的镜像,其中my_centos:2.0和my_centos:1.0,使用的是centos镜像,只是重新
      打了标签。下面使用标签删除镜像。
      [root@localhost ~]# docker rmi my_centos:2.0
      Untagged: my_centos:2.0
      [root@localhost ~]# docker images
      REPOSITORY TAG IMAGE ID CREATED
      VIRTUAL SIZE
      centos latest cee773705895 13 hours ago
      231.2 MB
      my_centos 1.0 cee773705895 13 hours ago
      231.2 MB

      发现只有这个my_centos:2.0镜像会被删除,其它标签的镜像并不会删除。

      2.使用镜像ID删除镜像

      使用镜像ID删除时,会先删除所有指向该镜像的标签,再删除该镜像文件本身。

      以上面的centos镜像为例,使用镜像ID的方式来删除镜像。​​​​​​​

      [root@localhost ~]# docker images
      REPOSITORY TAG IMAGE ID CREATED
      VIRTUAL SIZE
      centos latest cee773705895 13 hours ago
      231.2 MB
      my_centos 1.0 cee773705895 13 hours ago
      231.2 MB
      [root@localhost ~]# docker rmi -f cee773705895
      Untagged: centos:latest
      Untagged: my_centos:1.0
      Deleted: cee773705895f75ee1c8875c79051eb2f9dfff5095c43465460aa97d20028773
      Deleted: dd60c9449c5fd97c81eda60d6b311a9879ddd37c020293f69c207fa00b38cbfb
      Deleted: 0363682f473075e9846bfb50ad6d90a0ee6080b208b49e425721ed14523fb43b
      删除了centos:latest和my_centos:1.0两个标签的镜像

      06使用commit命令创建镜像

      通常创建Docker镜像有两种方法:

      一是:使用commit命令创建;

      二是:使用dockerfile来文件来创建;

      本节主要介绍如何使用commit命令来创建。可以将此想象为我们是在往版本控制系统里提交变更,我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提交为一个新境像。

      使用commit创建境像的语法如下:​​​​​​​

      docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
      OPTIONS说明:
      -a :提交的镜像作者;
      -c :使用Dockerfile指令来创建镜像;
      -m :提交时的说明文字;
      -p :在commit时,将容器暂停。
      [root@localhost ~]# docker ps
      CONTAINER ID IMAGE COMMAND CREATED
      STATUS PORTS NAMES
      9a545ce72d99 redis "docker-entrypoint.s 2 weeks ago
      Up 2 seconds 0.0.0.0:6379->6379/tcp redis-test
      [root@localhost ~]# docker commit -a "chuanshi.com" -m "my redis" 9a545ce72d99
      my_redis:v1.0
      1faa62dd428ca588eef3493c509cf0393511457bd25498c75d10ee1921ee401f
      [root@localhost ~]# docker images
      REPOSITORY TAG IMAGE ID CREATED
      VIRTUAL SIZE
      my_redis v1.0 1faa62dd428c 9 seconds ago
      105.4 MB

      下次分享docker容器的常见操作,敬请关注!

      更多推荐