提取知识点
Docker
- 使用
docker pull 仓库名
进行获取镜像 - 镜像是由多层存储所构成,下载镜像时是一层一层去下载
- 下载过程中给出了每一层的 ID 的前 12 位
- 使用
docker image ls
或docker images
命令列出镜像 - 官方给提供的镜像很精简
docker run
就是运行容器的命令- 容器之间存在隔离机制(沙箱机制),互不影响
- 容器的修改不会影响镜像
- 使用
docker rmi 镜像名
或docker image rm 镜像名
删除镜像 - 使用
docker image prune -f
清理镜像
目录
一、概述
二、从Docker镜像仓库获取镜像
三、列出Docker镜像
四、运行Docker镜像
五、删除Docker镜像
六、清理Docker镜像
内容
一、概述
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像,默认从官方镜像库Docker Hub
官网 下载。
二、从Docker镜像仓库获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull
。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
注:其中[]中括号是可选填项
如获取tomcat镜像的最简形式 docker pull tomcat
这里没有写 选项
、Docker Registry 地址/
、:端口号
、:标签
具体的选项
可以通过 docker pull --help
命令看到
如果不填写 Docker Registry 地址/
和:端口号
则默认使用官方地址也就是Docker Hub
(虽然我们使用了镜像加速器,仅是下载地址走了加速器,但加速器的内容和官方是同步的)
如果不填写 :标签
则默认使用:latest
仓库名
:仓库名是两段式名称,即 <用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为 library
,也就是官方镜像,这里的仓库名全称为 library/tomcat
。
再举个例子:
我们获取Unbunt 16.04版本的镜像
docker pull ubuntu:16.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub
获取镜像。而镜像名称是 ubuntu:16.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 16.04
的镜像。
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256
的摘要,以确保下载一致性。
在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256
的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。
三、列出Docker镜像
要想列出已经下载下来的镜像,可以使用 docker image ls
或 docker images
命令。
列表包含了 仓库名
、标签
、镜像 ID
、创建时间
以及 所占用的空间
。
其中仓库名
、标签
在 二、从Docker镜像仓库获取镜像 已经介绍过了。
镜像 ID
则是镜像的唯一标识,一个镜像可以对应多个标签,ID相同则是相同的镜像。
通过观察我们发现,我们下载的ubuntu系统大小一般都是几个G,而为什么在这里ubuntu镜像的SIZE
很小呢?
因为Docker获取的Ubuntu系统,仅保证这个Ubuntu系统能正常运行就可以,其他多余的服务全部删除,大大减小了系统的体积,如果在此Ubuntu系统上下载别的软件,有别的依赖,它再自行下载其依赖扩充系统。
关于Docker镜像体积的问题:
如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub
上看到的镜像大小不同。比如,ubuntu:16.04 镜像大小,在这里是 119MB,但是在 Docker Hub 显示的却是 44 MB。
这是因为 Docker Hub
中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub
所显示的大小是网络传输中更关心的流量大小。而 docker image ls
显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
因为列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS
,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
可以通过docker system df
命令来便捷的查看镜像
、容器
、数据卷
所占用的空间。
四、运行Docker镜像
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04
为例,如果我们打算启动里面的 bash
并且进行交互式操作
的话,可以执行下面的命令。
docker run -it --rm \
ubuntu:16.04 \
bash
注:多行命令使用 反斜杠 \
分隔 ,\
前面有个空格
这条命令是:基于ubuntu 16.04这个镜像运行一个容器,带着 -it
--rm
这两个选项
(后面介绍),想运行
的是这个镜像中的bash
程序。
当我们看到root@
后的计算机名称变化,就说明我们登录了Docker创建的容器Ubuntu中,此名称82aa34b21288
是随机的。
此处体现了Docker的秒级启动
,我们进输入了上述命令,然后执行,就瞬间启动了一个ubuntu系统。
我们可以在Docker中ubuntu容器中输入 cat /etc/os-release
查看系统版本
我们可以通过 exit
(或 ctrl+D)退出这个容器。
docker run
就是运行容器的命令,下面对上述出现的选项
-it
、--rm
进行详解
-it
:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash
执行一些命令并查看返回结果,因此我们需要交互式终端(将主线程交给Docker)。
--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm
(后面会介绍)。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm
可以避免浪费空间。
【列出正在运行的容器 docker ps
列出所有容器 docker ps -a
如果我们不加 --rm
,当我们退出了容器后,运行 docker ps -a
时,则还会存在刚运行的容器,如下图
但如果我们加 --rm
,退出了容器后,运行 docker ps -a
时,则无容器存在,如下图
】
另外命令中的ubuntu:16.04
、bash
说明如下:
ubuntu:16.04
:这是指用 ubuntu:16.04
镜像为基础来启动容器。
bash
:放在镜像名后的是命令
,这里我们希望有个交互式 Shell
,因此用的是 bash
。
进入容器后,我们可以在 Shell
下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release
,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 16.04.4 LTS
系统。
我们可以打开多个shell窗口对同一镜像进行多次运行,说明镜像可以创建多个容器,且各个容器之间相互隔离(隔离机制、沙箱机制、沙盒机制),互不影响,并且也不影响镜像本身
五、删除Docker镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
或
docker rmi <镜像> [<镜像2> ...]
其中,<镜像>
可以是镜像标签(镜像名)
、镜像短 ID
、镜像长 ID
或者 镜像摘要
。
1.使用镜像标签删除镜像
镜像标签(镜像名)
,也就是 <仓库名>:<标签>
,来删除镜像。
docker image rm ubuntu:16.04
Tag标签相关
注:当同一个镜像拥有多个标签的时候,docker删除命令只是删除了该镜像多个标签中的指定标签,并不影响镜像文件,相当于想出了镜像的一个标签副本。
当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,但可以使用 -f
参数 强制删除容器,如强制删除ubuntu16:04
使用下述命令
docker image rm -f ubuntu:16.04
但通常并不推荐使用 -f 参数来强制删除一个存在容器依赖的镜像,而是应先删除依赖该镜像的所有容器(删除容器 后面会介绍),再来删除镜像。
另我们还可以使用tag
命令添加镜像标签:
为了方便在后续的工作中使用特定镜像,可以使用 docker tag命令来为本地镜像任意添加新的标签,如添加一个新的myubuntu:16.04
镜像标签
$ docker tag ubuntu:16.04 myubuntu:16.04
myubuntu:16.04
和ubuntu:16.04
的IMAGE ID
是完全一致的,实际上指向同一个镜像文件,只是别名不同,使用docker tag
命令添加的标签类似链接的作用。
2.使用镜像短ID 镜像长ID删除镜像
镜像长ID
也是完整 ID
,来删除镜像。使用脚本的时候可能会用长 ID
,但是人工输入就太累了,所以更多的时候是用 短 ID
来删除镜像。docker image ls
默认列出的就已经是短 ID
了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。
docker image rm 想删除的短id
我们也可以用
使用 镜像摘要
精确删除镜像。
先查看镜像摘要 docker image ls --digests
查出DIGEST后使用 docker image rm node@镜像摘要
docker image rm node@sha256:7cdf9dca1472da80e7384403c57b0632753a3a5cdf4f310fc39462e08af8ef39
六、清理Docker镜像
使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune [选项]
命令进行清理。
选项包括
- -a,-all:删除所有无用镜像,不光是临时镜像
- -filter filter:只清理符合给定过滤器的镜像
- -f,-force:强制删除镜像,而不进行提示确认
如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间
docker image prune -f