zoukankan      html  css  js  c++  java
  • 3、Docker镜像管理基础

    Docker image

       

    # docker image ls

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    redis               4-alpine            23d561d12e92        9 days ago          35.5MB
    nginx               1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
    busybox             latest              3a093384ac30        6 weeks ago         1.2MB

    # docker exec -it kvstor1 /bin/sh
    /data # ls /
    bin data dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var   //完整意义上的根文件系统,是底层--> Base Image

    Docker Image Layer

    位于下层的镜像成为父镜像(parent image),最底层的成为基础镜像(base image)

    最上层为"可读写"层,其下的均为"只读"层。

    分层构建是在纯净的Debian镜像之上添加一个emacs,然后在emacs之上再添加apache。每添加一个软件都是一个独立的层次,bootfs/Kernel层在容器启动时,rootfs一旦被引导完成,会被从内存中移除。

    真正的用户空间运行的只有Debian、emacs、apache这三层,同时这三层是有层级关系的。最底层的是base image,是供给一个系统的基本构成(比如bin、sbin等),但是它是最小化的,没有依赖的应用程序。

    如果需要用到某些额外的应用程序的话,需要在其上面进行安装操作。比如最小化安装了centos,然后在centos上安装vim。注意对于镜像来讲,是只读的,需要创建的centos镜像是最小化,是不会动的,安装vim时会在这个镜像上生成一个新的层次,这个层次只包含vim程序。如果安装httpd的话,需要在vim层安装一个新的层次。如果要启动nginx的,就要把centos、vim和nginx这三层都启动起来。

    容器启动起来之后,如果需要创建临时文件,一般是放在/tmp目录下的,但是在docker中/tmp是位于底层基础镜像中是不允许编辑的,所以就要在最上层添加可读写层。

    注意:如果删除了容器,最上层的"可读写"层也会被删除。

    Aufs 

    镜像的分层构建和联合挂载依赖于中游文件系统的支撑才能实现,在早期用到的专有文件系统叫aufs

    # docker info

    Storage Driver: overlay2   //前端
    Backing Filesystem: xfs    //后端

    Docker Registry

    启动容器时,docker daemon会试图从本地获取相关的镜像;

    本地镜像不存在时,其将从Registry中下载该镜像并保存到本地;

    如果没有特别指定registry,那么通常就是docker hub;

    如果要指向别的registry,必须在镜像的访问路径当中指明服务器地址;

    如果没有服务器地址,只给了仓库名/tags,那么这个镜像一定是指docker hub。

    Docker Registry 分类

    Registry 组成

    Docker Hub支持的功能:   https://www.kancloud.cn/thinkphp/docker-guide/39734

    非常著名的镜像服务器:https://quay.io/

    如果要使用,需要下载到本地并安装  https://quay.io/repository/coreos/flannel   -->  docker pull quay.io/coreos/flannel

    从镜像仓库服务器中下载镜像

    docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>   如果是docker hub,那么<registry>[:<port>]是可以省略的

    <registry>:仓库服务器

    <port>:端口,默认是443即https协议,可省略,

    <namespace>:名称空间,指哪个用户的仓库,如果是顶层,可省略

    <name>:<tag> :仓库名 + 标签名

    # docker pull quay.io/coreos/flannel:v0.10.0-amd64   //这里没有指定端口表示是默认端口443,因为是通过https来获取的

    quay.io 表示 <registry>

    coreos 表示 <namespace>

    flannel 表示 <name>

    v0.10.0-amd64 表示 <tag>

    Namespace的用法

    镜像的相关操作

    镜像的生成途径

    如何基于容器创建镜像:

    某个容器已经启动并处于运行中,那么使用docker commit把此运行的容器最上面的可写层单独创建一个镜像。

    比如启动一个容器后,做好想要的修改,比如启动纯净的centos,在centos镜像上安装nginx --> #yum install nginx,然后把安装、生成nginx文件的可写层单独做成镜像。

    示例:在busybox的基础上,加上data/html目录,并创建index.html网页,把此结果做成镜像

    # docker commit -h

    Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]   
              //表示基于哪个容器(CONTAINER)做镜像,并指明属于哪个仓库(REPOSITORY)和拥有什么标签(TAG)      
              //[REPOSITORY[:TAG]]是可以省略的,省略后表示所作的镜像就是本地的裸镜像,不属于任何仓库,也没有任何标签                
    Create a new image from a container's changes                               
    Options:
      -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
      -c, --change list      Apply Dockerfile instruction to the created image
      -m, --message string   Commit message
      -p, --pause     Pause container during commit (default true)  
       //在制作镜像时,如果容器中的程序仍在运行,可能会生成新的文件,那么可能会导致制作的镜像中的新生成的文件是不完整的,所以在制作镜像时尽量使用-p选项,让容器中的程序暂停运行
    [root@node1 ~]# docker run --name b1 -it busybox
    / # ls /
    bin   dev   etc   home  proc  root  sys   tmp   usr   var
    / # mkdir -p /data/html
    / # vi /data/html/index.html
        <h1>Busybox server<h1>
    以上修改在如果没有制做成镜像之前关闭容器b1的话,那么这些修改将不会保存。
    在容器不关闭的情况下,把对此容器的修改进行保存。
    [root@node1 ~]# docker commit -p b1
    sha256:439595aa4b0f893362aa08a43ce7936d1cda2fa10d7b1e8d03b4a18bfcf1c0be
    [root@node1 ~]# docker image ls
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    <none>                   <none>              439595aa4b0f        10 seconds ago      1.2MB   //制作的新镜像
    redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
    nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
    busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
    quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
    [root@node1 ~]# docker tag -h
    Flag shorthand -h has been deprecated, please use --help
    为镜像打标签
    Usage:    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]  
    //SOURCE_IMAGE[:TAG]-->源镜像:源标签。镜像支持多个标签,如果原来有标签,这里表示源标签,如果之前没有标签那么则用IMAGE ID代替 Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
    [root@node1
    ~]# docker tag 439595aa4b0f beisen/httpd:v0.1-1 [root@node1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE beisen/httpd v0.1-1 439595aa4b0f 4 minutes ago 1.2MB redis 4-alpine 23d561d12e92 9 days ago 35.5MB nginx 1.14-alpine 66952fd0a8ef 2 weeks ago 16MB busybox latest 3a093384ac30 6 weeks ago 1.2MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 12 months ago 44.6MB
    为一个镜像打多个标签
    [root@node1 ~]# docker tag beisen/httpd:v0.1-1 beisen/httpd:latest
    [root@node1 ~]# docker image ls
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    beisen/httpd             latest              439595aa4b0f        10 minutes ago      1.2MB
    beisen/httpd             v0.1-1              439595aa4b0f        10 minutes ago      1.2MB
    redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
    nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
    busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
    quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
    删除一个标签,如果还有其他标签的话就不会把容器删除
    [root@node1 ~]# docker image rm beisen/httpd:latest
    Untagged: beisen/httpd:latest
    [root@node1 ~]# docker image ls
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    beisen/httpd             v0.1-1              439595aa4b0f        11 minutes ago      1.2MB
    redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
    nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
    busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
    quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
    基于容器b1做的镜像再次创建一个容器t1
    [root@node1 ~]# docker run --name t1 -it beisen/httpd:v0.1-1
    / # ls /
    bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
    / # ls /data/html/
    index.html
    / # cat /data/html/index.html 
    <h1>Busybox server<h1>

     / # which httpd
     /bin/httpd     //httpd的路径

    / # httpd -h
    httpd: option requires an argument -- h
    BusyBox v1.30.0 (2018-12-31 18:16:17 UTC) multi-call binary.
    
    Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
    or httpd -d/-e/-m STRING
    
    Listen for incoming HTTP requests
    
        -i        Inetd mode
        -f        Don't daemonize
        -v[v]        Verbose
        -p [IP:]PORT    Bind to IP:PORT (default *:80)
        -u USER[:GRP]    Set uid/gid after binding to port
        -r REALM    Authentication Realm for Basic Authentication
        -h HOME        Home directory (default .)   //指定家目录
        -c FILE        Configuration file (default {/etc,HOME}/httpd.conf)
        -m STRING    MD5 crypt STRING
        -e STRING    HTML encode STRING
        -d STRING    URL decode STRING

    镜像定义了基于此镜象启动容器时默认运行的程序,这里修改默认运行的程序

    # docker inspect beisen/httpd:v0.1-1   //首先查看容器b1运行的默认程序

    "Cmd": [
        "sh"    //这里默认运行的程序是sh
    ],

    修改新创建的容器t1不再运行sh,而是运行httpd

    # docker commit -h
    Flag shorthand -h has been deprecated, please use --help
    Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    Create a new image from a container's changes
    Options:
      -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
      -c, --change list      Apply Dockerfile instruction to the created image
      -m, --message string   Commit message
      -p, --pause            Pause container during commit (default true)

    # docker commit -a "beisen" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 beisen/httpd:v0.2

    -a:指定作者

    -c:修改默认运行的程序 --> /bin/httpd

    -f:运行在前台

    -h:指定家目录,可以和/data/html写在一起,但是-h和/data/html之间是有空格的,所以这里分开写,但是要注意两者的次序。

    -p:让容器的程序处于暂停状态

    b1:这里基于容器b1创建镜像,同时修改这个新镜像的默认启动程序

    beisen/httpd:v0.2:新镜像的仓库名和tag

    # docker run --name t2 beisen/httpd:v0.2    //基于新创建的镜像运行一个容器t2,这里没有使用-it,因为httpd不是交互式接口

    # docker container ls
    CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS               NAMES
    c7ba9dc66b18        beisen/httpd:v0.2     "/bin/httpd -f -h /d??   About a minute ago   Up About a minute                       t2       //容器t2已经启动了
    465aab04ace8        beisen/httpd:v0.1-1   "sh"                     35 minutes ago       Up 35 minutes                           t1
    fb13aceb4369        busybox               "sh"                     4 hours ago          Up 4 hours                              b1
    da481ee71e45        redis:4-alpine        "docker-entrypoint.s??   9 hours ago          Up 9 hours          6379/tcp            kvstor1
    3ecb4f5d9a10        nginx:1.14-alpine     "nginx -g 'daemon of??   9 hours ago          Up 9 hours          80/tcp              web1

    # docker inspect t2

    "Cmd": [
        "/bin/httpd",
        "-f",
        "-h",
        "/data/html"
    ],

    "IPAddress": "172.17.0.6",

    # curl 172.17.0.6   //可以直接进行请求
      <h1>Busybox server<h1>

    实现push镜像

    在https://hub.docker.com注册账号

    账号:studycolumn

    创建仓库,注意本地的标签一定要和远程仓库保持一致

    这里将之前创建的仓库名加以修改

    # docker tag beisen/httpd:v0.2 studycolumn/httpd:v0.2

    [root@node1 ~]# docker image ls
    REPOSITORY TAG IMAGE ID CREATED SIZE
    beisen/httpd v0.2 24577eceda35 About an hour ago 1.2MB
    studycolumn/httpd v0.2 24577eceda35 About an hour ago 1.2MB

    # docker image rm beisen/httpd:v0.2

    将创建的镜像push到新建的仓库中

    # docker push -h
    Flag shorthand -h has been deprecated, please use --help
    Usage:    docker push [OPTIONS] NAME[:TAG]
    Push an image or a repository to a registry
    Options:
          --disable-content-trust   Skip image signing (default true)

    在push之前,先登录到服务器上

    [root@node1 ~]# docker login -h
    Flag shorthand -h has been deprecated, please use --help
    Usage:    docker login [OPTIONS] [SERVER]     //如果是docker hub的话,server不用指,如果是其他服务器必须指明
    Log in to a Docker registry
    Options:
      -p, --password string   Password
          --password-stdin    Take the password from stdin
      -u, --username string   Username

    登陆仓库服务器

    # docker login -u studycolumn
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded

    将创建好的镜像上传到仓库服务器

    # docker push studycolumn/httpd
    The push refers to repository [docker.io/studycolumn/httpd]
    8f6d148780a1: Pushed 
    683f499823be: Mounted from library/busybox 
    v0.2: digest: sha256:92c7b7e535cca5208cb0c63ad92c2fd52d172bdd67aa56529824dcf968dd3089 size: 734

    使用阿里云的仓库push和pull镜像

    阿里云  https://promotion.aliyun.com/ntms/act/kubernetes.html    账号studycolumn

    镜像加速地址 https://cr.console.aliyun.com/cn-hangzhou/mirrors

    # vim /etc/docker/daemon.json   //添加加速地址

    1 {
    2 "registry-mirrors": ["https://registry.docker-cn.com","https://7g3yx938.mirror.aliyuncs.com"]
    3 }

    也可以在阿里云创建镜像仓库

    镜像的导入或导出

    node2想要使用node1创作的镜像,不是通过push仓库再从仓库中pull下来,而是现在node1上把镜像(docker save)打包,然后在node2上把解压(docker load)镜像。

    # docker save --help
    Usage:    docker save [OPTIONS] IMAGE [IMAGE...]
    Save one or more images to a tar archive (streamed to STDOUT by default)
    Options:
      -o, --output string   Write to a file, instead of STDOUT

    # docker save -o myimages.gz studycolumn/httpd:v0.2 beisen/httpd:v0.1-1

    # scp myimages.gz node2:/root

    下面在node2上安装docker,这里scp node1上已有得文件

    # scp /etc/yum.repos.d/docker-ce.repo node2:/etc/yum.repos.d/    //复制node1上得docker yum源到node2上

    # yum install docker-ce  //在node2上安装docker社区版

    # mkdir -p /etc/docker   //在node2上创建目录

    # scp /etc/docker/daemon.json node2:/etc/docker/     //在node1复制文件,此文件包括加速地址

    # systemctl start docker   //在node2上启动docker

    node2 ~]# docker info

    ......

    Registry Mirrors:   //加速服务器
    https://registry.docker-cn.com/    
    https://7g3yx938.mirror.aliyuncs.com/   

    ......

    node2 ~]# docker load --help
    Usage:    docker load [OPTIONS]
    Load an image from a tar archive or STDIN
    Options:
      -i, --input string   Read from tar archive file, instead of STDIN
      -q, --quiet          Suppress the load output

    node2 ~]# docker load -i myimages.gz

    683f499823be: Loading layer  1.416MB/1.416MB
    8f6d148780a1: Loading layer   5.12kB/5.12kB
    Loaded image: studycolumn/httpd:v0.2
    f51e2aa679fa: Loading layer   5.12kB/5.12kB
    Loaded image: beisen/httpd:v0.1-1 

     

  • 相关阅读:
    SetConsoleScreenBufferSize 函数--设置控制台屏幕缓冲区大小
    GetConsoleScreenBufferInfo 函数--获取控制台屏幕缓冲区信息
    CONSOLE_SCREEN_BUFFER_INFO 结构体
    GetStdHandle 函数--获取标准设备的句柄
    设计模式之代理模式(Proxy Pattern)_远程代理解析
    设计模式之状态模式(State Pattern)
    设计模式之组合模式(Composite Pattern)
    设计模式之迭代器模式(Iterator Pattern)
    设计模式之模版方法模式(Template Method Pattern)
    设计模式之外观模式(Facade Pattern)
  • 原文地址:https://www.cnblogs.com/hanshanxiaoheshang/p/10389153.html
Copyright © 2011-2022 走看看