使用 Docker 时,我们从基础镜像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中。
所以最终我有一个我的 PostgreSQL 实例的图像和一个我的 web 应用程序的图像,对它们的更改继续被持久化。
什么是容器?
原文由 Bibek Shrestha 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用 Docker 时,我们从基础镜像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中。
所以最终我有一个我的 PostgreSQL 实例的图像和一个我的 web 应用程序的图像,对它们的更改继续被持久化。
什么是容器?
原文由 Bibek Shrestha 发布,翻译遵循 CC BY-SA 4.0 许可协议
来自我关于 自动化 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
现有图像。您可以使用对您有意义的命名法来标记图像,但要知道 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
。latest
标签并不神奇,它只是您不指定标签时的默认标签。<none>
TAG 和 REPOSITORY。很容易忘记它们。有关图像的更多信息,请参阅 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 注册表的 docker 化版本,这样我就有了一个私有的地方来存储我的图像。再次,有几点需要注意:
docker ps
只输出 正在运行的 容器。您可以使用 docker ps -a
查看所有容器( 运行 或 _停止_)。--name
标志来识别已启动的容器。我对 Docker 的早期挫败感之一是 看似不断地积累未标记的图像和停止的容器。在少数情况下,这种堆积会导致硬盘驱动器容量最大化,从而减慢我的笔记本电脑速度或停止我的自动构建管道。谈论“无处不在的容器”!
我们可以通过结合 docker rmi
与最近的 dangling=true
查询来删除所有未标记的图像:
docker images -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]
删除无用的已停止容器后面的图像。原文由 calebds 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答2.4k 阅读✓ 已解决
2 回答781 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答1.6k 阅读
2 回答1.2k 阅读
1 回答946 阅读
图像的一个实例称为容器。您有一个图像,它是您描述的一组图层。如果你启动这个镜像,你就有了这个镜像的运行容器。您可以拥有多个运行同一映像的容器。
您可以使用 --- 查看所有图像,而使用
docker images
查看正在运行的容器(您可以使用docker ps
docker ps -a
查看所有容器)。因此,图像的运行实例是一个容器。