特别声明:

  博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!

=============系列文章=============

1. Docker学习(一): 基本概念

2. Docker学习(二): 镜像的使用与构建

3. Docker学习(三): Dockerfile指令介绍

4. Docker学习(四): 操作容器

=================================

获取镜像

  获取镜像命令: docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

    Docker Registry地址:格式一般是<域名/IP>[:端口号], 默认是Docker Hub

    仓库名:<用户名>/<软件名>,Docker Hub默认用户名为library

    例:docker pull ubuntu:14.04,从Docker Hub获取镜像,即library/ubuntu:14.04

  运行镜像命令:docker run [选项] <仓库名:标签 或 镜像ID> [COMMAND]

    例:docker run -it --rm ubuntu:14.04 bash

      -it:-i 交互式操作,-t 终端,即交互式终端。

      --rm:容器退出后随之将其删除,避免空间浪费;一般情况需要docker rm手动删除容器

      bash:命令,bash为获取交互式Shell

    exit:退出容器,返回宿主机

  列出镜像命令:docker images

    需要注意docker images列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于Docker镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于Docker使用Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小很多。

    虚悬镜像:对于既没有仓库名,也没有标签,均为<none>的镜像称为虚悬镜像(dangling image),产生的原因的是同仓库名和标签的镜像由于镜像更新被转移到了新的镜像身上。

    显示虚悬镜像命令:docker images -f dangling=true

    删除虚悬镜像命令:docker rmi $(docker images -f dangling=true)

    显示中间层镜像命令:docker images -a

    列出部分镜像命令:

      a. 根据仓库名:docker images ubuntu

      b. 过滤器参数:docker images -f since=mongo:3.2 (列出mongo:3.2之后建立的镜像)

      c. 过滤器-label: docker images -f label=com.example.version=0.1

    列出特定格式的镜像:

      只列出镜像的ID:docker images -q

      Go的模板语法:docker images --format "{{.ID}}: {{.Repository}}"

构建镜像

  一、commit(将容器的存储层保存下来成为镜像,原有镜像基础上加上存储层)

    命令:docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

      例:docker commit --author "konrad" --message "update msg" webserver nginx:v2

    查看提交历史命令:docker history <仓库名>[:<标签>]

  注:慎用!!!!会有大量无关内容被添加进来,会导致镜像臃肿。生成的镜像是黑箱镜像,别人不知道具体里面做了什么。

  二、Dockerfile

    镜像构建透明的,Dockerfile本身就是一个文本文件,内包含了一条条的指令;每条指令构建一层,因此每一条指令的内容,就是描述该层应该如何构建。

Dockerfile实例:  

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

  FROM:指定哪个镜像为基础,在其上进行定制。必须是第一条指令

  RUN:用来执行命令行命令的

    shell格式:RUN <命令> ,就像直接在命令行中输入的命令一样

    exec格式:RUN ["可执行文件", "参数1", "参数2"],像函数调用中的格式

  注:虽然RUN像Shell脚本一样可以执行命令,但是每条命令就是一层镜像,把每个命令都对应RUN会构建出很多层镜像,镜像会包括一些没有用的东西。Union FS是有最大层数限制的,比如AUFS,最大不得超过层。所以正确的写法如下:

FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/r
edis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
s=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps

  使用&&将各个所需命令串联起来,仅使用一个RUN命令,所以只构建了1层。行尾\表示换行,这里在最后还进行了清理工作,清理了下载、展开的文件等。

  

  构建镜像

    一、docker build [选项] <上下文路径/URL/->

      -t:执行镜像的名称<名称>:<标签>

    上下文路径:.并非表示Dockerfile文件所在的当前路径,而是指上下文路径。因为docker build命令构建镜像,并非在本地构建,而是在服务端,也就是Docker引擎中构建的。用户指定构建的上下文的路径,docker build命令得知这个路径后,会将路径下的所有内容打包,然后上传给Docker引擎。

    二、从rootfs压缩包导入

      命令:docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]

      压缩包可以是本地文件、远程web文件,甚至标准输入中得到。压缩包将会在镜像/目录展开,并直接作为第一次提交。

    三、docker save 和 docker load

      docker save:将镜像保存为归档文件

        示例:docker save alpine | gzip > alpine-latest.tar.gz

      docker load:加载镜像

        示例:docker load -i alpine-latest.tar.gz

      从一个机器将镜像迁移到另一个机器

        docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> ‘cat | docker laod’

管理本地镜像

  删除本地镜像:docker rmi [选项] <镜像1> [<镜像2> ...]

    <镜像>:可以是镜像短ID(一般取前3位)、镜像长ID、镜像名或者镜像摘要

    Untagged:表示取消镜像的标签

    Deleted:真正的删除镜像动作

  也可配合docker images命令来删除指定的镜像

镜像实现基本原理 

  Union FS用途:一方面可以实现不借助LVM、RAID将多个disk挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD正式基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些些操作。Docker在AUFS上构建的容器也是利用了类似的原理。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考:《docker_practice》

Docker学习(二): 镜像的使用与构建的更多相关文章

  1. Docker学习笔记(2):使用Dockerfile构建镜像

    Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本.每条指令都必须为大写字母且后面要跟随至少一个参数,每条指令都会创建一个新的镜像层,并对镜像进行提交. Docker ...

  2. 4.docker学习之镜像

    镜像 我们知道,我们想在Windows操作系统上跑Linux,需要安装一个虚拟机程序,然后下载一个Linux镜像,在该虚拟机程序中创建一个虚拟机,并使用该镜像安装对应的Linux操作系统,安装好之后, ...

  3. Docker 学习之镜像导入导出及推送阿里云服务器(三)

    在前面两节里主要就是记录一些docker的基本的操作,包括搜索镜像,拉取镜像,根据镜像创建容器等等,在这一节主要就是记录Docker对于镜像文件的导入导出,及推送到阿里云再从阿里云获取镜像. 一.镜像 ...

  4. docker学习二

    B站视频地址 3.docker的基本操作 3.1 安装docker 1.下载关于Docker的依赖环境 想安装Docker,需要先将依赖的环境全部下载下来,就像Maven依赖JDK一样 yum -y ...

  5. 【docker学习二】CentOS7.5+Docker 镜像(容器)的使用

    承接上篇:https://mp.csdn.net/postedit/82744127 上文介绍了容器与镜像的基本操作,这里总结下容器的使用. 先在官网找到一个镜像: https://hub.docke ...

  6. Docker学习以及镜像制作流程

    一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  7. docker学习(二)

    1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...

  8. Docker学习之镜像操作

    使用Docker镜像 以下都是Docker镜像的一系列重要名操作,包括获取.查看.搜索.删除.创建.存出或载入.上传等.可使用docker image help命令查看帮助. 1.获取镜像(pull) ...

  9. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

随机推荐

  1. java—在dbutils中处理事务与不确定条件的查询(46)

    在dbutils中处理事务        事务是指用户的一次操作.这一次操作有可能是一个表,也有可能是多个表,也有可能是对一个表的多次操作. 只要是: 1:对数据数据库进行多次操作. 2:多个表,还是 ...

  2. 深入了解java虚拟机(JVM) 第十三章 虚拟机字节码执行引擎

    一.概述 执行引擎是java虚拟机最核心的组成部件之一.虚拟机的执行引擎由自己实现,所以可以自行定制指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式.所有的Java虚拟机的执行 ...

  3. 深入了解java虚拟机(JVM) 第九章 class文件结构及意义

    Class文件是访问jvm的重要指令,学习了class文件能够更加深入的了解jvm的工作过程.本文只进行概况总结,要进行更加详细的学习class文件,可以参考:https://blog.csdn.ne ...

  4. enumerate 和 dict.items()

    对 list 遍历 a_list = [1,2,3] for index,iterm in enumerate(a_list): print(index,iterm) 对 dict 遍历 dict = ...

  5. httpclient post请求例子(无参数名与带参数名的例子),多线程并发处理

    版本:4.1 带参数名的情况 HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url ...

  6. 代码 | 自适应大邻域搜索系列之(3) - Destroy和Repair方法代码实现解析

    前言 上一篇文章中我们具体解剖了ALNS类的具体代码实现过程,不过也留下了很多大坑.接下来的文章基本都是"填坑"了,把各个模块一一展现解析给大家.不过碍于文章篇幅等原因呢,也不会每 ...

  7. Mysql备份之Innobakcupex&Xtrabackup

                       一.innobackupex备份工具 基本选项 --compress:该选项表示压缩innodb数据文件的备份. --compress-threads:该选项表示 ...

  8. Linux文件索引节点相关概念

    一.  概念 1.  inode(index node)表中包含文件系统所有文件列表 一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括: 文件类型,权限,UID,GID 链接 ...

  9. C++ class和struct的区别

    class和struct定义类唯一的区别就是默认的访问权限. 如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的:相反,如果我们使用class关键字,组这些成员是pri ...

  10. CODEVS-新斯诺克

    原题地址:新斯诺克 题目描述 Description 斯诺克又称英式台球,是一种流行的台球运动.在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分别为1 个白球,15 个红球和6 个彩球(黄 ...