特别声明:

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

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

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. mysql--对行(表中数据)的增删改查

    一.插入数据(增加)insert 1.插入数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段来插入数据,插 ...

  2. Delphi XE7编译安卓程序出错了

    昨天编译一个先前可以正常运行的程序,忽然就不能编译了,总是提示这个错误,经过一番排查,终于搞定了,原因:删除了安卓lib引用的JAR和单元文件.如果你也出现这个问题,打开工程全部目录,看一下是否有打小 ...

  3. jquery优化轮播图2

    继续优化 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. CSS3-渐变这个属性2

    渐变 有了渐变再也不用去切1px的图再重复了.. -webkit- 是浏览器前缀, 表示特定浏览器对一个属性还在实验阶段, 在这里顺便写下各个浏览器的前缀: chrome/ safari     -w ...

  5. php扩展memcache和memcached区别?以及memcached软件的介绍

    引用“http://www.vicenteforever.com/2012/03/memcache-different-memcached/” memcached是一个软件,而PHP包括了memcac ...

  6. MongoDB 数据自动同步到 ElasticSearch

    我们产品中需要全文检索的功能,后端数据存储主要使用了 MySQL + MongoDB,而其中需要检索的内容是在 MongoDB 中的. MongoDB 本身是自带文本索引功能的,但是,不支持中文.术业 ...

  7. (转)Javascript模块化编程(三):Require.js的用法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  8. 总结day26 ----验证客户端的合法性,已经操作系统,进程的简单初识别

    前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个clie ...

  9. C语言数据结构之图的基本操作

    本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visual studio2017 纯C语言 ,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能. 下面的程序主要实现了 ...

  10. P4383 [八省联考2018]林克卡特树lct

    题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...