Docker笔记(四):Docker镜像管理
原文地址:http://blog.jboost.cn/docker-4.html
在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的关系——没有类的定义就谈不上实例的创建与使用,没有镜像的定义就谈不上容器的创建与运行。
1. 获取镜像
镜像从哪里来,一般两个途径,一是公共镜像库,如官方镜像库Docker Hub,上面有大量的高质量的镜像直接可拿来用;二是自定义,我们可基于一个已有镜像,在其基础上增加一些层(还记得镜像的分层存储特性吧),然后构建形成自己的镜像。
如果我们知道某个镜像的名称,则可直接通过docker pull
来下载镜像到本地,如ubuntu、redis、nginx等,docker pull
命令的格式如下(中括号表示可有可没有)
docker pull [选项] [Docker Registry的地址[:端口号]/]仓库名[:标签]
其中选项可设置:
- -a, –all-tags:下载仓库中所有标签(一般指版本)的镜像
- –disable-content-trust:跳过镜像验证,默认为true
Docker Registry的地址即镜像仓库地址,一般为域名或IP加端口号,如果不指定则默认为Docker Hub;仓库名包含两部分,<用户名>/<软件名>,对于Docker Hub,如果不给出用户名,则默认为library,表示官方提供;标签一般是对应软件的版本号,如果不指定则默认为latest。
比如我们要下一个nginx镜像,则可执行如下命令
[root@iZwz9dbodbaqxj1gxhpnjxZ ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
fc7181108d40: Already exists
d2e987ca2267: Pull complete
0b760b431b11: Pull complete
Digest: sha256:48cbeee0cb0a3b5e885e36222f969e0a2f41819a68e07aeb6631ca7cb356fed1
Status: Downloaded newer image for nginx:latest
这里我们没有指定选项,也没有指定镜像仓库地址,那么默认会从Docker Hub获取镜像(但Docker Hub由于在国外,速度比较慢,所以一般要设置国内加速器,参考Docker笔记(三):Docker安装与配置第二部分:配置国内镜像),也没有给出用户名,所以默认是library(第三行),没有指定标签,所以默认是latest(第二行),由第四至第六行可见,这个镜像包含三个层,并且第一个层已经存在了(之前下载的镜像已经包含了这个层, 直接复用),镜像分层的概念及层的复用,应该已经理解了。
如果我们不知道镜像的完整名称怎么办,那就搜索一下,有两个途径,一是通过命令,假设我们记不起nginx全称了, 只记得ngi
,则可通过如下命令搜索
[root@iZwz9dbodbaqxj1gxhpnjxZ ~]# docker search ngi
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… [OK]
bitnami/nginx Bitnami nginx Docker Image [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS…
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes
nginxdemos/hello NGINX webserver that serves a simple page co… [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… [OK]
crunchgeek/nginx-pagespeed Nginx with PageSpeed + GEO IP + VTS + more_s…
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. [OK]
...
该命令会从Docker Hub搜索镜像名包含ngi
的镜像,其中STARS表示收藏用户数,OFFICIAL为[OK]表示官方提供的镜像,AUTOMATED [OK]表示由自动构建生成,一般选择STARS最多,官方提供的镜像。
这种方式获取到的信息有限,比如具体包含哪些版本不知道。还有一个途径是直接在Docker Hub网站上搜索,打开 https://hub.docker.com , 在搜索框输入ngi
,如下图
则会列出所有满足条件的镜像,点开nginx
结果链接,可以看到提供的版本(通过版本链接可以查看定义对应镜像的Dockerfile),及相应的文档说明。这种方式获取的信息更加全面,所以推荐这种方式!
另外,当我们没有执行docker pull
,直接通过docker run xx
来运行一个容器时,如果没有对应的镜像,则会先自动下载镜像,再基于镜像启动一个容器,比如我们在Docker笔记(三):Docker安装与配置中检验docker是否安装成功时运行的hello-world
2. 管理本地镜像
将镜像下载到本地后,我们可以基于镜像来创建、运行容器,及对镜像进行管理。
查看本地镜像
[root@iZwz9dbodbaqxj1gxhpnjxZ ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f68d6e55e065 weeks ago 109MB
mysql latest c7109f74d339 weeks ago 443MB
hello-world latest fce289e99eb9 months ago .84kB
上面各列依次列出了镜像名称、标签(版本)、镜像ID、创建时间、镜像大小。镜像可以拥有多个标签(版本)。镜像的大小总和一般要大于实际的磁盘占有量,为什么?回忆一下镜像的分层存储概念,层是可以复用的,某个层其中一个镜像有了,另一个镜像就不会再下载了。口说无凭,我们来验证下,docker system df
可列出镜像、容器、数据卷所占用的空间
[root@iZwz9dbodbaqxj1gxhpnjxZ ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images .1MB .1MB (%)
Containers 0B 0B
Local Volumes 0B 0B
Build Cache 0B 0B
通过docker image ls
列出的各镜像大小总共约552MB,但这里列出的镜像大小只有约497MB,这下有凭有据了吧。
根据条件列出镜像
docker image ls nginx # 根据名称列出镜像
docker image ls nginx:latest # 根据名称与标签列出镜像
docker image ls -f since=hello-world:latest # -f 是--filter的缩写,过滤器参数,列出在hello-world:latest之后建立的镜像,before=hello-world:latest则查看之前建立的镜像
指定显示格式
docker image ls -q # 只显示镜像ID
docker image ls --digests # 列出镜像摘要 docker image ls --format "{{.ID}}: {{.Repository}}" # 使用Go的模板语法格式化显示,这里显示格式为 镜像ID:镜像名称
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" # 自己定义表格格式
虚悬镜像
有时候会看到某些镜像既没有仓库名,也没有标签,均为 <none>
。这些镜像原本是有镜像名和标签的,随着官方镜像维护,发布了新版本后(新版本会复用之前的镜像名称与标签,一般是bug修复版),重新docker pull xx
时, 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了<none>
。除了docker pull
可能导致这种情况, docker build
也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none>
的镜像。这类无标签镜像被称为虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:
docker image ls -f dangling=true
一般虚悬镜像没什么意义了,可以通过如下命令删除
docker image prune
中间层镜像
为了加速镜像构建、重复利用资源,Docker会利用中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的docker image ls
列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,可以加 -a
$ docker image ls -a
这样会看到很多无标签的镜像,与虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
删除镜像
删除镜像命令格式
docker image rm [选项] <镜像1> [<镜像2> ...]
选项可以设置:
- -f, –force 强制删除镜像
- –no-prune 不删除没有标签的父镜像
<镜像1>、<镜像2> 等可以是镜像的名称,镜像的全ID,也可以是镜像ID的前面几个数字(只要与其它镜像区分开来就行),或者是镜像摘要。 如删除镜像名称为mysql的镜像
[root@iZwz9dbodbaqxj1gxhpnjxZ ~]# docker image rm mysql
Untagged: mysql:latest
Untagged: mysql@sha256:415ac63da0ae6725d5aefc9669a1c02f39a00c574fdbc478dfd08db1e97c8f1b
Deleted: sha256:c7109f74d339896c8e1a7526224f10a3197e7baf674ff03acbab387aa027882a
Deleted: sha256:35d60530f024aa75c91a123a69099f7f6eaf5ad7001bb983f427f674980d8482
Deleted: sha256:49d8bb533eee600076e3a513a203ee24044673fcef0c1b79e088b2ba43db2c17
...
由上面命令的执行结果可见,删除镜像包括另个行为:Untagged、Deleted。
当我们使用上面命令来删除镜像的时候,实际上是在要求删除某个/某些标签的镜像。所以首先需要做的是将满足要求的所有镜像标签都取消,这就是Untagged的行为。一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么Delete行为就不会发生,仅仅是取消了这个镜像的符合要求的所有标签。所以并非所有的docker image rm
都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
当该镜像所有的标签都被取消了,该镜像很可能就失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。如果某个其它镜像正依赖于当前镜像的某一层,这种情况,依旧不会触发删除该层的行为。直到没有任何镜像依赖当前层时,才会真实的删除当前层。
另外还需要注意是容器对镜像的依赖。如果基于镜像启动的容器存在(即使容器没有运行处于停止状态) ,同样不可以删除这个镜像。我们之前说了容器是以镜像为基础,再加一层容器存储层组成的多层存储结构去运行的。所以如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
通过组合命令来删除
docker image rm $(docker image ls -q nginx) # 删除镜像名称为nginx的所有镜像
docker image rm $(docker image ls -q -f since=hello-world:latest) # 删除所有在hello-world:latest之后建立的镜像
3. 总结
本文对镜像的获取及本地镜像的基本管理做了介绍,本文镜像的获取途径都是从镜像仓库直接获取,镜像的另一个获取途径便是自定义,接下来会通过实例来进行介绍,欢迎关注。
我的个人博客地址:http://blog.jboost.cn
我的微信公众号:jboost-ksxy (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)
———————————————————————————————————————————————————————————
Docker笔记(四):Docker镜像管理的更多相关文章
- Docker笔记6:Docker 常见命令及镜像管理
目 录 一.Docker 常用命令 docker version 命令 docker info 命令 二.Docker 镜像管理 搜索镜像:docker search 镜像名 获取镜像:docker ...
- 一张图比較 Docker 和 Git:镜像管理设计理念
Docker 的镜像管理设计中大量借鉴了 Git 的理念. 以下这张图将对两者的核心概念和操作进行比較,有助于大家高速掌握管理 Docker 镜像的正确方式. watermark/2/text/aHR ...
- Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离
Docker的安装 一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- docker第三篇 镜像管理基础
docker 工作原理: 常用的命令docker run .create .start... 都是客户端命令 Docker Daemon 接收到客户端传过来的命令以后 docker daemon会根据 ...
- 六、【Docker笔记】Docker数据管理
前几节我们介绍了Docker的基本使用和三大核心概念,那么我们在使用Docker的过程中,Docker中必然产生了大量的数据,对于这些数据我们需要查看或者对这些数据进行一个备份,也有可能容器之间的数据 ...
- 二、【Docker笔记】Docker的核心概念及安装
Docker主要有三大核心的概念,分别为镜像(Image).容器(Container)及仓库(Repository). 一.核心概念 1.Docker镜像 Docker镜像其实与虚拟机镜像很类似, ...
- 【Docker笔记】-开启TCP管理端口
如果我们通过docker来整合spring cloud项目,可以通过maven-docker插件将构建好的镜像直接推送到docker服务器上,但是生产环境建议关闭该功能,为了安全考虑.开启tcp远程监 ...
- docker之私有仓库镜像管理
一.查看本地镜像 二.给镜像打标记(tag ) [root@node03 ~]# docker tag wordpress:v1 192.168.1.197:5000/wordpress:v1 2.删 ...
- 基于【 Docker】四 || Docker常用镜像安装
一.nginx安装 1.拉取镜像:docker pull nginx 2.启动容器:docker run -d -p 80:80 nginx 3.查看nginx:ps aux | grep 'ngin ...
- Docker系列四: 使用UI管理docker容器
一.什么是Portainer? Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容 ...
随机推荐
- ELINK编程器能用来做什么
以前 产品量产与测试的时候,在电脑上用JATG/SWD编程器或串口下载器等工具下载程序到产品中,效率低且操作复杂 现在 可以用ELINK脱机编程器来摆脱电脑并降低操作复杂度,只需把程序文件下载到 ...
- Docker笔记03-docker 网络模式
docker网络模式分为5种 Nat (Network Address Translation) Host other container none overlay 第一种 Nat模式 docker的 ...
- 2015元旦第一弹——WP8.1应用程序栏(C#后台代码编写)
//第一次写博文,以后还请各位道友互相关照哈.废话不多说,直接进入正题. 相信大家对于如何在XAML添加应用程序栏应该很清楚,不清楚的话,可以打开新建个Pviot应用 就有系统自带的菜单栏. 本文主要 ...
- “真正的工作不是说的天花乱坠”,Torvalds 说, “而是在于细节”(Torvalds 认为成功的项目都是99%的汗水和1%的创新)
在刚刚结束的加利福尼亚州的开源领袖峰会(2月14日-16日)上,Linus Torvalds 接受了外媒的采访,分享了他如何管理 Linux kernel 的开发以及他对工作的态度. “真正的工作不是 ...
- 小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建
原始函数是这样的 kernel32!CreateProcessInternalW: 00000000`7738e750 4c8bdc mov r11,rsp 00000000 ...
- MSB3268 .Net 4.0工程 引用BCL错误
Severity Code Description Project File Line Suppression StateWarning MSB3268 The primary reference & ...
- myeclipse2018的下载安装教程
首先注意事项!!!!!!! 在安装破解前是不可以打开软件的 jdk版本不能是10版本,1.8或1.9都可以 附上MyEclipse2018的百度云下载链接: 链接:https://pan.baidu. ...
- SYN012型B码时统
SYN012型B码时统 产品概述 SYN012型B码时统是由西安同步电子科技有限公司精心设计.自行研发生产的一款通用性时统终端,内置高精度恒温晶振,接收GPS北斗双模卫星信号,10MHz外部参考 ...
- 一、Linux常用命令
1.ls 作用:列出文件信息,默认为当前目录下 语法: -a:列出所有的文件,包括以.开头的隐藏文件 -d:列出目录本身,并不包含目录中的文件 -h:和-l一起使用,文件大小人类易读 -l:长输出(“ ...
- Spring Boot:使用Memcached缓存
综合概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用.API调用或者是页面 ...