Docker学习(二): 镜像的使用与构建
特别声明:
博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!
=============系列文章=============
3. Docker学习(三): Dockerfile指令介绍
=================================
获取镜像
获取镜像命令: 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学习(二): 镜像的使用与构建的更多相关文章
- Docker学习笔记(2):使用Dockerfile构建镜像
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本.每条指令都必须为大写字母且后面要跟随至少一个参数,每条指令都会创建一个新的镜像层,并对镜像进行提交. Docker ...
- 4.docker学习之镜像
镜像 我们知道,我们想在Windows操作系统上跑Linux,需要安装一个虚拟机程序,然后下载一个Linux镜像,在该虚拟机程序中创建一个虚拟机,并使用该镜像安装对应的Linux操作系统,安装好之后, ...
- Docker 学习之镜像导入导出及推送阿里云服务器(三)
在前面两节里主要就是记录一些docker的基本的操作,包括搜索镜像,拉取镜像,根据镜像创建容器等等,在这一节主要就是记录Docker对于镜像文件的导入导出,及推送到阿里云再从阿里云获取镜像. 一.镜像 ...
- docker学习二
B站视频地址 3.docker的基本操作 3.1 安装docker 1.下载关于Docker的依赖环境 想安装Docker,需要先将依赖的环境全部下载下来,就像Maven依赖JDK一样 yum -y ...
- 【docker学习二】CentOS7.5+Docker 镜像(容器)的使用
承接上篇:https://mp.csdn.net/postedit/82744127 上文介绍了容器与镜像的基本操作,这里总结下容器的使用. 先在官网找到一个镜像: https://hub.docke ...
- Docker学习以及镜像制作流程
一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- docker学习(二)
1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...
- Docker学习之镜像操作
使用Docker镜像 以下都是Docker镜像的一系列重要名操作,包括获取.查看.搜索.删除.创建.存出或载入.上传等.可使用docker image help命令查看帮助. 1.获取镜像(pull) ...
- Docker学习笔记总结
Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/ 一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...
随机推荐
- Gogland配置- 去掉Go源代码中的参数提示
Gogland处于好意,在Go源代码中对每个参数提示类型,这或许方便大家处理源代码,但是我觉得对于正常阅读源代码反而造成一种负担,我决定去掉这个功能! Gogland默认配置状态,有参数提示: 下面是 ...
- HTTP 缓存机制详解
从这里看的 http://mp.weixin.qq.com/s/8UXEMQBkV9hHwtu9R7mV5w
- WinForm程序运行 Just-In-Time Exception发生时
debug时运行正常, 但exe程序却发生Just-In-Time Exception (具体是做了异步里面更新画面内容) 解决对策: [app.config]文件: jitDebugging设为tu ...
- dbporxy-mysql 协议流转图
dbproxy 支持 in 查询, 当in 中的字段 属于不同的分表时, QPS约为 5000左右, 如果为 等值查询, qps的30000左右 主要原因是 对于in操作,会产生多个不同分表的sql ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- ASP.NET MVC 下拉列表实现
https://blog.csdn.net/Ryan_laojiang/article/details/75349555?locationNum=10&fps=1 前言 我们今天开始好好讲讲关 ...
- OAuth2.0认证和授权以及单点登录
https://www.cnblogs.com/shizhiyi/p/7754721.html OAuth2.0认证和授权机制讲解 2017-10-30 15:33 by shizhiyi, 2273 ...
- 造一个轮子然后安装到pypi上
之前写了一个爬虫的包,主要是根据自己写爬虫的情况总结一下. 因为每次都要重复写一些代码,所以提炼出来,类似一个框架的样子吧. 开始是放在自己的项目里引用,但如果换了一个项目,就得重新拷一遍,很麻烦. ...
- 开源:我的Android新闻客户端,速度快、体积小、支持离线阅读、操作简便、内容展现形式丰富多样、信息量大、功能全面 等(要代码的留下邮箱)
分享:我的Android新闻客户端,速度快.体积小.支持离线阅读.操作简便.内容展现形式丰富多样.信息量大.功能全面 等(要代码的留下邮箱) 历时30天我为了开发这个新闻客户端APP,以下简称觅闻 h ...
- (转)分布式中使用Redis实现Session共享(一)
上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...