首頁  >  問答  >  主體

linux - Docker中镜像和容器的关系是什么?

Docker中镜像和容器的关系是什么?
看了几个版本,有点不太清晰。
是容器里面放置镜像?
还是镜像本身就是一个容器?

迷茫迷茫2744 天前1053

全部回覆(12)我來回復

  • 高洛峰

    高洛峰2017-04-17 15:08:47

    容器是鏡像運作的一個實例!

    回覆
    0
  • 迷茫

    迷茫2017-04-17 15:08:47

    玩過虛擬機器嗎?相對來說就是Ios檔案和虛擬出來的系統。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 15:08:47

    鏡像是檔案, 容器是進程。 容器是基於鏡像創建的, 即容器中的進程依賴於鏡像中的文件, 這裡的文件包括進程運行所需的可執行文件, 依賴軟體,庫文件, 配置文件等等...

    不妨透過一個實例來獲得更直覺的認識。

    假設你需要把nginx(網頁伺服器)運行在Docker容器中,則第一步需要下載nginx映像:

    sudo docker pull nginx

    下載nginx映像之後可以查看Docker映像:

    sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              0d409d33b27e        2 weeks ago         182.7 MB
    • 可知, nginx鏡像的大小為182.7MB。

    事實上, nginx鏡像並非一個單獨的文件,而是具有層級結構:

    sudo docker history nginx
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    0d409d33b27e        2 weeks ago         /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o   0 B                 
    <missing>           2 weeks ago         /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp         0 B                 
    <missing>           2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx/   0 B                 
    <missing>           2 weeks ago         /bin/sh -c apt-key adv --keyserver hkp://pgp.   57.67 MB            
    <missing>           2 weeks ago         /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.1-1~   0 B                 
    <missing>           3 weeks ago         /bin/sh -c #(nop) MAINTAINER NGINX Docker Mai   0 B                 
    <missing>           3 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B                 
    <missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:5d8521419ad6cfb695   125.1 MB 
    • 可知, nginix鏡像一共有8層, 其中, 第1層為125.1MB, 第5層為57.67MB, 其他層的大小可以忽略。

    將nginx運行在Docker容器中:

    sudo docker run -itd \
                    -p 80:80 \
                    --name=nginx \
                    nginx 

    查看nginx容器

    sudo docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
    263e88fc53d3        nginx               "nginx -g 'daemon off"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 443/tcp   nginx
    • 可知, nginx容器運作成功。

    查看nginx容器中的流程

    sudo docker exec nginx ps aux | grep -v ps
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0  31680  2872 ?        Ss+  05:18   0:00 nginx: master process nginx -g daemon off;
    nginx        5  0.0  0.0  32072  1696 ?        S+   05:18   0:00 nginx: worker process
    • 可知, nginx容器中一共運行了兩個進程, 分別是nginx的master和worker進程。

    • 容器中進程的COMMAND為"nginx -g daemon off", 但是, 主機上並未安裝nginx, nginx安裝在Docker映像中。

    不妨再查看nginx鏡像的各層,這時使用"--no-trunc"顯示詳細內容:

    docker history --no-trunc nginx
    IMAGE                                                                     CREATED             CREATED BY                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   SIZE                COMMENT
    sha256:0d409d33b27e47423b049f7f863faa08655a8c901749c2b25b93ca67d01a470d   2 weeks ago         /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon off;"]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           0 B                 
    <missing>                                                                 2 weeks ago         /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      0 B                 
    <missing>                                                                 2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx/access.log  && ln -sf /dev/stderr /var/log/nginx/error.log                                                                                                                                                                                                                                                                                                                                                                                                                                      0 B                 
    <missing>                                                                 2 weeks ago         /bin/sh -c apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62  && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list  && apt-get update  && apt-get install --no-install-recommends --no-install-suggests -y       ca-certificates       nginx=${NGINX_VERSION}       nginx-module-xslt       nginx-module-geoip       nginx-module-image-filter       nginx-module-perl       nginx-module-njs       gettext-base  && rm -rf /var/lib/apt/lists/*   57.67 MB            
    <missing>                                                                 2 weeks ago         /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.1-1~jessie                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          0 B                 
    <missing>                                                                 3 weeks ago         /bin/sh -c #(nop) MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"                                                                                                                                                                                                                                                                                                                                                                                                                                                               0 B                 
    <missing>                                                                 3 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          0 B                 
    <missing>                                                                 3 weeks ago         /bin/sh -c #(nop) ADD file:5d8521419ad6cfb6956ed26ab70a44422d512f82462046ba8e68b7dcb8283f7e in /                                                                                                                                                                                                                                                                                                                                                                                                                                             125.1 MB  

    其中, 第5層為57.67MB, 它的CREATED BY是這樣的(把連接符號&&換為換行符):

    apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62  
    echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list  
    apt-get update
    apt-get install --no-install-recommends --no-install-suggests -y ca-certificates nginx=${NGINX_VERSION} nginx-module-xslt nginx-module-geoip nginx-module-image-filter nginx-module-perl nginx-module-njs gettext-base
    rm -rf /var/lib/apt/lists/*
    • 可知, nginx鏡像的第5層安裝了nginx。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 15:08:47

    可以類比為 檔案--進程 的關係

    回覆
    0
  • 黄舟

    黄舟2017-04-17 15:08:47

    鏡像可以理解為一個ios的系統光碟文件
    容器是裝好後可運作的系統

    回覆
    0
  • 黄舟

    黄舟2017-04-17 15:08:47

    就像墙壁壁纸的關係

    回覆
    0
  • 阿神

    阿神2017-04-17 15:08:47

    container = image + docker run

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 15:08:47

    实例

    docker run 就是把類別實例化。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:08:47

    鏡像就是容器的系統檔案

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 15:08:47

    鏡像相當於一個標準化的模板,啟動容器相當於實例化一個鏡像來用,銷毀容器後只是這個實例被銷毀了,鏡像還是在的

    回覆
    0
  • 取消回覆