使用 Docker 镜像
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
Docker 镜像仓库地址:
地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker Hub。
仓库名:
仓库名是两段式名称,即 <用户名>/<软件名> 。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。
例如拉取ubuntu:18.04
docker pull ubuntu:18.04
没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04 ,因此将会获取官方镜像 library/ubuntu仓库中标签为 18.04 的镜像。
从下载过程中可以看到镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。
Docker Hub 下载镜像非常缓慢,可以配置加 镜像速器。
运行
启动里面的 bash 并且进行交互式操作,交互式启动容器的bash并且查看系统版本信息
docker run -it ubuntu:18.04 bash
cat /etc/os-release
-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。打算进入 bash 执行一些命令并查看返回结果,因此需要交互式终端。
ubuntu:18.04 :这是指用 ubuntu:18.04 镜像为基础来启动容器。
bash :放在镜像名后的是 命令,这里希望有个交互式 Shell,因此用的是bash 。
进入容器后,可以在 Shell 下操作,执行任何所需的命令。这里,执行了
cat /etc/os-release ,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 18.04.1 LTS 系统。最后通过 exit 退出了这个容器。
列出镜像 docker image ls
仓库名 、 标签 、 镜像 ID 、 创建时间 以及 所占用的空间
需要注意的问题是, docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
查看镜像、容器、数据卷所占用的空间。
docker system df
显示镜像摘要
docker image ls --digests
中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话:docker image ls -a
补充几个:
docker image ls ubuntu 根据仓库名列出镜像
docker image ls ubuntu:18.04 列出特定的某个镜像,也就是说指定仓库名和标签
docker image ls -f since=mongo:3.2 希望看到mongo:3.2 之后建立的镜像
docker image ls -q 只显示id
docker image ls --format "{{.ID}}: {{.Repository}}" 显示id和仓库名(这个比较好用)
docker image ls --format "table {{.ID}} {{.Repository}} {{.Tag}}" 以表格等距显示,并且有标题行,和默认一样,不过自己定义列
删除本地镜像
docker image rm [选项] <镜像1> [<镜像2> ...] 或者直接 docker rmi ...
其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。
Untagged 和 Deleted 镜像是分层存储的,如果当前镜像还被其他层更高的层使用,或者是别的标签也指向这个镜像,那么所谓的删除就只是删除这个标签对应的就是Untagged,如果只有这一个标签再使用,并且其他层也不依赖这个镜像,那么就会真的执行Deleted。
PS:如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。
清理镜像
docker image prune
它支持的子命令有:
-a, --all
: 删除所有没有用的镜像,而不仅仅是临时文件;-f, --force
:强制删除镜像文件,无需弹出提示确认;
另外,执行完 docker image prune
命令后,还是告诉我们释放了多少存储空间!