Docker容器技术介绍(二) --- Docker镜像操作

来源:互联网 发布:网络贷被全面叫停政策 编辑:程序博客网 时间:2024/05/29 18:40

镜像(image)是Docker的核心概念之一,掌握镜像是熟练使用Docker的前提,接下来就主要针对Docker镜像的操作做一介绍,希望对大家有帮助。

Docker想要启动一个容器,则必须要先有一个镜像,镜像是创建容器的模板和源程序,docker对镜像的管理灵感很大程度来源于git,比如镜像也有pull和push操作。如同github上托管了数以万计的项目一样,Docker的官方镜像库Docker Hub(https://hub.docker.com/)上也托管了几十万个公开的镜像供我们下载使用,可以说正是由于镜像的存在才让我们的Docker变得如此流行。

docker search

使用 docker search 命令可以用关键字从 Docker Hub 上来查找搜索镜像。

可以输入命令  docker search --help 来查看使用帮助



可以看到该命令使用非常简单,支持的参数也不多, -s 参数可以指定只搜索镜像最少获得的star数,比如只展示获得的STARS数在50以上的mysql镜像:docker search -s 50 mysql




docker pull

使用 docker pull 命令可以从Docker Hub上拉取镜像,docker pull 命令同样非常的简单:

[root@localhost ~]# docker pull --helpUsage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]Pull an image or a repository from the registry  -a, --all-tags=false    Download all tagged images in the repository  --help=false            Print usage[root@localhost ~]# 

一般来说,一个镜像可以用 NAME:TAG 来标识,其中 NAME 是镜像名称,比如前述的 mysql 镜像, TAG 一般用来表示镜像的版本,如果你再拉取镜像时没有指明TAG,则用默认的 :latest 作为TAG,例如:




由于最新的镜像可能并不稳定,所以我们在pull镜像时往往要加上特定的TAG来下载指定的版本,比如下载5.6.37版本的mysql镜像:



那我们怎么知道一个镜像有哪些TAG版本呢,这时我们可以去Docker Hub网站(https://hub.docker.com/)去查看,先搜索一个镜像,然后点进去,点击tag列表






Docker images

没什么说的,列出本地的镜像

[root@localhost ~]# docker imagesREPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZEcentos                        latest              fae454d6fc7b        4 days ago          434.5 MBcentos                        v7.0                fae454d6fc7b        4 days ago          434.5 MBmysql                         5.6.37              c6d1fd492efc        10 days ago         299 MBmysql                         latest              16f9fffc75d8        10 days ago         412.3 MBubuntu                        14.04               b44ce450cb60        2 weeks ago         188 MBquay.io/coreos/etcd           v3.0.4              3b17a5f34e6c        14 months ago       43.3 MBhub.c.163.com/public/ubuntu   14.04               f6a575b7c805        18 months ago       237.1 MB[root@localhost ~]# 

Docker inspect

列出镜像的详细信息,返回的是一个json格式文本

[root@localhost ~]# docker inspect --helpUsage: docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]Return low-level information on a container or image  -f, --format=      Format the output using the given go template  --help=false       Print usage[root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker inspect mysql:5.6.37[{    "Id": "c6d1fd492efc2ff14e626bda7ff4a648ffb19f149f0d76fb3b28abdb99e3be55",    "Parent": "cd35adb409a8bfbd932b48bb69ea261222960f780534aca1483593421c327a10",    "Comment": "",    "Created": "2017-09-19T08:14:40.227598662Z",    "Container": "1e51e628faca8157b00ca4b39bc6bc63ef2ee5b256cb3f273dbb2e9edde95678",    "ContainerConfig": {        "Hostname": "1e51e628faca",        "Domainname": "",        "User": "",        "AttachStdin": false,        "AttachStdout": false,        "AttachStderr": false,        "PortSpecs": null,        "ExposedPorts": {            "3306/tcp": {}        },        "Tty": false,        "OpenStdin": false,        "StdinOnce": false,        "Env": [            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",            "GOSU_VERSION=1.7",            "MYSQL_MAJOR=5.6",            "MYSQL_VERSION=5.6.37-1debian8"        ],        "Cmd": [            "/bin/sh",            "-c",            "#(nop) ",            "CMD [\"mysqld\"]"        ],        "Image": "sha256:95e223e85dfa38832bd9c637fc3359d3bf5b5e386de637cc856087dab7fcb125",        "Volumes": {            "/var/lib/mysql": {}        },        "VolumeDriver": "",        "WorkingDir": "",        "Entrypoint": [            "docker-entrypoint.sh"        ],        "NetworkDisabled": false,        "MacAddress": "",        "OnBuild": [],        "Labels": {}    },    "DockerVersion": "17.06.2-ce",    "Author": "",    "Config": {        "Hostname": "",        "Domainname": "",        "User": "",        "AttachStdin": false,        "AttachStdout": false,        "AttachStderr": false,        "PortSpecs": null,        "ExposedPorts": {            "3306/tcp": {}        },        "Tty": false,        "OpenStdin": false,        "StdinOnce": false,        "Env": [            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",            "GOSU_VERSION=1.7",            "MYSQL_MAJOR=5.6",            "MYSQL_VERSION=5.6.37-1debian8"        ],        "Cmd": [            "mysqld"        ],        "Image": "sha256:95e223e85dfa38832bd9c637fc3359d3bf5b5e386de637cc856087dab7fcb125",        "Volumes": {            "/var/lib/mysql": {}        },        "VolumeDriver": "",        "WorkingDir": "",        "Entrypoint": [            "docker-entrypoint.sh"        ],        "NetworkDisabled": false,        "MacAddress": "",        "OnBuild": [],        "Labels": null    },    "Architecture": "amd64",    "Os": "linux",    "Size": 0,    "VirtualSize": 299024930}][root@localhost ~]# 

Docker history

列出镜像各层的创建过程



Docker tag

[root@localhost ~]# docker tag --helpUsage: docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]Tag an image into a repository  -f, --force=false    Force  --help=false         Print usage

给镜像打标签,相当于给本地的镜像重新起了个别名,方便我们操作,例如:


注意虽然上面分别列出了mysql和 hellomysql,但是它们的镜像ID是一样的,并且目前它们指向的是同一个镜像文件,镜像文件并不是重新被复制了一份,你可以对比 git中的新建分支操作。


Docker rmi

删除一个或多个镜像


由于上面删除的是一个 TAG, 但是该TAG指向的镜像还有其他的TAG指向他,所以只是删除了这个TAG,并没有真正的删除镜像文件

但是注意,当一个镜像只有一个TAG指向时,删除这个TAG会把镜像文件删除:

[root@localhost ~]# docker rmi mysql:latestUntagged: mysql:latestDeleted: 16f9fffc75d8025f10ecc10fbf5916e08e0f77caae06a624758cd69c010d31faDeleted: 630f7c703d5fa67a3e777a2bfcdcd98135e397cee75a5a52bce0f627a5cbbd4cDeleted: bc2fe3c2835ad5fb10769599b5613f878cc8b9bbebcfa89f9521fa2f2ffaa839Deleted: 01e674edc677c50fac4285bc24d05b1ec759e5f0a6ba9b51d85e24ef85ed73a5Deleted: 078c98cfff73f1365bb1d3ff56b66a3456813fd6fbd98634a62b7856612e2824Deleted: 82ea38cf1e01d990ae60ba2ab974fa5790d3c1e51703009e66e8fc7aea108002Deleted: c225ff44bb32a6e94748a545ba1ed1c25fe2688785040b9a503f45732c9746d5Deleted: 4c7d19513632255c1aa23bcc385283226e760516f4ca002f835bd0677714bf59Deleted: 1ae42694d557736950bc6688c424afdf3684eb16ed226ed273ff8329f04bf5b9Deleted: f3bea8e00516f539f68f30d1d01b0838b69a78f3ece67f4d963cfe9117dddbfeDeleted: 8daa37e24d309600e3e3d4dfbdae180f7921773236b1e4809313dd1a14f1bd2cDeleted: db133f4e6ba522fedd385946121492ce639b24d6945f3e4dc56f642f3dfedfe9Deleted: 1be00dbf1d8f6c2bb5b7dbedfe53c43c9238e5fda7b2d0d62369588fda055995[root@localhost ~]# 

docker rmi 命令也可以跟镜像ID(IMAGE ID),这样所有指向该镜像的TAG都会被删除,包括镜像文件。


Docker镜像的创建,修改,以及提交由于和容器概念以及Dockerfile相关,限于篇幅,将在后续文章中介绍,欢迎继续关注

That's It!

原创粉丝点击