zoukankan      html  css  js  c++  java
  • 关于 Docker 镜像的操作,看完这篇就够啦 !(下)

    Docker 镜像学习(下)

    紧接着上篇《关于 Docker 镜像的操作,看完这篇就够啦 !(上)》,奉上下篇 !!!

    镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的。本文将带您一步一步,图文并重,上手操作来学习它。

    目录:

    • 一、Docker 删除镜像
      • 1.1 通过标签删除镜像
      • 1.2 通过 ID 删除镜像
      • 1.3 删除镜像的限制
      • 1.4 清理镜像
    • 二、Docker 创建镜像
      • 2.1 基于已有的镜像创建
      • 2.2 基于 Dockerfile 创建
    • 三、Docker 导出&加载镜像
      • 3.1 导出镜像
      • 3.2 加载镜像
    • 四、Docker 上传镜像
      • 4.1 获取 Docker ID
      • 4.2 创建镜像仓库
      • 4.3 上传镜像
    • 五、总结

    一、Docker 删除镜像

    1.1 通过标签删除镜像

    通过如下两个都可以删除镜像:

    docker rmi [image]
    

    或者:

    docker image rm [image]
    

    支持的子命令如下:

    • -f, -force: 强制删除镜像,即便有容器引用该镜像;
    • -no-prune: 不要删除未带标签的父镜像;

    Docker 查看镜像信息

    例如,我们想删除上章节创建的 allen_mysql:5.7 镜像,命令如下:

    docker rmi allen_mysql:5.7
    

    Docker 删除镜像

    从上面章节中,我们知道 allen_mysql:5.7docker.io/mysql:5.7 实际上指向的是同一个镜像,那么,您可以能会有疑问,我删除了 allen_mysql:5.7, 会不会将 docker.io/mysql:5.7 镜像也给删除了?

    实际上,当同一个镜像拥有多个标签时,执行 docker rmi 命令,只是会删除了该镜像众多标签中,您指定的标签而已,并不会影响原始的那个镜像文件。

    不信的话,我们可以执行 docker images 命令,来看下 docker.io/mysql:5.7 镜像还在不在:

    Docker 查看镜像信息

    可以看到,docker.io/mysql:5.7 镜像依然存在!

    那么,如果某个镜像不存在多个标签,当且仅当只有一个标签时,执行删除命令时,您就要小心了,这会彻底删除镜像。

    例如,这个时候,我们再执行 docker rmi docker.io/mysql:5.7 命令:

    Docker 删除镜像

    从上图可以看到,我们已经删除了 docker.io/mysql:5.7 镜像的所有文件层。该镜像在本地已不复存在了!

    1.2 通过 ID 删除镜像

    除了通过标签名称来删除镜像,我们还可以通过制定镜像 ID, 来删除镜像,如:

    docker rmi ee7cbd482336
    

    一旦制定了通过 ID 来删除镜像,它会先尝试删除所有指向该镜像的标签,然后在删除镜像本身。

    1.3 删除镜像的限制

    删除镜像很简单,但也不是我们何时何地都能删除的,它存在一些限制条件。

    当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。为了验证这一点,我们来做个试验。首先,我们通过 docker pull alpine 命令,拉取一个最新的 alpine 镜像, 然后启动镜像,让其输出 hello, docker!:

    Docker run alpine

    接下来,我们来删除这个镜像试试:

    Docker 删除镜像

    可以看到提示信息,无法删除该镜像,因为有容器正在引用他!同时,这段信息还告诉我们,除非通过添加 -f 子命令,也就是强制删除,才能移除掉该镜像!

    docker rmi -f docker.io/alpine
    

    但是,我们一般不推荐这样暴力的做法,正确的做法应该是:

    1. 先删除引用这个镜像的容器;
    2. 再删除这个镜像;

    也就是,根据上图中提示的,引用该镜像的容器 ID (9d59e2278553), 执行删除命令:

    docker rm 9d59e2278553
    

    然后,再执行删除镜像的命令:

    docker rmi 5cb3aa00f899
    

    Docker 删除镜像

    这个时候,就能正常删除了!

    1.4 清理镜像

    我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理:

    docker image prune
    

    它支持的子命令有:

    • -a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;
    • -f, --force:强制删除镜像文件,无需弹出提示确认;

    另外,执行完 docker image prune 命令后,还是告诉我们释放了多少存储空间!

    二、Docker 创建镜像

    此小节中,您将学习 Docker 如何创建镜像?Docker 创建镜像主要有三种:

    1. 基于已有的镜像创建;
    2. 基于 Dockerfile 来创建;
    3. 基于本地模板来导入;

    我们将主要介绍常用的 1,2 两种。

    2.1 基于已有的镜像创建

    通过如下命令来创建:

    docker container commit
    

    支持的子命令如下:

    • -a, --author="": 作者信息;
    • -c, --change=[]: 可以在提交的时候执行 Dockerfile 指令,如 CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME、WORIR 等;
    • -m, --message="": 提交信息;
    • -p, --pause=true: 提交时,暂停容器运行。

    接下来,基于本地已有的 Ubuntu 镜像,创建一个新的镜像:

    Docker 创建镜像

    首先,让我将它运行起来,并在其中创建一个 test.txt 文件:

    Docker 创建镜像

    命令如下:

    docker run -it docker.io/ubuntu:latest /bin/bash
    root@a0a0c8cfec3a:/# touch test.txt
    root@a0a0c8cfec3a:/# exit
    

    创建完 test.txt 文件后,需要记住标注的容器 ID: a0a0c8cfec3a, 用它来提交一个新的镜像(PS: 你也可以通过名称来提交镜像,这里只演示通过 ID 的方式)。

    执行命令:

    docker container commit -m "Added test.txt file" -a "Allen" a0a0c8cfec3a test:0.1
    

    提交成功后,会返回新创建的镜像 ID 信息,如下图所示:

    Docker 提交新创建的镜像

    再次查看本地镜像信息,可以看到新创建的 test:0.1 镜像了:

    Docker 查看镜像信息

    2.2 基于 Dockerfile 创建

    通过 Dockerfile 的方式来创建镜像,是最常见的一种方式了,也是比较推荐的方式。Dockerfile 是一个文本指令文件,它描述了是如何基于一个父镜像,来创建一个新镜像的过程。

    下面让我们来编写一个简单的 Dockerfile 文件,它描述了基于 Ubuntu 父镜像,安装 Python3 环境的镜像:

    FROM docker.io/ubuntu:latest
    
    LABEL version="1.0" maintainer="Allen <weiwosuo@github>"
    
    RUN apt-get update && 
        apt-get install -y python3 && 
        apt-get clean && 
        rm -rf /var/lib/apt/lists/*
    

    创建完成后,通过这个 Dockerfile 文件,来构建新的镜像,执行命令:

    docker image build -t python:3 .
    

    注意:命令的最后有个点,如果不加的话,会构建不成功 !

    Docker 通过 Dockerfile 构建镜像

    编译成功后,再次查看本地镜像信息,就可以看到新构建的 python:3 镜像了。

    Docker 查看镜像信息

    三、Docker 导出&加载镜像

    此小节中,您将学习 Docker 如何导出&加载镜像。

    通常我们会有下面这种需求,需要将镜像分享给别人,这个时候,我们可以将镜像导出成 tar 包,别人直接通过加载这个 tar 包,快速地将镜像引入到本地镜像库。

    要想使用这两个功能,主要是通过如下两个命令:

    1. docker save
    2. docker load

    3.1 导出镜像

    查看本地镜像如下:

    Docker 查看镜像信息

    例如,我们想要将 python:3 镜像导出来,执行命令:

    docker save -o python_3.tar python:3
    

    执行成功后,查看当前目录:

    Docker 导出文件

    可以看到 python_3.tar 镜像文件已经生成。接下来,你可以将它通过复制的方式,分享给别人了!

    3.2 加载镜像

    别人拿到了这个 tar 包后,要如何导入到本地的镜像库呢?

    通过执行如下命令:

    docker load -i python_3.tar
    

    或者:

    docker load < python_3.tar
    

    导入成功后,查看本地镜像信息,你就可以获得别人分享的镜像了!怎么样,是不是很方便呢!

    四、Docker 上传镜像

    我们将以上传到 Docker Hub 上为示例,演示 Docker 如何上传镜像。

    4.1 获取 Docker ID

    想要上传镜像到 Docker Hub 上,首先,我们需要注册 Docker Hub 账号。打开 Docker Hub 网址 https://hub.docker.com,开始注册:

    Docker Hub 注册账号

    填写您的 Docker ID (也就是账号),以及密码,Email, 点击继续。

    接下来,Docker Hub 会发送验证邮件,到您填写的邮箱当中:

    Docker Hub 验证邮件

    点击验证即可,接下来,再次返回 Docker Hub 官网,用您刚刚注册的 Docker ID 和密码来登录账号!

    Docker Hub 登录页面

    4.2 创建镜像仓库

    登录成功后,会出现如下页面:

    欢迎来到 Docker Hub

    选择创建一个镜像仓库:

    创建 Python 仓库

    填写仓库名称描述信息是否公开后,点击创建。

    仓库镜像展示页

    我们看到,仓库已经创建成功了,但是里面还没有任何镜像,接下来开始上传镜像,到此新创建的仓库中。

    4.3 上传镜像

    进入命令行,用我们刚刚获取的 Docker ID 以及密码登录,执行命令:

    docker login
    

    命令行登录 Docker ID

    登录成功后,我们开始准备上传本地的 python:3 镜像:

    python:3 镜像

    首先,我们对其打一个新的标签,前缀与我们新创建的 Docker ID 、仓库名保持一致:

    docker tag python:3 weiwosuoai1991/python:3
    

    python:3 镜像打标签

    查看本地信息,可以看到,标签打成功了。接下开,开始上传!执行命令:

    docker push weiwosuoai1991/python:3
    

    上传 python:3 镜像

    上传成功!去 Docker Hub 官网,新创建的仓库的信息页面验证一下,是否真的成功了:

    仓库镜像展示页

    大工告成!!!

    五、总结

    本文中,我们着重学习了 Docker 中如何删除镜像, 创建镜像,导出&加载镜像,以及向 Docker Hub 上传镜像。本文是 Docker 镜像学习的下篇,后续会带来更多 Docker 相关的学习文章,祝您学习愉快!

    六、赠送 | 面试&学习福利资源

    最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

    获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接,下面是目录以及部分截图:

    福利资源截图

    福利资源截图

    福利资源截图

    福利资源截图

    福利资源截图

    福利资源截图

    福利资源截图

    重要的事情说两遍,获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接 !!!

  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/quanxiaoha/p/10632039.html
Copyright © 2011-2022 走看看