在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
在使用Docker时,我们从一个基本映像开始。我们启动它,创建更改,这些更改被保存在图层中形成另一个图像。
因此,最终我为我的PostgreSQL实例和我的web应用程序提供了一个图像,对这些图像的更改将持续保存。
什么是容器?
当前回答
也许解释一下整个工作流程会有帮助。
一切都从Dockerfile开始。Dockerfile是映像的源代码。
创建Dockerfile之后,构建它来创建容器的映像。图像只是Dockerfile“源代码”的“编译版本”。
一旦有了容器的映像,就应该使用注册表重新分发它。注册表类似于Git存储库——您可以推送和拉出图像。
接下来,您可以使用映像来运行容器。在许多方面,运行中的容器与虚拟机非常相似(但没有管理程序)。
其他回答
Dockerfile→(Build)→Image→(Run)→Container。
Dockerfile:包含一组Docker指令,以您喜欢的方式配置您的操作系统,并安装/配置所有软件。 图片:编译好的Dockerfile。节省了每次需要运行容器时重新构建Dockerfile的时间。这是一种隐藏供应代码的方法。 容器:虚拟操作系统本身。您可以ssh进入其中并运行任何命令,就像它是一个真实的环境一样。您可以从同一个映像运行1000多个容器。
A docker image or a container image in general is a software package which wraps your application executable, dependencies, configurations and application runtime into a secure and immutable unit. When I am saying application executable it differs from application to application. For example if it is a java application it would a jar file, for node application may be a js file. Similarly the application runtime depends on your application itself. For java application it will be JRE, for node application it is node binaries.
您可以根据映像清单文件中提供的说明构建映像。Dockerfile)。构建映像后,可以将其存储在本地或一些容器映像存储库(如hub.docker.com)中。
当您希望将映像作为应用程序工作负载运行时,您可以启动一个需要映像的容器。容器是映像的运行时实例。
要构建一个映像,存储它并将其作为容器运行,你需要一个名为容器运行时的软件,比如Docker。这些容器运行时符合Open container Initiative为映像创建和容器运行提供的标准。
容器只是一个可执行的二进制文件,由主机操作系统在一组限制下运行,这些限制是由应用程序(例如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 run hello-world。会发生什么呢?
它调用Docker CLI,负责接收Docker命令并转换为调用Docker服务器命令。一旦Docker服务器得到一个运行映像的命令,它就会检查映像缓存中是否有这样一个名称的映像。
假设hello-world不存在。Docker服务器访问Docker Hub (Docker Hub只是一个免费的图像存储库)并询问,嘿,Hub,你有一个名为hello-world的图像吗? 枢纽响应-是的,我有。那就请给我吧。下载过程开始了。一旦Docker镜像下载完成,Docker服务器就会将其放入镜像缓存中。
所以在我们解释Docker镜像和Docker容器是什么之前,让我们先来介绍一下你电脑上的操作系统以及它是如何运行软件的。
例如,当你在电脑上运行Chrome时,它会调用操作系统,操作系统自己会调用内核并请求,嘿,我想运行这个程序。内核设法从您的硬盘运行文件。
现在假设你有两个程序,Chrome和Node.js。Chrome需要Python版本2才能运行,Node.js需要Python版本3才能运行。如果您的计算机上只安装了Python v2,则只能运行Chrome。
为了使这两种情况都能工作,您需要以某种方式使用称为名称空间的操作系统特性。命名空间是一种特性,它使您有机会隔离进程、硬盘驱动器、网络、用户、主机名等。
当我们讨论映像时,我们实际上是在讨论文件系统快照。映像是一个物理文件,其中包含构建特定容器的方向和元数据。容器本身是一个映像的实例;它使用名称空间隔离硬盘驱动器,该名称空间仅对该容器可用。因此容器是一个进程或一组进程,它将分配给它的不同资源分组。
工作流
下面是端到端的工作流,显示各种命令及其相关的输入和输出。这应该澄清了映像和容器之间的关系。
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
要列出你可以运行的图像,执行:
docker image ls
列出你可以执行命令的容器:
docker ps