镜像

它是Docker的三大核心之一。

Docker运行容器前需要本地存在对应的镜像,如果本地没有存在对应的镜像,Docker将会尝试从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),当然,我们也可以通过配置,使用自定义的镜像仓库,如DaoCloud、阿里云镜像、网易蜂巢。

本节将介绍围绕镜像这一核心的具体操作:

【1】如何使用pull命令从Docker公有仓库中下载镜像到本地

【2】如何查看本地已有的镜像信息

【3】如何在远端仓库使用serach命令进行搜索和过滤

【4】如何删除镜像标签和镜像文件

【5】如何创建用户定制的镜像并且保存为外部文件

【6】如何向Docker Hub仓库推送自己的镜像

...... .......


1、搜索镜像

使用docker search命令搜索镜像,命令格式如下:

docker search <images>

例如:搜索一个CentOS系统的镜像

docker search centos

搜索结果如下:

字段信息说明:

NAME:镜像的仓库名字
DESCRIPTION:仓库的描述信息
STARS:评价,受欢迎的程度
OFFICIAL:是否是官方镜像
AUTOMATED:是否是自动构建的

查看帮助:man docker-search


2、获取镜像

镜像是Docker容器运行的前提

下载镜像命令:docker pull NAME[:TAG]

对于Docker镜像来说,如果不显式地指定TAG,则会默认选择latest标签,即下载仓库中最新版本的镜像。

如:下载centos镜像,实际上就是下载centos:latest镜像,即目前最新版本的镜像。

[root@master03 /]#
[root@master03 /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:b40cee82d6f98a785b6ae35748c958804621dc0f2194759a2b8911744457337d
Status: Downloaded newer image for centos:latest
[root@master03 /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]# 

下载过程,镜像文件是由若干层组成的,行首类似于f476d66f5408这样的数字表示各层的ID。下载过程中会获取并输出镜像的各层信息。

层layer实际上是AUFS(Advanced Union File System,一种联合文件系统)中的重要概念,是实际增量保存与更新的基础。

当然,我们可以通过制定标签来下载特定版本的某一镜像:

$ docker pull centos:7.2

最后使用镜像创建一个容器,并进入容器查看下版本

[root@master03 /]#
[root@master03 /]# docker run -it centos /bin/bash
[root@39327f2deca5 /]# cat /etc/re
redhat-release  resolv.conf
[root@39327f2deca5 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@39327f2deca5 /]# exit
exit
[root@master03 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@master03 /]# 

3、查看镜像

查看docker镜像:

docker images

字段信息说明:

REPOSITORY:仓库,当前镜像来自于哪个仓库
TAG:镜像标签信息,版本
IMAGE ID:镜像ID,具有唯一性
CREATED:镜像创建的时间
SIZE:镜像大小

4、删除镜像

当一个镜像有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件。但当该镜像只剩下一个标签的时候,此时删除该标签的时候会彻底删除该镜像。使用docker rmi 镜像ID号命令时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉指向该镜像的所有标签,然后删除镜像本身。

注意:运行中的Docker容器是无法删除的!这个时候镜像创建的容器存在,而且镜像文件是无法被删除的,所以应该先删除依赖该镜像的所有容器,再删除镜像。

必须通过docker stop或者docker kill命令停止容器,才能将其删除。否则将出现以下报错:

[root@master03 /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        13 days ago         64.2MB
centos              latest              9f38484d220f        4 months ago        202MB
[root@master03 /]#
[root@master03 /]# docker rmi 355625
Error response from daemon: conflict: unable to delete 3556258649b2 (must be forced) - image is being used by stopped container 08ea8b861134

可以看到,我们直接去删除一个docker镜像是不行的,这个镜像目前正在被某个容器使用。

删除docker镜像思路:

docker save保存容器
docker images
docker save REPOSITORY > XX.tar

【1】删除镜像容器:
docker ps -a:查看目前Docker镜像的详细信息,及容器ID
docker rm CONTAINER ID:删除Docker容器

我们可以发现ID为08ea8b861134的容器已经被删除掉了。这时,我们就可以进行下一步删除镜像操作了。

【2】删除镜像:
docker images:查看Docker镜像
docker rmi IMAGE ID:删除Docker镜像

可以看到,这一步操作后,我们已成功删除Docker镜像。

【3】多个镜像ID相同时,删除其中一个镜像

当我们复制出来多个镜像时,它们共用一个镜像ID,这个时候我们停止容器后,直接按镜像ID去删除镜像时,会把这个相同镜像ID的所有镜像删除,这种操作实际上是很危险的。

为了避免上边的问题,我们可以按镜像名称和TAG标签来删除指定镜像:

docker rmi [REPOSITORY:TAG]

上述操作将删除我们指定的镜像文件,可以看到已经删除成功。


5、创建镜像

创建镜像的方法有三种:【1】基于已有镜像的容器创建;【2】基于本地模板导入;【3】基于DockerFile创建;

这里我们重点介绍前两种方法,最后一种将在后面单独列一节内容详解。

【1】基于已有镜像的容器创建

主要使用docker commit命令,们在提交一个容器的时候就指定镜像的名称和tag标签。

格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要选项包括:

  • -a:--author=" "作者信息;
  • -m:--message=" "提交信息
  • -p:--pause=true提交时暂停容器运行

下面将使用该docker run命令。首先,启动一个镜像,并在其中进行修改操作:

[root@master03 /]# docker run -it ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
a7344f52cb74: Pull complete
515c9bb51536: Pull complete
e1eabe0537eb: Pull complete
4701f1215c13: Pull complete
Digest: sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90
Status: Downloaded newer image for ubuntu:14.04
root@05ae2239bb06:/# touch test
root@05ae2239bb06:/# exit
exit

容器ID为:05ae2239bb06

此时该容器跟源ubuntu:14.04镜像相比,已发生变化,使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:

[root@master03 /]# docker commit -m "Added a new file" -a "Docker Newbee" 05ae2239bb06 test
sha256:d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3
[root@master03 /]# 

返回了新创建的镜像的ID信息:

d71e541c77aede47d409e33facdb514d428bf8ae871daa98b56578702e2b9aa3

查看本地镜像列表,即可看到新创建的镜像信息:

【2】基于本地模板导入

可以直接从一个操作系统模板文件导入一个镜像。这里我们先使用docker export导出一个容器。

[root@master03 /]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS               NAMES
05ae2239bb06        ubuntu:14.04               "/bin/bash"              10 minutes ago      Up 2 seconds                                  zealous_elion
5517d6d70a09        microsoft/dotnet-samples   "dotnet dotnetapp.dl…"   45 hours ago        Exited (0) 45 hours ago                       romantic_goodall
39327f2deca5        centos                     "/bin/bash"              2 days ago          Exited (1) 44 hours ago                       gifted_elbakyan
[root@master03 /]#
[root@master03 /]# docker export 05ae2239bb06 >test_export.tar
[root@master03 /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test_export.tar  test_for_run.tar  test_for_stop.tar  tmp  usr  var
[root@master03 /]# 

然后,执行导入容器模板操作:

[root@master03 /]# cat test_export.tar | docker import - test/ubuntu:v1.0
sha256:9e06207a54143ade6761d07c7394bbbdad1bd8d66dd6b15373531852407ac578
[root@master03 /]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                v1.0                9e06207a5414        4 seconds ago       64.2MB
centos                     latest              9f38484d220f        4 months ago        202MB
microsoft/dotnet-samples   latest              70e25069fca7        5 months ago        181MB
[root@master03 /]# 

可以看到,新导入的镜像已经在本地存在了。


6、导出/载入、上传镜像

导出镜像也就是将镜像保存到本地文件,可以使用docker save命令,会保存该镜像的所有历史记录和元数据信息。

docker save [IMAGE ID] > [SAVE_FILE.tar]
或者
docker save [IMAGE ID] [SAVE_FILE.tar]

或者:
docker save -o 存储文件名 存储的镜像


导入镜像

#可以用docker load命令将导出的tar文件导入到镜像库中
docker load < NAME.tar
#导入后会发现,该镜像的所有历史记录和元数据信息,全部都在。

例如,将ubuntu-latest.tart文件导入到本地镜像仓库中


 设置镜像标签

本地存储的镜像越来越多,我们就需要制定一个专门的仓库来存放这些镜像文件,也就是镜像仓库。

我们可以使用docker tag命令,为镜像打上一个新的标签。

docker tag [IMAGE ID/NAME] [IMAGE ID/NAME:TAG]
docker tag 3556258649b2 ubuntu-targ-test:dev
docker tag 镜像ID,这里是 3556258649b2 ,用户名称、镜像源名(repository name)和新的标签名(tag)。

docker images命令可以看到,ID为3556258649b2的镜像多了一个标签dev。

然后用docker push命令上传镜像。

docker push [IMAGE TAG]
如:docker push test/ubuntu:v1.0

基于DockerFile创建镜像------【此处省略,后边我们在Dockerfile文件方式创建镜像时详解】

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用 Dockerfile 指令来创建一个新的镜像

构建镜像,我们使用docker build,从零开始创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含指令来告诉我们Docker如何构建我们的镜像。


愿你就像早晨八九点钟的太阳,活力十足,永远年轻。

Docker从理论到实践(四)------Dokcer镜像相关推荐

  1. DDD(Domain Driven Design) 领域驱动设计从理论到实践 四

    - 接上 SOA 架构 ​     面向服务架构(Service Oriented Architecture,SOA)对于不同的人来说意思不同.这里梳理一下SOA原则: 服务契约 : 通过契约文档,服 ...

  2. Docker基本概念与实践(四)-部署简单web项目(tomcat+war+mysql)

    Docker简单部署web项目(tomcat+war包+mysql) 先简单测试单独运行tomcat项目 #启用tomcat8镜像命名为webapp,将容器的8080端口映射到主机的8080端口 do ...

  3. WCF从理论到实践(5):Binding细解(转)

    WCF从理论到实践(5):Binding细解 本文的出发点: 通过阅读本文,您能了解以下知识: WCF中的Binding是什么? Binding的组成? Binding Element 的分类? Bi ...

  4. Gradle理论与实践一:Gradle入门

    文章目录 Gradle入门 1.配置Gradle环境 2.Gradle之Hello World 3.gradle 与gradlew的区别 4.Gradle命令介绍 5.Gradle 工作流程 Grad ...

  5. Webrtc从理论到实践七: 官方demo源码走读(peerconnection_server)

    系列文章目录 Webrtc从理论到实践一:初识 Webrtc从理论到实践二: 架构 Webrtc从理论到实践三: 角色 Webrtc从理论到实践四: 通信 Webrtc从理论到实践五: 编译webrt ...

  6. mysql主从docker_(学习到实践)四、docker搭建mysql主从实践

    前言 目前已完成:php7及扩展.redis5的Dockerfile测试版编写,稍许完善后同步上传到github,(记下这里memcached还没有剥离安装). 今天数据库,编程的一个重要原则是不要重 ...

  7. 视觉SLAM十四讲从理论到实践第二版源码调试笔记(理论基础1-6章)

    2019-2020-2学期机器人工程专业需要开设SLAM技术课程,使用教材为视觉SLAM十四讲从理论到实践第二版. 为方便学生学习课程知识,将Arduino.ROS1.ROS2和SLAM集成到课程定制 ...

  8. tensorflow 语义slam_研究《视觉SLAM十四讲从理论到实践第2版》PDF代码+《OpenCV+TensorFlow深度学习与计算机视觉实战》PDF代码笔记...

    我们知道随着人工神经网络和深度学习的发展,通过模拟视觉所构建的卷积神经网络模型在图像识别和分类上取得了非常好的效果,借助于深度学习技术的发展,使用人工智能去处理常规劳动,理解语音语义,帮助医学诊断和支 ...

  9. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    浅读<视觉SLAM十四讲:从理论到实践>--操作1--初识SLAM 下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/s ...

  10. C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析

    C++数据压缩与传输:从理论到实践的全景解析 一.数据压缩的策略与方法 (Strategies and Methods of Data Compression) 1.1 数据压缩的基本概念与原理 (B ...

最新文章

  1. Mysql无法选取非聚合列
  2. Python中的负索引是什么?
  3. 两阶段聚合(局部聚合+全局聚合)
  4. JAVA设计模式有意思的国外站点
  5. Animoca Brands 旗下子公司 GAMEE 将于 4 月 2 日启动公募
  6. C++面向对象编程笔记(一)
  7. 计算机系统-程序加载器
  8. 第一篇博客---JavaSE基础部分回顾总结01概述、基础语法
  9. python自动化办公演示视频-2020年最新Python自动化办公视频教程(2020/9/3)
  10. bzoj3545: [ONTAK2010]Peaks 主席树合并
  11. 壳的概念、LordPE的使用、C#读取PE文件初步
  12. python剪切文件到另外路径_python剪切文件
  13. PS魔棒工具提示不能完成请求,因为程序错误和不能完成请求,因为没有足够内存以及内存不能为read的处理
  14. 两步解决:PDF旋转后怎么保存?
  15. xp系统打开sql服务器不可用,xp系统安装sql2000个人版无反应
  16. java程序设计实验报告代写_代做CS实验报告、代写java c/c++ CS课程设计作业、代写程序作业...
  17. java上传加密_Java实现文件的加密与解密
  18. [微服务]API 路由管理--Gateway网关
  19. (学习笔记)JAVA开发需要掌握哪些技术?
  20. 《HelloGitHub》第 48 期

热门文章

  1. 对于相同Bean,在父应用上下文中定义的切面,在子应用上下文中会生效吗?
  2. string的replaceAll()
  3. MyBatis源码阅读(八) --- Executor执行器
  4. ThreadPoolExecutor源码学习(一) -核心属性及应用
  5. springboot整合shiro之实现记住我
  6. 基于Docker搭建Gitlab
  7. Performing User-Managed Database-18.4、Restoring Datafiles and Archived Redo Logs
  8. 非关系数据库-NoSQL探讨
  9. Windows Server 2008 R2的教程36篇!
  10. 从金钱社会向财富第三极的过渡方案