注:本文基于《Docker-从入门到实践》的学习
Docker Hub (https://hub.docker.com/search/?q=&type=image ) 有许多高质量的镜像,先说说如何获取这些镜像。
从 Docker 镜像仓库获取镜像的命令是 docker pull 。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
现在我们获取个 ununtu的官方镜像试一下:
没有制定镜像仓库地址,所以会默认去官方拿,而镜像名称是 ubuntu:16.04 。
因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。
下载过程中可以看出,之前写的初始Docker学习中提及的分层储存的概念,镜像是多层储存所构成。
所以下载也是一层一层去下载,不是单个文件。每一层的ID也输出了(12位),也打印出了完整的sha256摘要。
有了镜像后,就能够以这个镜像为基础启动并运行一个容器。
docker run --name webserver -d -p 80:80 nginx
这条命令会用 nginx 镜像启动一个容器,命名为 webserver ,并且映射了 80 端口。
这样我们可以用浏览器去访问这个 nginx 服务器。
这里就简单的启动个nginx镜像,由于我没有下载,它自动下载并启动了。
以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。
然后,我们用
覆盖了 /usr/share/nginx/html/index.html 的内容。再刷新浏览器的话,会发现内容被改变了。Hello Docker!
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。
这里简要的说明一下上面用到的参数。
如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的/usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。所以一般不建议修改镜像后再commit保存镜像,建议使用Dockerfile定制镜像。
通过 ps -n 条数 可以查看运行的容器(包括运行中和已停止的容器)
这里可以看到 之前我们运行了两次就停止的hello-world,还有一个还在运行的 nginx
通过 docker stop 容器ID
即可停止
当然想再次启动也可以通过 docker start 容器ID
进行启动
通过 docker logs 容器ID
可查看容器运行的相关日志(查看下之前运行的万恶之源)
也可以通过 docker attach 容器ID
进行实时连接查看(这里我页面刷新,日志实时更新)
docker image ls
如果要删除本地的镜像,可以使用 docker image rm 命令
docker image rm [选项]<镜像1>[<镜像2> ....]
其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。
如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类,一类是Untagged ,另一类是 Deleted 。我们之前介绍过,镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。
因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 dockerimage rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。
镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。
除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
一些基本的操作和指令到此结束,后面将讲解Dockerfile和进一步学习其他指令。
注:可以通过 命令 --help 的方式查看其他参数的使用方法