首页 > Docker中镜像和容器的关系是什么?

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

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


容器是镜像的实例,先声明(描述)镜像,再创建容器,所以容器可以有多个;
镜像是一个只读的文件系统,在本地会共用,主要是通过签名来实现的,类似于存储里面的De-dup技术。每运行一个容器,会在镜像上加一个可写层,但这一层并不会改变镜像本身,这也就是为什么,有时候你如果用同一个镜像,启动多个容器,里面的内容是不会变的。如果你要将可写层持久化,就要通过 commit命令来把这个可写层写到磁盘上,即生成新的镜像。全面认识Docker,可以多看看Docker资料加深理解。


container = image + docker run


可以类比为 文件--进程 的关系


镜像就是容器的系统文件


镜像可以理解为一个ios的系统光盘文档
容器是装好后可运行的系统


一个镜像可以创建多个容器,我这样说没错吧!


比如实例

docker run 就是把类实例化。


玩过虚拟机吗?相对来说就是Ios文件和虚拟出来的系统。


镜像相当于一个标准化的模板,启动容器相当于实例化一个镜像来用,销毁容器后只是这个实例被销毁了,镜像还是在的


就像墙壁壁纸的关系


镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等...

不妨通过一个实例来获得更直观的认识。

假设你需要把nginx(web服务器)运行在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镜像并非一个单独的文件,而是具有层级结构:

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 

将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容器中的进程

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镜像的各个层,这时使用"--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/*

容器是镜像运行的一个实例!

【热门文章】
【热门文章】