图像是活动容器的冻结不可变快照。容器正在运行(或停止)某些映像的实例。
从名为'ubuntu'的基本映像开始。让我们在ubuntu映像中以交互方式运行bash并创建一个文件。我们将使用-i
和-t
标志为我们提供一个交互式bash shell。
$ docker run -i -t ubuntu /bin/bash
root@48cff2e9be75:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@48cff2e9be75:/# cat > foo
This is a really important file!!!!
root@48cff2e9be75:/# exit
退出并重新启动映像时,不要指望该文件会留下来。您正在从之前开始的完全相同的状态重新启动,而不是从中断的位置重新启动。
$ docker run -i -t ubuntu /bin/bash
root@abf181be4379:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@abf181be4379:/# exit
但是,现在不再运行的容器具有状态并且可以保存(提交)到图像。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abf181be4379 ubuntu:14.04 /bin/bash 17 seconds ago Exited (0) 12 seconds ago elegant_ardinghelli
48cff2e9be75 ubuntu:14.04 /bin/bash About a minute ago Exited (0) 50 seconds ago determined_pare
...
让我们从容器ID 48cff2e9be75创建一个图像,我们在其中创建了我们的文件:
$ docker commit 48cff2e9be75 ubuntu-foo
d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2
现在,我们有一个包含我们非常重要文件的新图像:
$ docker run ubuntu-foo /bin/cat foo
This is a really important file!!!!
尝试命令docker images
。您应该看到您的新图像ubuntu-foo
以及我们开始使用的ubuntu
标准图像。
图像:运行容器所需的文件系统和元数据。它们可以被视为一种应用程序打包格式,包括运行应用程序的所有依赖项,以及执行该应用程序的默认设置。元数据包括运行命令的默认值,环境变量,标签和运行状况检查命令。
容器:隔离应用程序的实例。容器需要映像来定义其初始状态,并使用映像中的只读文件系统以及特定于容器的读写文件系统。正在运行的容器是正在运行的进程的包装器,为文件系统,网络和PID等事务提供了进程名称空间。
执行docker run
命令时,在命令行上提供图像以及任何配置,docker根据您提供的图像定义和配置返回容器。
参考文献:对于docker引擎,图像只是一个图像ID。这是一个唯一的不可变哈希。对图像的更改会导致创建新的图像ID。但是,您可以将一个或多个引用指向图像ID,与符号链接不同。并且可以更新这些引用以指向新的图像ID。请注意,在创建容器时,docker将在创建容器时解析该引用,因此您无法更新正在运行的容器的映像。而是创建一个新图像,并基于该新图像创建一个新容器。
图层:深入挖掘,你有文件系统层。 Docker使用分层文件系统组装图像。每个层都是对文件系统的只读更改集,该层由唯一的哈希表示。使用这些只读层,多个图像可以扩展另一个,并且仅需要通过网络存储或传输这些图像之间的差异。运行Docker容器时,它会接收该容器特有的容器特定读写文件系统层,并使用union文件系统组装所有图像层。通过每个层处理读取,直到找到文件,找到删除或在底层找不到文件。写操作从图像只读层执行写时复制到容器特定的读写层。并且删除被记录为容器特定读写层的改变。构建映像的一个常见步骤是在基于先前映像文件系统状态的临时容器中运行命令,并将生成的容器特定层保存为新映像中的层。
Docker镜像:它包含一系列命令和有关如何构建和运行容器的说明。所以基本上图像包含启动容器所需的所有数据和元数据(也称为蓝图)。如果没有指定图像,我们就不能在容器中吃午餐。
$docker images centos
列出所有可用的centos版本。
Docker Container:容器是Images中的午餐,所以我们可以说container是图像的运行实例。 Container是一个运行时构造,与构建时构造的Images不同。
官方的区别是容器是最后一层可写的,而下面的层只是可读的,它们属于你的图像。直观的区别在于docker实例是由docker守护程序虚拟化的实例和运行您的映像,它在内核的一个独立部分中运行(此过程对您是隐藏的)。然而,图像是静态的,它不运行,它只是一堆图层(静态文件)。如果我们将这个范例与面向对象的编程联系起来,那么图像就是你的类定义,而你的docker实例是你的类生成对象,它驻留在内存中。
我写了一个教程来加强你的docker知识直觉:
http://javagoogleappspot.blogspot.com/2018/07/docker-basics.html
图像是您手机拍摄的照片。 容器就是电话。
图像是根文件系统更改的有序集合以及在容器运行时内使用的相应执行参数。图像是只读的。
容器是图像的活动(或退出时不活动)状态实例化。
使用面向对象的编程类比,Docker镜像和Docker容器之间的差异与类和对象之间的差异相同。对象是类的运行时实例。类似地,容器是图像的运行时实例。
实例化对象时只创建一次对象。同样,容器可以运行或停止。容器是从图像中创建的,但情况可能并非总是如此。以下示例创建Apache服务器映像,运行映像,列出映像,然后列出容器:
FROM httpd:2.4
sudo docker build -t my-apache2 .
sudo docker run -it --rm --name my-running-app my-apache2
sudo docker images
docker ps
docker ps -a
docker ps -l
用简单的话说。
图片 -
用于创建容器的文件系统和配置(只读)应用程序。 More detail。
容器 -
这些是Docker镜像的运行实例。容器运行实际的应用程序。容器包括应用程序及其所有依赖项。它与其他容器共享内核,并作为主机操作系统上用户空间中的独立进程运行。 More detail。
其他需要注意的重要条款:
Docker守护程序 -
在管理构建,运行和分发Docker容器的主机上运行的后台服务。
Docker客户端 -
命令行工具,允许用户与Docker守护程序进行交互。
Docker商店 -
除其他外,Store是Docker镜像的注册表。您可以将注册表视为所有可用Docker镜像的目录。
一张图片胜过千言万语。
(有关更深入的理解,请阅读this。)
摘要:
docker run image_name:tag_name
)=>给出一个正在运行的图像即容器(可编辑)图像基本上是用于创建容器的不可变模板。通过考虑将图像转换为容器的情况,可以更容易地理解图像和容器之间的区别。
Docker引擎获取图像并在顶部添加读写文件系统,然后初始化各种设置。这些设置包括网络选项(IP,端口等),名称,ID和任何资源限制(CPU,内存)。如果已经要求Docker引擎运行容器,它还将初始化其中的进程。可以停止并重新启动容器,在这种情况下,它将保留所有设置和文件系统更改(但会丢失内存中的所有内容,并且将重新启动所有进程)。因此,停止或退出的容器与图像不同。
DockerFile - (Build) - > Docker Image - (运行) - > Docker Container
DockerFile是您或开发人员编写代码来执行某些操作(例如安装)
Docker Image是在构建docker文件时获得的。
运行Docker镜像时可以获得Docker Container
我们可以通过拉动从Docker hub获取Docker Image,然后运行它来获取容器。
在Docker中,一切都以图像开头。图像是构成足够操作系统的每个文件,以执行您需要执行的操作。传统上,您将为每个应用程序安装一个完整的操作系统。使用Docker,你可以将它配对,这样你就可以拥有一个只有足够操作系统的小容器来完成你需要做的事情,你可以在计算机上有效地使用它们。
使用docker images
查看已安装的图像和docker ps
以查看正在运行的图像。键入docker run
时,它会获取图像,并使其成为具有正在运行的进程的活动容器。我倾向于使用:
码头运行-ti
<image>:<tag>
bash
最后,图像有自己的一组ID,容器有自己的一组ID - 它们不重叠。
容器基于图像。需要将映像传递给Dockers run命令。
例:
BusyBox图像
http://i.stack.imgur.com/eK9dC.png
在这里,我们指定一个名为busybox
的图像。 Docker本地没有此映像,并从公共注册表中提取它。
注册表是Docker客户端可以与之通信并从中下载映像的Docker映像目录。拉出图像后,Docker启动一个容器并执行echo hello world命令。