精华内容
下载资源
问答
  • dockerfile分层dockerfile分层原理docker镜像分层(基于AUFS构建)bootfs和rootfsAUFS 与overlay/overlay2证实overlay结构的小实验dockerfile操作指令构建tomcat镜像(未优化) dockerfile分层原理 docker镜像分层...

    dockerfile分层原理

    docker镜像分层(基于AUFS构建)

    • Docker 镜像位于bootfs之上
    • 每一层镜像的下一层成为父镜像
    • 第一层镜像成为base image
    • 容器层(可读可写),在最顶层(writable)
    • 容器层以下都是只读
      有四层结构构建而成
    • contaier 读写层
    • images (只读)
    • base image(基础镜像)
    • bootfs + rootfs + aufs (kernel内核)

    bootfs和rootfs

    • bootfs:
      bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs

    • rootfs:
      在bootfs之上(base images,例如centos 、ubuntu),rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等

    AUFS 与overlay/overlay2

    • AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层
    • 而docker 使用了overlay/overlay2存储驱动来支持分层结构
      OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载
      overlay结构:
    • rootfs 基础镜像
    • lower 下层信息 (为镜像层,容器)
    • upper 上层目录 (容器信息,可写)
    • worker 运行的工作目录(copy-on-write写时复制 -》准备容器环境)
    • mergod “视图层”(容器视图)

    证实overlay结构的小实验

    [root@node1 ~]# mkdir lower
    [root@node1 ~]# mkdir upper
    [root@node1 ~]# mkdir work
    [root@node1 ~]# echo “lower.aa” > lower/aa
    [root@node1 ~]# echo “lower.bb” > lower/bb
    [root@node1 ~]# echo “upper.bb” > upper/bb
    [root@node1 ~]# echo “upper.cc” > upper/cc
    [root@node1 ~]# mkdir merged
    [root@node1 ~]# mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged
    [root@node1 merged]# ls
    aa  bb  cc
    [root@node1 merged]# df -h
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        71G   23G   49G   32% /
    devtmpfs        2.9G     0  2.9G    0% /dev
    tmpfs           2.9G     0  2.9G    0% /dev/shm
    tmpfs           2.9G   13M  2.9G    1% /run
    tmpfs           2.9G     0  2.9G    0% /sys/fs/cgroup
    /dev/sda1      1014M  174M  841M   18% /boot
    tmpfs           585M   44K  585M    1% /run/user/0
    /dev/sr0        4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
    overlay          71G   23G   49G   32% /root/merged
    
    

    dockerfile操作指令

    指令含义
    FROM 镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令
    MAINTAINR 名字说明维护镜像的维护人信息
    RUN 命令所基于的镜像上执行的命令,并提交到新镜像中
    CMD [ “要运行的程序”," 参数1",“参数2”]指令容器启动时要运行的命令或脚本,只能有一条,如果指定多条只会执行最后一条
    EXPOSE 端口号指定新镜像暴露的端口
    ADD 源文件/目录 目标文件/目录将源文件复制到目标目录中,并且可以解压包,源文件必须与dockerfile位于同一个目录中或者一个URL
    COPY 源文件/目录 目标文件/目录将本地主机的文件/目录复制到目标地点,源文件需要与dockerfile位于同一个目录中,它不能解压包
    VOLUME [“目录”]在容器中创建一个挂载点
    USER 用户名/UID指定运行容器的用户
    WORKDIR 路径相当于cd,进入指定目录中
    ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
    HEALTHCHECK健康检查

    构建tomcat镜像

    FROM centos:7
    ADD apache-tomcat-9.0.16.tar.gz /usr/local
    ADD jdk-8u91-linux-x64.tar.gz /usr/local
    ENV JAVA_HOME /root/jdk1.8.0_91
    ENV PATH $JAVE_HOME/bin:$PATH
    ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib
    EXPOSE 8080
    RUN ln -s /usr/local/apache-tomcat-9.0.16/bin/startup.sh /usr/local/bin/ && ln -s /usr/local/apache-tomcat-9.0.16/bin/shutdown.sh /usr/local/bin/
    CMD startup.sh
    
    • 然后构建镜像
    [root@node1 nginx]# docker build -f docker -t tomcat:c1.
    [root@node1 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    tomcat       c1        4af7e041899e   18 hours ago   584MB
    
    
    • 然后随机暴露端口启动容器,并进入容器中启动tomcat
    [root@node1 nginx]# docker run -itd -P tomcat:c1
    [root@node1 nginx]# docker ps -a
    CONTAINER ID   IMAGE       COMMAND       CREATED          STATUS          PORTS                                         NAMES
    a06ceddd7adb   tomcat:c1   "/bin/bash"   48 minutes ago   Up 13 minutes   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   nostalgic_darwin
    
    [root@node1 nginx]# docker exec -it nostalgic_darwin /bin/bash
    [root@a06ceddd7adb /]# cd /usr/local/apache-tomcat-9.0.16/bin/
    [root@a06ceddd7adb bin]# ./startup.sh 
    Using CATALINA_BASE:   /usr/local/apache-tomcat-9.0.16
    Using CATALINA_HOME:   /usr/local/apache-tomcat-9.0.16
    Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.16/temp
    Using JRE_HOME:        /usr/local/jdk1.8.0_91
    Using CLASSPATH:       /usr/local/apache-tomcat-9.0.16/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.16/bin/tomcat-juli.jar
    Tomcat started.
    [root@a06ceddd7adb bin]# ps axu
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root           1  0.0  0.0  12012  2164 pts/0    Ss+  16:06   0:00 /bin/bash
    root          16  0.0  0.0  12012  1944 pts/1    Ss+  16:07   0:00 /bin/bash
    root          55  0.0  0.0  12012   756 ?        S    16:07   0:00 /bin/sh /usr/local/apache-tomcat-9.0.16/bin/catalina.sh start
    root          56  0.8  1.9 5071932 119432 ?      Sl   16:07   0:06 /usr/local/jdk1.8.0_91/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-9.0.16/conf/logging.prop
    root         105  0.1  0.0  12116  2216 pts/2    Ss   16:20   0:00 /bin/bash
    root         152  0.0  0.0  44620  1788 pts/2    R+   16:20   0:00 ps axu
    
    
    • 然后在宿主机上访问
      在这里插入图片描述

    CMD和ENTRYPOINT的区别

    CMD:

    • 同一个dockerfile中,有多个cmd命令的话,只有最后一个生效
    • 当docker build后有指定/bin/bash,docker容器中有cmd命令的话,只有build生效
    • cmd是默认加载的命令或者执行程序
      ENTRYPOINT:
    • entrypoint是第一个加载的环境
    • 如果dockerfile中同时存在cmd和entrypoint命令,要分场景,如果entrypoint使用的是shell模式,cmd命令会被忽略
    • 如果entrypoint使用exec模式,cmd命令内容会被追加为entrypoint的命令参数
    • 如果entrypoint使用exec模式,cmd也必须使用exec才生效
      shell模式和exec模式:
    • shell模式就是一个环境,像/bin/bash,sh
    • exec模式就是直接执行的命令,像nginx start

    构建nginx镜像(未优化)

    [root@node1 nginx]# vim nginx
    FROM centos:7
    ADD nginx-1.15.9.tar.gz /usr/local/src
    RUN yum install -y gcc gcc-c++ pcre-devel devel zlib-devel make
    RUN useradd -M -s /sbin/nologin nginx
    WORKDIR /usr/local/src/nginx-1.15.9
    RUN ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module && make && make install
    ENV PATH /usr/loacl/nginx/sbin:$PATH
    EXPOSE 80
    RUN echo "deamon off;" >> /usr/local/nginx/conf/nginx.conf
    CMD nginx
    [root@node1 nginx]# docker build -f nginx -t nginx:v1 .
    [root@node1 nginx]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    nginx        v1        8997d003b2d4   About a minute ago   458MB
    
    

    docker build参数

    • -f:指定dockerfile文件
    • -t:打标签
    • .:只当前目录中的文件

    构建nginx镜像(第一次优化,将垃圾信息丢入垃圾桶)

    [root@node1 nginx]# vim nginx1
    FROM centos:7
    ADD nginx-1.15.9.tar.gz /opt
    WORKDIR /opt/nginx-1.15.9
    RUN yum install -y gcc gcc-c++ pcre-devel devel zlib-devel make &> /dev/null && yum clean all
    RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' 	auto/cc/gcc 	//表示关闭debug日志调试
    RUN ./configure --prefix=/usr/local/nginx &> /dev/null &&  make &> /dev/null && make install &> /dev/null
    RUN rm -rf /opt/nginx-1.15.9
    EXPOSE 80
    VOLUME ["/usr/local/nginx/html"]			//指定挂载目录
    CMD ["/usr/local/nginx/sbin/nginx","-g","deamon off;"]
    [root@node1 nginx]# docker build -f nginx1 -t nginx:v2 .
    [root@node1 nginx]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    nginx        v2        c235e84f0e22   9 seconds ago    335MB
    nginx        v1        8997d003b2d4   25 minutes ago   458MB
    
    

    构建nginx镜像(第二次优化,减少RUN使用)

    [root@node1 nginx]# vim nginx2
    FROM centos:7
    ADD nginx-1.15.9.tar.gz /opt
    WORKDIR /opt/nginx-1.15.9
    RUN yum install -y gcc gcc-c++ pcre-devel devel zlib-devel make &> /dev/null && yum clean all && \
     sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
     ./configure --prefix=/usr/local/nginx &> /dev/null &&  make &> /dev/null && make install &> /dev/null && \
     rm -rf /opt/nginx-1.15.9
    EXPOSE 80
    VOLUME ["/usr/local/nginx/html"]
    CMD ["/usr/local/nginx/sbin/nginx","-g","deamon off;"]
    [root@node1 nginx]# docker build -f nginx2 -t nginx:v3 .
    [root@node1 nginx]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    nginx        v3        f65b91badc26   51 seconds ago   333MB
    nginx        v2        c235e84f0e22   20 minutes ago   335MB
    nginx        v1        8997d003b2d4   45 minutes ago   458MB
    
    

    构建nginx镜像(第三次优化,多阶段构建)

    使用FROM生成多个镜像,将指定镜像作为基础镜像来构建

    [root@node1 nginx]# vim nginx3
    FROM centos:7 as build
    ADD nginx-1.15.9.tar.gz /opt
    WORKDIR /opt/nginx-1.15.9
    RUN yum install -y gcc gcc-c++ pcre-devel devel zlib-devel make &> /dev/null && yum clean all && \
     sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
     ./configure --prefix=/usr/local/nginx &> /dev/null &&  make &> /dev/null && make install &> /dev/null && \
     rm -rf /opt/nginx-1.15.9
    
    FROM centos:7
    EXPOSE 80
    VOLUME ["/usr/local/nginx/html"]
    COPY --from=build /usr/local/nginx /usr/local/nginx
    CMD ["/usr/local/nginx/sbin/nginx","-g","deamon off;"]
    [root@node1 nginx]# docker build -f nginx3 -t nginx:v4 .
    [root@node1 nginx]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
    nginx        v4        64868a58d31b   9 seconds ago       205MB
    nginx        v3        f65b91badc26   23 minutes ago      333MB
    nginx        v2        c235e84f0e22   42 minutes ago      335MB
    nginx        v1        8997d003b2d4   About an hour ago   458MB
    
    

    私有仓库的建立

    • 先下载私有仓库
    [root@node1 nginx]# docker pull registry
    Using default tag: latest
    latest: Pulling from library/registry
    6a428f9f83b0: Pull complete 
    90cad49de35d: Pull complete 
    b215d0b40846: Pull complete 
    429305b6c15c: Pull complete 
    6f7e10a4e907: Pull complete 
    Digest: sha256:265d4a5ed8bf0df27d1107edb00b70e658ee9aa5acb3f37336c5a17db634481e
    Status: Downloaded newer image for registry:latest
    docker.io/library/registry:latest
    
    [root@node1 nginx]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
    registry     latest    b2cb11db9d3d   6 days ago          26.2MB
    
    
    • 添加私有地址,然后重启服务
    [root@node1 nginx]# vim /etc/docker/daemon.json 
    {
      "insecure-registries": ["192.168.1.101:5000"],
      "registry-mirrors": ["https://cn90fxk6.mirror.aliyuncs.com"]
    }
    [root@node1 nginx]# systemctl restart docker
    
    
    • 创建容器
    [root@node1 nginx]# docker create -it registry /bin/bash
    9e4c5a98dbcf9a9d6b64877b9b6b79f9ca218f6deada6e634bd3a5a6eb88dd2f
    [root@node1 nginx]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS    PORTS     NAMES
    9e4c5a98dbcf   registry   "/entrypoint.sh /bin…"   3 seconds ago   Created             goofy_shaw
    
    
    • 需要挂载目录,不然启动会异常退出
    [root@node1 nginx]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
    2972e4688748a46819382f6b1ab0b1efd8dfaec5c0a4d895b32a38029daa7cb1
    [root@node1 nginx]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                       NAMES
    2972e4688748   registry   "/entrypoint.sh /etc…"   27 seconds ago   Up 26 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   cranky_heyrovsky
    
    
    • 将一个镜像先打标签,不打标签上传会失败,且需要将标签格式为192.168.1.101:5000/nginx有ip地址才能识别
    [root@node1 registry]# docker push nginx:v4
    The push refers to repository [docker.io/library/nginx]
    04f0c5f56b6b: Preparing 
    174f56854903: Preparing 
    denied: requested access to the resource is denied
    [root@node1 registry]# docker tag nginx:v4 192.168.1.101:5000/nginx
    [root@node1 registry]# docker push 192.168.1.101:5000/nginx
    Using default tag: latest
    The push refers to repository [192.168.1.101:5000/nginx]
    04f0c5f56b6b: Pushed 
    174f56854903: Pushed 
    latest: digest: sha256:68c8b78dbf84ab2713cffda3a423e03e9202faa830af8ebbeca6e0f8c9eda065 size: 739
    
    
    • 查看已上传的镜像信息
    [root@node1 registry]# curl -XGET http://192.168.1.101:5000/v2/_catalog
    {"repositories":["nginx","tomcat"]}
    
    
    • 测试私有仓库下载
    [root@node1 registry]# docker rmi 192.168.1.101:5000/nginx:latest 
    Untagged: 192.168.1.101:5000/nginx:latest
    Untagged: 192.168.1.101:5000/nginx@sha256:68c8b78dbf84ab2713cffda3a423e03e9202faa830af8ebbeca6e0f8c9eda065
    [root@node1 registry]# docker pull 192.168.1.101:5000/nginx
    Using default tag: latest
    latest: Pulling from nginx
    Digest: sha256:68c8b78dbf84ab2713cffda3a423e03e9202faa830af8ebbeca6e0f8c9eda065
    Status: Downloaded newer image for 192.168.1.101:5000/nginx:latest
    192.168.1.101:5000/nginx:latest
    [root@node1 registry]# docker images
    REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
    192.168.1.101:5000/nginx   latest    64868a58d31b   35 minutes ago      205MB
    nginx                      v4        64868a58d31b   35 minutes ago      205MB
    nginx                      v3        f65b91badc26   58 minutes ago      333MB
    nginx                      v2        c235e84f0e22   About an hour ago   335MB
    nginx                      v1        8997d003b2d4   2 hours ago         458MB
    
    
    展开全文
  • 镜像分层:centos的镜像只有200M,但是tomcat的镜像却400多M,为什么?是因为镜像是分层结构,就像下图,tomcat的镜像中包含了其依赖的jdk、centos等资源,所以显得比较大。 容器数据卷理解 docker容器数据...

    镜像理解

        镜像就像光盘,是个一系列文件的集合,包含了程序、配置及运行环境信息,属于联合文件系统。

        镜像分层:centos的镜像只有200M,但是tomcat的镜像却400多M,为什么?是因为镜像是分层结构,就像下图,tomcat的镜像中包含了其依赖的jdk、centos等资源,所以显得比较大。

     

    容器数据卷理解

         docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。数据卷就是容器中的数据持久化的一种方式。

         使用命令添加数据卷,需要参数v(volume的缩写),后接宿主机路径和容器路径的映射关系。 

         如果后跟ro,则表示只读。 

    docker -it -v /宿主机绝对路径:/容器内路径  镜像名
    docker -it -v /宿主机绝对路径:/容器内路径:ro  镜像名

         我们也可以使用DockerFile来添加容器卷,DockerFile就是对镜像模板的描述文件,如下描述了使用DockerFile添加容器卷的方法。

    mkdir mydocker
    cd mydocker
    vim DockerFile
    
    #volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished, ------------, success!"
    CMD /bin/bash
    
    
    docker build -f /mydocker/DockerFile -t haylen/centos .
    docker run -it haylen/centos
    
    docker inspect 运行的容器id

          数据卷容器就是指挂在数据卷的容器,该容器可以作为父容器,被其他容器挂载,从而实现容器间数据的共享。

    docker run -it --name dc01 haylen/centos
    
    docker run -it --name dc02 --volume-from dc01 haylen/centos
    
    docker run -it --name dc03 --volume-from dc01 haylen/centos

          使用这种方式共享后,把dc01删除,其共享数据仍然存在。直至所有的dc都删除,否则容器卷都一直共享存在。

     

     

     

    如果您喜欢这篇文章,别忘了点赞和评论哦!

    展开全文
  • 镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过。 临时容器:每执行一个步骤就会产生一个临时容器

    镜像分层:对于已经构建过的镜像,修改Dockerfile文件后,再次构建只会对修改的部分进行执行,已经执行过的步骤并未修改的话会掠过。
    临时容器:每执行一个步骤就会产生一个临时容器。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 通过commit / build 创建镜像理解容器分层创建镜像的方式“commit” & "build"通过创建镜像理解分层commit 命令创建镜像用Dockerfile 和 build 命令创建镜像总结 创建镜像的方式“commit” & “build” ...

    创建镜像的方式“commit” & “build”

    通过创建镜像理解分层

    commit 命令创建镜像

    Docker commit name Newname
    实例: 已安好的 centos8 上并没有 vim 命令.

    1. 在 centos8 镜像上安装 vim. 启动该镜像的交互式
      docker run -it centos
    2. yum install -y vim
    3. 安装完成后,查看刚才这个步骤的名称
      docker ps -f//docker container ls -a
      例如该次名称叫‘friendly_bardeen’在这里插入图片描述
    4. 用 commit 命令创建新的镜像
      docker commit friendly_bardeen xu1102/centos
      新的镜像 xu1102/centos 比之前的大了一些,因为多了 vim
      在这里插入图片描述
    5. docker history ID 可以看到新的 image 比之前的 base image 多了一层.其他一样
      在这里插入图片描述

    用Dockerfile 和 build 命令创建镜像

    1. mkdir docker-centos-vim
    2. cd docker-centos-vim
    3. 创建 Dockerfile: vim Dockerfile
    4. 以 Centos 为 base image / 然后安装 vim
      在这里插入图片描述
    5. docker build -t xu1102-centos-vim
      可以看到创建过程分为了两步: Step 1/2; Step 2/2
      在这里插入图片描述
    6. 过程中可以看到,先创建了一个 container, 为了能够安装 vim,安装成功后又将 container 删除了在这里插入图片描述
    7. docker image ls -a
      在这里插入图片描述

    总结

    尽量还是不要用 commit, 这种方式创建的镜像对于下载的人来说是不安全的. 因为别人看不到你的步骤,也不知道这个 image 里面包含了什么.

    展开全文
  • 一个镜像可以创建N个容器 一个标准化的交付 一个不包含Linux内核而又精简的Linux操作系统 镜像层   镜像可以看成是由多个镜像层叠加起来的一个文件系统 ,镜像层也可以简单理解为一个基本的镜像,每个镜像层之间...
  • docker镜像分层

    2021-06-02 22:41:31
    这里写目录标题一、Docker镜像的分层(一)概述docker镜像docker镜像的创建方法镜像分层原则镜像分层结构(二)dockerfile结构(三)dockerfile操作指令二、编写ssh dockerfile 一、Docker镜像的分层 (一)概述 ...
  • 目录docker简介docker和虚拟机的区别:容器是如何工作的配置docker搭建docker仓库下载docker-ce测试镜像分层文件导入镜像Dockerfile详解删除掉刚才建立的镜像镜像构建- -nginx docker简介 Docker是管理容器的引擎...
  • 文章目录一、Docker 镜像分层二、Docker 容器创建方法1.基于已有镜像创建2.基于本地模板创建3.基于 Dockerfile 创建(重点)①概述②操作指令③示例 一、Docker 镜像分层 Dockerfile 由多条指令构成,随着深入研究 ...
  • Dockerfile 镜像分层

    2021-06-02 14:03:04
    一、docker镜像分层(基于AUFS构建) Docker镜像位于bootfs之上每一层镜像的下一层成为父镜像 第一层镜像成为base image(操作系统环境镜像>容器层(可读可写),在最顶层(writable) 容器层以下都是readonly ...
  • 镜像分层结构 Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile 如下: 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像...
  • Commit : 当然还有另外一种方式,就是通过镜像启动一个容器,然后进行操作,最终通过commit这个命令commit一个镜像,但是不推荐这种方式,虽然说通过commit这个命令像是操作虚拟机的模式,但是容器毕竟是容器,它...
  • docker容器镜像

    2021-03-26 10:16:18
    拿到容器镜像后,启动容器 一、容器的介绍 Docker 镜像就是一组只读的目录,或者叫只读的 Docker 容器模板,镜像中含有一个Docker 容器运行所需要的文件 系统,所以我们说Docker 镜像是启动一个Docker 容器的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,132
精华内容 4,852
关键字:

容器镜像分层