Docker容器技术介绍(二) --- Docker镜像操作
镜像(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 --help Usage: 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 images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest fae454d6fc7b 4 days ago 434.5 MB centos v7.0 fae454d6fc7b 4 days ago 434.5 MB mysql 5.6.37 c6d1fd492efc 10 days ago 299 MB mysql latest 16f9fffc75d8 10 days ago 412.3 MB ubuntu 14.04 b44ce450cb60 2 weeks ago 188 MB quay.io/coreos/etcd v3.0.4 3b17a5f34e6c 14 months ago 43.3 MB hub.c.163.com/public/ubuntu 14.04 f6a575b7c805 18 months ago 237.1 MB [root@localhost ~]#
Docker inspect
列出镜像的详细信息,返回的是一个json格式文本
[root@localhost ~]# docker inspect --help Usage: 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 --help Usage: 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:latest
Untagged: mysql:latest
Deleted: 16f9fffc75d8025f10ecc10fbf5916e08e0f77caae06a624758cd69c010d31fa
Deleted: 630f7c703d5fa67a3e777a2bfcdcd98135e397cee75a5a52bce0f627a5cbbd4c
Deleted: bc2fe3c2835ad5fb10769599b5613f878cc8b9bbebcfa89f9521fa2f2ffaa839
Deleted: 01e674edc677c50fac4285bc24d05b1ec759e5f0a6ba9b51d85e24ef85ed73a5
Deleted: 078c98cfff73f1365bb1d3ff56b66a3456813fd6fbd98634a62b7856612e2824
Deleted: 82ea38cf1e01d990ae60ba2ab974fa5790d3c1e51703009e66e8fc7aea108002
Deleted: c225ff44bb32a6e94748a545ba1ed1c25fe2688785040b9a503f45732c9746d5
Deleted: 4c7d19513632255c1aa23bcc385283226e760516f4ca002f835bd0677714bf59
Deleted: 1ae42694d557736950bc6688c424afdf3684eb16ed226ed273ff8329f04bf5b9
Deleted: f3bea8e00516f539f68f30d1d01b0838b69a78f3ece67f4d963cfe9117dddbfe
Deleted: 8daa37e24d309600e3e3d4dfbdae180f7921773236b1e4809313dd1a14f1bd2c
Deleted: db133f4e6ba522fedd385946121492ce639b24d6945f3e4dc56f642f3dfedfe9
Deleted: 1be00dbf1d8f6c2bb5b7dbedfe53c43c9238e5fda7b2d0d62369588fda055995
[root@localhost ~]#
docker rmi 命令也可以跟镜像ID(IMAGE ID),这样所有指向该镜像的TAG都会被删除,包括镜像文件。
Docker镜像的创建,修改,以及提交由于和容器概念以及Dockerfile相关,限于篇幅,将在后续文章中介绍,欢迎继续关注
That\’s It!