4-什么是Image和container
什么是Image?
先练习一个例子:
docker pull ubuntu:16.04
docker image ls # 查看镜像
镜像类似于一个系统安装光盘,你可以使用一个安装光盘为多台电脑安装操作系统,同样,你也可以用同一个镜像构建多个运行的 Docker 实体——容器。当你使用同一张安装光盘给多台电脑安装系统之后,这些电脑的系统是完全一样的,换句话说,安装光盘的内容是不变的。同理,镜像也是一个静态的概念,从同一个镜像运行的 Docker 容器也都是一样的,镜像的内容在生成之后就不再改变!
Docker 镜像是一个特殊的文件系统,类似于 Linux 的 root 文件系统,镜像提供了容器运行时所需的程序、库、资源、配置等文件,还包含了一些为运行时准备的一些配置参数。镜像是一个静态的概念,镜像不包含任何动态数据,其内容在构建之后也不会被改变。
由于镜像包含完整的 Linux root 文件系统,所以它可能会很庞大。因此,Docker 的设计者充分利用 Unions FS 技术,把 Docker 设计为分层存储的结构,什么意思呢?
意思是说,镜像是分层构建的,每一层是上面一层的基础,每一层在构建完成之后都不会再发生变化,这提醒我们,构建镜像的时候我们要保证每一层都只包含我们的应用需要的东西,不要有包含不需要的文件,因为每一层在构建之后不再发生变化,所以即使你在之上的层删除了那些不需要的文件,这些文件也只是被标记为删除,实际上并没有真正删除;如果每一层都包含一些可有可无的文件,就会使得我们的镜像越来越臃肿。通过之前的叙述,我们可以看出,一个镜像实际上并不是一个文件,而是一组分层文件。分层存储还使得不同的镜像可以共享某些层,便于镜像的复用。
什么是container?
你可以从镜像创建容器,就像从快照创建虚拟机一样。容器是一个动态的概念,你的程
序都是在容器里运行的。
容器就是一个进程,但是它有自己独立的命名空间,拥有自己独立的文件系统,独立的
网络等资源。因此,容器就好像一个完全独立于宿主主机的操作系统一样,完全可以被
当做一个独立的操作系统使用。
容器也是分层存储的,当你从一个镜像创建并运行一个容器的时候,是以镜像作为基础
层,在此之上创建一个容器的存储层,你对容器的读写都是在这一层完成的。但是当容
器消亡的时候,容器的存储层也会随之消失。因此,我们不应该在容器的存储层写入数
据,文件的写入操作需要使用其它的方式,这会在之后的教程介绍。
我们现在只需要知道,容器和镜像都是分层存储的,并了解容器和镜像的关系就足够
了。
镜像和容器的关系 就好比 面向对象编程中的 类 与 实例。
练习
-
pull 一个 ubuntu16.04镜像
如果不知道有哪些镜像可以搜索docker search ubuntu
拉取16.04版本
docker pull ubuntu:16.04 16.04: Pulling from library/ubuntu Digest: sha256:e4a134999bea4abb4a27bc437e6118fdddfb172e1b9d683129b74d254af51675 Status: Image is up to date for ubuntu:16.04
-
创建一个容器
docker run --name ubuntu-demo ubuntu:16.04
此时
docker ps
命令是查看不到的,说明他创建完成后就退出了,通过docker ps -a
查看。
这是因为这个容器并不能占用一个进程一直跑。此时我们可以这样使用docker run -it --name ubuntu-demo ubuntu:16.04 /bin/bash
此方式为交互式的运行,让我们可以进入一个终端
此时
ubuntu:16.04
镜像就好比一个类,而ubuntu-demo
容器就是实例