Docker图像和容器之间有什么区别?
当使用Docker时,我们从一个基本图像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中 因此,最终我有了一个用于PostgreSQL实例的映像和一个用于web应用程序的映像,对它们的更改会一直保持不变Docker图像和容器之间有什么区别?,docker,docker-container,docker-image,Docker,Docker Container,Docker Image,当使用Docker时,我们从一个基本图像开始。我们启动它,创建更改,这些更改保存在形成另一个图像的层中 因此,最终我有了一个用于PostgreSQL实例的映像和一个用于web应用程序的映像,对它们的更改会一直保持不变 什么是容器?图像的实例称为容器。您有一个图像,它是您描述的一组层。如果启动此映像,则此映像的容器正在运行。可以有许多相同映像的运行容器 您可以使用docker images查看所有图像,而您可以使用docker ps查看正在运行的容器(并且您可以使用docker ps-a查看所有容
什么是容器?图像的实例称为容器。您有一个图像,它是您描述的一组层。如果启动此映像,则此映像的容器正在运行。可以有许多相同映像的运行容器 您可以使用
docker images
查看所有图像,而您可以使用docker ps
查看正在运行的容器(并且您可以使用docker ps-a
查看所有容器)
因此,映像的运行实例是一个容器。虽然将容器视为运行映像是最简单的,但这并不十分准确
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
图像实际上是一个可以转换为容器的模板。要将映像转换为容器,Docker引擎将获取映像,在其顶部添加一个读写文件系统,并初始化各种设置,包括网络端口、容器名称、ID和资源限制。一个正在运行的容器有一个当前正在执行的进程,但是一个容器也可以被停止(或者用Docker的术语来说是退出)。退出的容器与映像不同,因为它可以重新启动,并将保留其设置和任何文件系统更改 来自我的文章:
Docker图像与容器
在Dockerland中,有图像和容器。两者密切相关,但又截然不同。对我来说,掌握了这种二分法使Docker非常清楚
什么是图像?
映像是一个惰性的、不可变的文件,本质上是容器的快照。图像是使用命令创建的,当使用时,它们将生成一个容器。图像存储在Docker注册表中,例如。因为它们可能变得相当大,所以图像被设计为由其他图像的层组成,从而允许在网络上传输图像时发送最小数量的数据
通过运行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注册表的docker版本,这样我就有了一个私人空间来存储我的图像。同样,需要注意的是:
docker ps
仅输出运行的容器。您可以使用docker ps-a
查看所有容器(运行或停止)--name
标志标识已启动的容器docker rmi
与最近的dangling=true
查询相结合来删除所有未标记的图像:
docker图像-q--过滤“悬挂=真”| xargs docker rmi
Docker将无法删除位于现有容器后面的图像,因此您可能必须首先使用Docker rm
删除已停止的容器:
docker rm `docker ps --no-trunc -aq`
这些都是Docker提供的,可能会在未来的版本中解决。但是,在清楚了解图像和容器的情况下,可以通过以下两种做法避免这些情况:
docker rm[container\u ID]
移除无用的、已停止的容器docker rmi[image\u ID]
删除无用且已停止的容器后面的图像Docker的核心概念是使创建“机器”变得容易,在这种情况下可以将其视为容器。容器有助于重用,允许您轻松创建和放置容器 图像描述了容器在每个时间点的状态。因此,基本工作流程是:
也许解释整个工作流程会有所帮助 一切都从Dockerfile开始。Dockerfile是图像的源代码 创建Dockerfile后,构建它以创建容器的图像。该图像只是Dockerfile“源代码”的“编译版本” 获得容器的映像后,应使用注册表重新分发它。注册表就像一个Git存储库——您可以推拉图像
接下来,您可以使用该图像运行容器。运行中的容器在许多方面与虚拟机非常相似(但没有)。Docker映像打包了应用程序运行所需的应用程序和环境,容器是映像的运行实例 图像是Docker的打包部分,类似于“源代码”或“程序”。容器是Docker的执行部分,类似于“流程”
在这个问题中,只提到“程序”部分,这就是图像。Docker的“运行”部分是容器。当容器运行并进行更改时,就好像进程更改了自己的源代码并将其保存为新映像。容器只是一个可执行的二进制文件,将由主机操作系统在使用应用程序(例如Docker)预设的一组限制下运行它知道如何告诉操作系统应用哪些限制 典型的限制是进程隔离相关、安全相关(如使用保护)和sy
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
docker image ls
docker ps
IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
+-----------------------------+-------+-----------+
| Domain | Meta | Concrete |
+-----------------------------+-------+-----------+
| Docker | Image | Container |
| Object oriented programming | Class | Object |
+-----------------------------+-------+-----------+