Docker中的容器和图像有什么区别?在入门Docker教程中,这些术语都被使用,但我不明白其中的区别.
任何人都可以解释一下吗?
图像是根文件系统更改的有序集合以及在容器运行时内使用的相应执行参数.图像是只读的.
https://docs.docker.com/glossary/?term=image
容器是图像的活动(或退出时不活动)状态实例化.
https://docs.docker.com/glossary/?term=container
图像是活动容器的冻结不可变快照.容器正在运行(或停止)某些映像的实例.
从名为'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
我们开始使用的标准图像.
DockerFile-(构建)-> DockerImage-(运行)-> DockerContainer
DockerFile是您或开发人员编写的用于执行某些操作的代码(安装前)
Docker Image是您在构建docker文件时得到的。
运行Docker映像后即可获得 Docker Container
我们可以通过拉动从docker hub获得Docker Image,然后运行它以获取容器。
图像基本上是用于创建容器的不可变模板.通过考虑将图像转换为容器的情况,可以更容易地理解图像和容器之间的区别.
Docker引擎获取图像并在顶部添加读写文件系统,然后初始化各种设置.这些设置包括网络选项(IP,端口等),名称,ID和任何资源限制(CPU,内存).如果已经要求Docker引擎运行容器,它还将初始化其中的进程.可以停止并重新启动容器,在这种情况下,它将保留所有设置和文件系统更改(但会丢失内存中的任何内容,并且将重新启动所有进程).出于这个原因,停止或退出的容器是不一样的图像.
使用面向对象的编程类比,Docker镜像和Docker容器之间的差异与类和对象之间的差异相同.对象是类的运行时实例.类似地,容器是图像的运行时实例.
实例化对象时只创建一次对象.同样,容器可以运行或停止.容器是从图像中创建的,但情况可能并非总是如此.以下示例创建Apache服务器映像,运行映像,列出映像,然后列出容器:
使用以下内容创建Dockerfile:
FROM httpd:2.4
安装Apache服务器
sudo docker build -t my-apache2 .
运行图像
sudo docker run -it --rm --name my-running-app my-apache2
列出Docker镜像
sudo docker images
列出正在运行的Docker容器
docker ps
列出所有容器
docker ps -a
列出最新创建的容器
docker ps -l
只读用于创建容器的模板
由您或其他Docker用户推荐
存储在Docker Hub或您的本地注册表中
隔离的应用平台
包含运行应用程序所需的一切
基于图像
用简单的话说.
图片 -
用于创建容器的文件系统和配置(只读)应用程序. 更多细节.
容器 -
这些是Docker镜像的运行实例.容器运行实际的应用程序.容器包括应用程序及其所有依赖项.它与其他容器共享内核,并作为主机操作系统上用户空间中的独立进程运行. 更多细节.
其他需要注意的重要条款:
Docker守护程序 -
在管理构建,运行和分发Docker容器的主机上运行的后台服务.
Docker客户端 -
命令行工具,允许用户与Docker守护程序进行交互.
Docker商店 -
除其他外,Store是Docker镜像的注册表.您可以将注册表视为所有可用Docker镜像的目录.
一张图片胜过千言万语.
(为了更深入的了解,请阅读此内容.)
摘要:
拉图像从泊坞毂从或建立一个Dockerfile =>给出一个泊坞图像(不可编辑).
运行图像(docker run image_name:tag_name
)=>给出一个正在运行的图像即容器(可编辑)