Docker的Image与Container

Docker的Image与Container

Image的简介

Image其实就是一个文件系统,它里面是一层层文件系统,叫做Union FS(联合文件系统)。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。虚拟文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。

创建Image的两种方式

  • 基于image创建container后,如果在container做了一些变化,l 例如安装了某个软件,可以将这些改变,commit成一个新的image,也可以简写为docker commit

    • 交互运行一个centos实例,给里面装一个lrzsz

      [root@node01 ~]# docker run -it centos
      [root@2ea4f2b475ca /]# yum -y install lrzsz
      
    • 装完退出

      [root@2ea4f2b475ca /]# exit
      
    • 查看修改后的容器

      [root@node01 ~]# docker container ls -a
      
    • 将这个新的容器,打包成一个新的镜像,生成新的镜像

      [root@node01 ~]# docker commit 2ea4f2b475ca guhaohao/centos-lrzsz
      
    • 查看镜像

      docker image ls
      
    • 可以根据镜像id,查看到镜像分层信息

      docker history 3b3d40f4a2b5
      
  • 使用Dockerfile,通过build制作image,可以简写为docker build

    • 定义Dockerfile文件

      vi Dockerfile
      
    • 写入一下内容

      FROM centos
      RUN yum -y install lrzsz
      
    • 编译镜像

      [root@node01 ~]# docker build -t guhaohao/centos-lrzsz2 .
      
    • 可以查看到多出了个镜像

      [root@node01 ~]# docker image ls
      

Container的简介

container可以理解为运行时的实例。
要有Container首先要有Image,也就是说Container是通过image创建的。
Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。
在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。

Image和Container的区别

Image负责APP的存储和分发,Container负责运行APP

Container的使用

  • 查看所有运行过的container容器

    [root@node01 ~]# docker container ls -a
    
  • 可以交互运行容器

    [root@node01 ~]# docker run -it centos
    
  • 查看运行时的容器

    [root@node01 ~]# docker container ls
    
  • 删除某个容器

    [root@node01 ~]# docker container rm 2ea4f2b475ca
    
  • 删除全部容器

    [root@node01 ~]# docker rm $(docker container ls -aq)
    
  • 删除没有在运行的容器

    [root@node01 ~]# docker rm $(docker container ls -f "status=exited" -q)
    
原文地址:https://www.cnblogs.com/ghh520/p/13192659.html