在Docker中,容器和图像有什么区别?

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标准映像。


    使用面向对象编程的类比,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
    
  • 链接地址: http://www.djcxy.com/p/30131.html

    上一篇: In Docker, what's the difference between a container and an image?

    下一篇: Set a box with Vagrant (VirtualBox's version)