在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。

因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。

什么是容器?


当前回答

Dockerfile类似于生成tarball (Docker映像)的Bash脚本。

Docker容器就像tarball的提取版本。您可以在不同的文件夹(容器)中拥有尽可能多的副本。

其他回答

正如许多回答指出的那样:你构建Dockerfile来获取一个图像,然后运行image来获取一个容器。

但是,下面的步骤帮助我更好地了解Docker映像和容器是什么:

1)构建Dockerfile:

Docker build -t my_image dir_with_dockerfile

2)保存镜像到.tar文件

-o my_file.tar my_image_id

My_file.tar将存储映像。使用tar -xvf my_file.tar打开它,您将看到所有的层。如果你深入每一层,你可以看到每一层添加了什么变化。(它们应该非常接近Dockerfile中的命令)。

3)要查看容器内部,您可以:

Sudo docker运行- my_image bash

你可以看到它很像一个操作系统。

容器只是一个可执行的二进制文件,由主机操作系统在一组限制下运行,这些限制是由应用程序(例如Docker)预先设置的,该应用程序知道如何告诉操作系统应用哪些限制。

典型的限制是与进程隔离相关的、与安全性相关的(比如使用SELinux保护)和与系统资源相关的(内存、磁盘、CPU和网络)。

直到最近,只有基于unix的系统中的内核支持在严格限制下运行可执行文件的能力。这就是为什么今天大多数容器讨论主要涉及Linux或其他Unix发行版的原因。

Docker是知道如何告诉操作系统(主要是Linux)在什么限制下运行可执行文件的应用程序之一。可执行文件包含在Docker映像中,它只是一个tarfile。该可执行文件通常是Linux发行版用户空间(Ubuntu、CentOS、Debian等)的精简版本,预先配置为在其中运行一个或多个应用程序。

尽管大多数人使用Linux基础文件作为可执行文件,但它可以是任何其他二进制应用程序,只要主机操作系统的内核可以运行它(参见使用scratch创建一个简单的基础映像)。无论Docker镜像中的二进制文件是一个OS用户空间还是一个简单的应用程序,对于OS主机来说,它只是另一个进程,一个被预设的OS边界所控制的包含进程。

其他应用程序,如Docker,可以告诉主机操作系统在进程运行时应用哪些边界,包括LXC、libvirt和systemd。Docker曾经使用这些应用程序间接地与Linux操作系统交互,但现在Docker使用自己的库“libcontainer”直接与Linux交互。

因此容器只是在受限模式下运行的进程,类似于chroot的功能。

在我看来,Docker与其他容器技术的区别在于它的存储库(Docker Hub)和管理工具,这些工具使得使用容器变得非常容易。

参见Docker(软件)。

长话短说。

码头工人图片:

用于创建容器的文件系统和配置(只读)应用程序。

码头工人的容器:

容器和映像之间的主要区别是最上面的可写层。容器是顶层可写层的Docker映像的运行实例。容器运行实际的应用程序。容器包括应用程序及其所有依赖项。当容器被删除时,可写层也会被删除。底层图像保持不变。


其他需要注意的重要术语:

码头工人守护进程:

运行在主机上的后台服务,它管理构建,运行和分发Docker容器。

码头工人客户:

允许用户与Docker守护进程交互的命令行工具。

码头工人商店:

Store是一个Docker映像的注册表。您可以将注册表视为所有可用Docker映像的目录

这篇博文中的一张图片胜过千言万语。

简介:

从Docker中心提取图像或从Dockerfile构建=>给出一个 Docker图像(不可编辑)。 运行image (docker Run image_name:tag_name) =>给出一个运行 图片即容器(可编辑)

Docker Client, Server, Machine, Images, Hub, composites都是项目工具和软件,聚在一起形成了一个平台,在这个平台上,围绕着创建和运行一些叫做容器的东西,现在如果你运行Docker run redis命令,一个叫做Docker CLI的东西到达了一个叫做Docker Hub的东西,它下载了一个叫做image的文件。

码头工人形象:

一个镜像是一个单独的文件,包含运行一个非常特定的程序所需的所有依赖项和所有配置,例如redis是你刚刚下载的(通过运行docker run redis命令)应该运行的镜像。

这是存储在硬盘上的单个文件,在某些时候,您可以使用此映像来创建称为容器的东西。

容器是一个映像的实例你可以把它想象成一个运行的程序它有自己孤立的一组硬件资源它有自己的一小块内存有自己的一小块网络技术空间也有自己的一小块硬盘空间。

现在让我们看看当你发出下面的命令时: Sudo docker run hello-world

Above command will starts up the docker client or docker CLI, Docker CLI is in charge of taking commands from you kind of doing a little bit of processing on them and then communicating the commands over to something called the docker server, and docker server is in charge of the heavy lifting when we ran the command Docker run hello-world, That meant that we wanted to start up a new container using the image with the name of hello world, the hello world image has a tiny tittle program inside of it whose sole purpose or sole job is to print out the message that you see in the terminal.

现在,当我们运行该命令并将其发送到docker服务器时,后台很快就会发生一系列操作。Docker服务器看到我们试图使用名为hello world的映像启动一个新容器。

docker服务器做的第一件事是检查它是否已经有一个本地副本,比如你个人机器上的hello world映像或那个hello world文件的副本。因此,docker服务器研究了一种叫做图像缓存的东西。

现在,因为你和我刚刚在我们的个人电脑上安装了Docker,图像缓存目前是空的,我们没有之前已经下载过的图像。

因此,由于映像缓存是空的,docker服务器决定求助于一个名为docker hub的免费服务。Docker Hub是一个免费的公共映像库,您可以免费下载并在个人计算机上运行。所以Docker服务器联系了Docker Hub,下载了hello world文件,并将其存储在你的计算机上的image-cache中,现在它可以在未来的某个时候重新运行,而不必从Docker Hub重新下载它。

之后,docker服务器将使用它创建一个容器的实例,我们知道容器是一个映像的实例,它的唯一目的是运行一个非常特定的程序。因此,docker服务器从图像缓存中取出图像文件,并将其加载到内存中,从中创建一个容器,然后在其中运行一个程序。这个程序的目的就是打印出你看到的信息。

什么是容器: 首先,图像是如何创建容器的蓝图。

容器是一个进程或一组进程的资源专门分配给它的分组,在波形图,当我们考虑一个集装箱我们有一些正在运行的进程发送一个系统调用内核,内核会看那个传入系统调用,直接一个非常具体的部分硬盘,内存,CPU或其他什么它可能需要这些资源的一部分用于奇异的过程。

Image相当于OOP中的类定义,层是该类的不同方法和属性。

容器是图像的实际实例化,就像对象是实例化或类的实例一样。