zoukankan      html  css  js  c++  java
  • docker知识3---镜像

    一、镜像image

    镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
    linux发行版(OS)=linux kernel➕外围软件(meta data);
    应用镜像=基础镜像rootfs(meta data)➕应用程序image分层(文件);
    增删文件则会形成一个新的image,不同image可共享相同的基础镜像rootfs,image本身是只读的,按多层进行存储;

    Usage:  docker image COMMAND
    Manage images
    Commands:
      build       Build an image from a Dockerfile
      history     Show the history of an image
      import      Import the contents from a tarball to create a filesystem image
      inspect     Display detailed information on one or more images
      load        Load an image from a tar archive or STDIN
      ls          List images
      prune       Remove unused images
      pull        Pull an image or a repository from a registry
      push        Push an image or a repository to a registry
      rm          Remove one or more images
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE   
    Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
    List images
    Options:
      -a, --all             Show all images (default hides intermediate images)
          --digests         Show digests
      -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print images using a Go template
          --no-trunc        Don't truncate output
      -q, --quiet           Only show numeric IDs
    

    docker images #列出所有镜像;
    docker image ls #列出所有镜像;
    docker image ls -q #列出所有镜像id;
    docker image rm alpine #删除latest版本的镜像;
    docker image rm alpine:3.14 #删除镜像alpine:3.14;
    docker rmi alpine #简写方式:删除latest版本的镜像;

    镜像获取方式:
      1)根据dockerfile创建image:每一行在build过程中会创建一个分层(layer);
      2)现有容器修改后生成新的image:尽量避免使用,缺点:镜像大,使用者不清楚镜像如何构成;
      3)从仓库拉取创建好的image:尽量使用官方镜像(https://hub.docker.com/中explore下的镜像),以确保系统安全;若不指定tag,则默认拉取lastest版本镜像;

    案例1:拉取官方镜像

     案例2:制作dockerfile并创建image

    mkdir /root/hello/
    cd /root/hello/
    cat <<eof> hello.c
    #include<stdio.h>
    int main()
    {
        printf("hello world! from chalon.");
    }
    eof
    yum -y  install gcc glibc glibc-static  #编译c语言程序需要gcc编译器及glibc库文件;
    gcc -static hello.c -o hello            #编译c语言程序为二进制执行文件;
    ./hello                                 #测试二进制程序;
    cat <<eof> dockerfile
    FROM scratch            #基础镜像为空;
    ADD hello /             #将本目录下hello程序添加进镜像根目录;
    CMD ["/hello"]          #运行容器时默认执行/hello程序;
    eof
    docker build -t chalon/hello-world:v1 ./    #在当前目录下构建image;
    docker history chalon/hello-world:v1        #查看镜像历史记录,确认镜像分层layer为2;
    docker image ls;ll -h                       #image基于hello创建,文件大小差别不大;
    docker run chalon/hello-world:v1            #启动image运行容器;
    

    案例 3  本地自建仓库,并上传、拉取、管理镜像

    ##镜像拉取采用https协议,因此本地仓库需要在配置中写明为insecure-registries;
    cat <<eof> /etc/docker/daemon.json   
    {
        "exec-opts":["native.cgroupdriver=systemd"],
        "log-driver":"json-file",
        "log-opts":{
            "max-size":"100m"
        },
        "experimental": true,
        "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
        "insecure-registries": ["localhost:50000"] 
    }
    eof
    sed -i '/[Service]/aEnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service  #设置docker.service的启动配置文件为/etc/docker/daemon.json;
    systemctl daemon-reload && systemctl restart docker
    docker run -d -p 50000:5000 --restart always --name chalon_registry registry  #创建本地仓库chalon_registry;
    docker pull alpine
    docker tag alpine localhost:50000/alpine:v1               #重新标记镜像为本地仓库的镜像;
    docker push localhost:50000/alpine:v1                     #推送镜像至本地仓库;
    docker rmi localhost:50000/alpine:v1 && docker images     #删除测试镜像;
    docker pull localhost:50000/alpine:v1 && docker images    #测试从本地仓库拉取镜像;
    docker exec -it chalon_registry ls /var/lib/registry/docker/registry/v2/repositories/   #登录自建仓库查看仓库镜像明细;
    curl http://localhost:50000/v2/_catalog                   #查看本地仓库的images目录;
    curl http://localhost:50000/v2/alpine/tags/list           #查看本地仓库的image的版本信息;
    ##其他node测试本地仓库是否可用;
    cat <<eof> /etc/docker/daemon.json   
    {
        "exec-opts":["native.cgroupdriver=systemd"],
        "log-driver":"json-file",
        "log-opts":{
            "max-size":"100m"
        },
        "experimental": true,
        "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
        "insecure-registries": ["192.168.66.10:50000"] 
    }
    eof
    sed -i '/[Service]/aEnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service  #设置docker.service的启动配置文件为/etc/docker/daemon.json;
    systemctl daemon-reload && systemctl restart docker
    docker pull 192.168.66.10:50000/alpine:v1 && docker images 
    

     

     

     

  • 相关阅读:
    Session机制详解及分布式中Session共享解决方案
    分布式事务解决方案及实现
    MYSQL学习之安装、主从复制、读写分离原理解析以及详细配置(MySQL5.7)
    MySQL常见问题集锦及注意事项
    MySQL学习之索引机制详解(B+树)
    最全排序算法原理解析、java代码实现以及总结归纳
    判断某一点是否在几何图形内部
    .net项目dll内嵌加载
    WPF实现分页控件
    .net实现网易云音乐下载
  • 原文地址:https://www.cnblogs.com/chalon/p/15068755.html
Copyright © 2011-2022 走看看