在使用Docker时,我们从一个基图像开始。我们启动它,创建更改,这些更改保存在图层中,形成另一个图像。
所以最终我有了一个用于我的PostgreSQL实例的映像和一个用于我的web应用程序的映像,对这些映像的更改将持续保持。
什么是容器?
图像的实例称为容器。您有一个图像,它是您描述的一组层。如果启动这个映像,那么就有了这个映像的一个正在运行的容器。您可以有许多相同映像的运行容器。
您可以使用Docker images
看到您的所有映像,而您可以使用Docker ps
看到您正在运行的容器(您可以使用Docker PS-A
)看到所有容器。
因此映像的运行实例是一个容器。
摘自我关于自动化Docker部署的文章:
在Dockerland,有图像,也有容器。两者密切相关,但又泾渭分明。对我来说,掌握了这个二分法,就极大地澄清了Docker。
映像是一个惰性的、不可变的文件,它本质上是一个容器的快照。映像是用build命令创建的,当用run启动时,它们将生成一个容器。图像存储在Docker注册表中,如registry.hub.Docker.com。因为它们可能变得相当大,所以图像被设计成由其他图像的层组成,从而允许在网络上传输图像时发送最小数量的数据。
可以通过运行Docker images
列出本地映像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
一些需要注意的事情:
docker build
命令的-t
标志,或者来自docker tag
-ing现有映像。您可以自由地使用对您有意义的命名来标记图像,但要知道docker将使用该标记作为docker Push
或docker Pull
中的注册表位置。[registryhost/][username/]name[:tag]
。对于上面的ubuntu
,REGISTRYHOST被推断为registry.hub.docker.com
。因此,如果计划将名为my-application
的映像存储在docker.example.com
的注册表中,则应将该映像标记为docker.example.com/my-application
.最新
标记并不神奇,它只是不指定标记时的默认标记。
标记和存储库。很容易忘记它们。有关图像的更多信息可从Docker文档和术语表中获得。
用一个编程比喻来说,如果图像是类,那么容器就是类的实例--运行时对象。容器是您使用Docker的原因;它们是运行应用程序的环境的轻量级和可移植封装。
使用Docker PS
查看本地正在运行的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
这里我正在运行一个docker注册表的dockerized版本,这样我就有了一个私有的地方来存储我的图像。还有一些需要注意的事情:
Docker PS
仅输出正在运行的容器。您可以使用Docker ps-a
查看所有容器(正在运行或已停止)。--name
标志标识已启动的容器。我早期对Docker的一个不满是,没有标记的图像和停止的容器似乎在不断地建立。在一些情况下,这种构建会导致硬盘耗尽,使我的笔记本电脑变慢,或者使我的自动构建管道中断。说说“到处都是集装箱”!
通过将Docker RMI
与最近的dangling=true
查询组合起来,我们可以删除所有未标记的图像:
docker映像-q--filter“dangling=true”xargs docker RMI
Docker无法删除现有容器后面的映像,因此您可能必须先使用Docker rm
删除已停止的容器:
docker rm `docker ps --no-trunc -aq`
这些都是Docker已知的痛点,可能会在未来的发行版中解决。但是,通过对图像和容器的清楚理解,可以通过几个实践来避免这些情况:
Docker rm[CONTAINER_ID]
删除无用的、已停止的容器。Docker rmi[IMAGE_ID]
删除无用、已停止容器后面的映像。