zoukankan      html  css  js  c++  java
  • docker 实践二:操作镜像

    本篇我们来详细介绍 docker 镜像的操作。

    注:环境为 CentOS7,docker 19.03

    之前已经说过,容器是 docker 的核心概念之一,所以对应的就需要知道它的使用方法,接下来我们就来了解 docker 镜像的添加、删除、查找等操作。

    获取镜像

    docker 获取镜像使用的命令为:docker [image] pull NAME[: TAG]

    • pull:docker 的子命令,用来获取仓库中的镜像
    • NAME:镜像的名称
    • TAG:TAG是镜像的标签(往往⽤来表⽰版本信息)

    例如我们获取一个 Ubuntu18.04 系统的基础镜像,就可以使用命令:

    docker pull ubuntu:18.04
    

    如果不指定版本,默认就拉取最新的版本 ubuntu:latest

    注:一般来说,镜像的 latest 表示该镜像内容为最新,出于稳定性考虑,不要在生产中使用最新版本的,最好拉取是带上版本号。

    使⽤docker pull命令下载中会获取并输出镜像的各层信息。 当不同的镜像包括相同的层时, 本地仅存储了层的⼀份内容, 减⼩了存储空间。

    如果我们要从指定的仓库中拉取,可以通过补全镜像的路径实现,例如从网易上拉取 ubuntu18.04,命令如下:

    docker pull hub.c.163.com/public/ubuntu:18.04
    

    pull⼦命令⽀持的选项主要包括:

    • -a, --all-tags=true|false: 是否获取仓库中的所有镜像, 默认
    • --disable-content-trust: 取消镜像的内容校验, 默认为真

    一般在国内,拉取官方的镜像速度,所以我们可以改成默认从国内云服务供应商的仓库上拉取,比如阿里云的。需要修改配置文件如下:

    # cat /etc/docker/daemon.json 
    {
          "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
    }
    

    下载了镜像后,我们就可以使用它了:

    # docker run -it ubuntu:18.04 bash
    root@fe3ce439f6dc:/# echo "Hello World"
    Hello World
    root@fe3ce439f6dc:/# exit
    

    这是关于 docker 容器部分的知识,这里暂时不做解释。

    查看镜像

    查看镜像主要使用 docker 的 lstaginspect子命令:

    imges 子命令

    使用 images 列出所有镜像:

    # docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              18.04               a2a15febcdf3        5 days ago          64.2MB
    redis               latest              f7302e4ab3a8        5 days ago          98.2MB
    

    我们来说明下输出的信息:

    • REPOSITORY:来⾃于哪个仓库, ⽐如ubuntu表⽰ubuntu系列的基础镜像;
    • TAG:镜像的标签信息, ⽐如18.04、 latest表⽰不同的版本信息。 标签只是标记, 并不能标识镜像内容;
    • IMAGE ID:镜像的ID(唯⼀标识镜像) , 如果两个镜像的ID相同, 说明它们实际上指向了同⼀个镜像, 只是具有不同标签名称⽽已;
    • CREATED:创建时间, 说明镜像最后的更新时间;
    • SIZE:镜像⼤⼩, 优秀的镜像往往体积都较⼩。

    images⼦命令主要⽀持如下选项:

    • -a, --all=true|false: 列出所有(包括临时⽂件) 镜像⽂件, 默认为否;
    • --digests=true|false: 列出镜像的数字摘要值, 默认为否;
    • -f, --filter=[]: 过滤列出的镜像, 如dangling=true只显⽰没有被使⽤的镜像; 也可指定带有特定标注的镜像等;
    • --format="TEMPLATE": 控制输出格式, 如.ID代表ID信息, .Repository代表仓库信息等;
    • --no-trunc=true|false: 对输出结果中太长的部分是否进⾏截断, 如镜像的ID信息, 默认为是;
    • -q, --quiet=true|false: 仅输出ID信息, 默认为否。

    其中, 还⽀持对输出结果进⾏控制的选项, 如-f.--filter=[]、 --notrunc=true|false、 -q、 --quiet=true|false等

    tag 子命令

    通过 tag 子命令可以为镜像添加一个新的标签。

    [root@CentOS1 ~]# docker tag ubuntu:18.04 myubuntu:18.04
    [root@CentOS1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    myubuntu            18.04               a2a15febcdf3        5 days ago          64.2MB
    ubuntu              18.04               a2a15febcdf3        5 days ago          64.2MB
    

    如果细节看的话会发现 ubuntu 和 myubuntu 的 IMAGE ID 是一样的,因为 tag 子命令其实是给原来的镜像添加了别名,内部指向同一个文件,所以删除其中的某一个,只是删除一个链接而已,实际的镜像文件依然存在。

    inspect 子命令

    使用 inspect 子命令来查看镜像的详细信息:docker [image] inspect

    docker inspect ubuntu
    

    返回 JSON 格式的消息,如果只要其中一项内容,可以使用 -f 指定:

    docker inspect -f {{".Architecture"}} ubuntu
    

    history 子命令

    使用 history 子命令查看镜像的历史命令

    docker history ubuntu 
    

    输出会被截断,带上--no-trunc选项输出全部信息。

    搜寻镜像

    使用 search 子命令可以在仓库中搜寻我们需要的镜像,语法为 docker search [option] keyword,⽀持的命令选项主要包括:

    • -f, --filter filter: 过滤输出内容;
    • --format string: 格式化输出内容;
    • --limit int: 限制输出结果个数, 默认为25个;
    • --no-trunc: 不截断输出结果。

    例如我们搜寻名为 nginx 的镜像:

    docker search --limit=4 --filter=starts=4 nginx
    

    删除镜像

    删除镜像使用 docker rmi 或者 docker images rm,语法为 docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。⽀持选项包括:

    • -f, -force: 强制删除镜像, 即使有容器依赖它;
    • -no-prune: 不要清理未带标签的⽗镜像。
    docker rmi myubuntu:latest
    

    当该镜像存在容器时,不能删除镜像,但可以加上 -f 选项强制删除,同时也删除容器。

    注:当一个镜像有多个 tag 时,docker rmi 只是删除该镜像的标签,不会影响到镜像文件

    清理镜像

    使⽤Docker⼀段时间后, 系统中可能会遗留⼀些临时的镜像⽂件, 以及⼀些没有被使⽤的镜像, 可以通过 docker image prune 命令来进⾏清理。⽀持选项包括:

    • -a, -all: 删除所有⽆⽤镜像, 不光是临时镜像;
    • -filter filter: 只清理符合给定过滤器的镜像;
    • -f, -force: 强制删除镜像, ⽽不进⾏提⽰确认。
    # docker image prune -f
    Total reclaimed space: 0B
    

    创建镜像

    创建 docker 镜像的方法有三种:基于已有镜像的容器创建、 基于本地模板导⼊、 基于Dockerfile创建。

    基于已有镜像的容器创建

    使用命令 docker [container] commit 命令,语法为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[: TAG]]。主要选项包括:

    • -a, --author="": 作者信息;
    • -c, --change=[]: 提交的时候执⾏Dockerfile指令, 包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
    • -m, --message="": 提交消息;
    • -p, --pause=true: 提交时暂停容器运⾏。

    下面我们尝试下:首先启动一个镜像,在镜像中做一些修改,之后用修改过的容器创建镜像。

    # docker run -it ubuntu:latest bash
    root@a93ecdb26b77:/# echo "hello world" > test
    root@a93ecdb26b77:/# exit
    exit
    
    #  docker commit -m "Added test" -a "xingyys" a93ecdb26b77 test            
    sha256:5f538a96c081d2f64356cd64eb38f7cc0b6987bb07ba283032796c8c7dc2cf2f
    

    基于本地模板导⼊

    ⽤户也可以直接从⼀个操作系统模板⽂件导⼊⼀个镜像, 主要使⽤ docker [container] import 命令。 命令格式为 docker [image] import [OPTIONS] file | URL | - [REPOSITORY[: TAG]]

    cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
    

    基于Dockerfile创建

    基于Dockerfile创建是最常见的⽅式。 Dockerfile是⼀个⽂本⽂件,利用 docker 的指令能快速制作一个镜像。
    下面给出一个简单的实例,基于基于debian: stretch-slim镜像安装Python 3环境, 构成⼀个新的python:3镜像。创建一个 dockerfile 文件,写入:

    FROM debian:stretch-slim
    LABEL version="1.0" maintainer="docker user <docker_user@github>"
    RUN apt-get update && 
        apt-get install -y python3 && 
        apt-get clean && 
        rm -rf /var/lib/apt/lists/*
    

    使⽤docker[image]build命令创建, 编译成功后本地将多出⼀个python:3镜像:

    docker [image] build -t python:3 .
    

    导出和载入镜像

    docker 还提供了镜像的导出和载入。使用命令 docker [image] save 导出镜像:

    docker save -o ubuntu.tar ubuntu
    

    导出后的文件就可以复制到其他机器上载入了,对应的载入命令为 docker [image] load :

    docker load -i ubuntu.tar
    

    或者是

    docker load < ubuntu.tar
    

    上传镜像

    push⼦命令可以让我们将本地的镜像上传到仓库中。默认上传到Docker Hub官⽅仓库(需要登录)。 格式为 docker [image] push NAME[: TAG]|[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[: TAG]
    ⽤户在Docker Hub⽹站注册后可以上传⾃制的镜像。例如, ⽤户user上传本地的test: latest镜像, 可以先添加新的标签 user/test: latest, 然后⽤ docker [image] push命令上传镜像:

    # docker tag test:latest user/test:latest
    
    # docker push user/test:latest
    The push refers to a repository [docker.io/user/test]
    Sending image list
    Please login prior to push: Username: Password: Email:
    

    第⼀次上传时, 会提⽰输⼊登录信息或进⾏注册, 之后登录信息会记录到本地~/.docker⽬录下。

  • 相关阅读:
    kubernetes进阶(一) kubectl工具使用详解
    二进制安装kubernetes(七) 部署知识点总结
    1024程序员节:这就是国内开发者的现状?
    php 伪协议
    浅谈 PHP 与手机 APP 开发(API 接口开发)
    比RBAC更好的权限认证方式(Auth类认证)
    PHP获得毫秒数
    2020年PHP面试题附答案(实战经验)
    分享几套2019年各大公司最新的PHP面试题,几斤几两一试便知
    PHP面试题2019年百度工程师面试题及答案解析
  • 原文地址:https://www.cnblogs.com/xingyys/p/11385457.html
Copyright © 2011-2022 走看看