在Docker中,容器和图像有什么区别?
Docker中的容器和图像有什么区别? 在Docker入门教程中,这两个术语都被使用,但我不明白其中的差别。
任何人都可以摆脱一些光?
映像是根文件系统更改的有序集合,以及用于容器运行时的相应执行参数。 图像是只读的。
容器是一个活动的(或不活跃的,如果退出)图像的有状态实例化。
图像冻结了不可变的活动容器快照。 容器正在运行(或停止)某个图像的实例。
从名为“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
标准映像。
使用面向对象编程的类比,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
上一篇: In Docker, what's the difference between a container and an image?