本节将会涉及Docker的镜像操作。

1. 获取镜像

如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签],具体可通过docker pull --help命令查看。

Docker镜像仓库地址的格式一般为<域名/IP>[:端口号],仓库名一般为两段式名称,即<用户名>/<软件名>,对于Docker Hub,默认的用户名为library。

例:获取ubuntu:16.04镜像,其中可看到默认用户library,16.04位镜像标签。

$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
8f7c85c2269a: Pull complete
9e72e494a6dd: Pull complete
3009ec50c887: Pull complete
9d5ffccbec91: Pull complete
e872a2642ce1: Pull complete
Digest: sha256:d3fdf5b1f8e8a155c17d5786280af1f5a04c10e95145a515279cf17abdf0191f
Status: Downloaded newer image for ubuntu:16.04

从下载过程中可看到docker的分层存储概念。下载会进行分层下载,下载过程中给出每一层ID的前12位,下载结束后,给出完整的sha256摘要,确保下载一致性。

2. 运行镜像

基于镜像,可以启动并运行一个容器。格式为:docker run [选项] 镜像名 [CMD]。

例:运行ubuntu:16.04 镜像。

$ docker run -it --rm ubuntu:16.04 bash
root@b5744a2879f8:/#

运行后,可以看到已进入到容器内部,且以root用户进入。

查看容器中的系统信息:

root@e59690e24ff2:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

命令中的-it选项:-i表示交互式操作,-t表示终端,因为打算进入bash执行一些命令,并查看返回结果,因此需要交互式终端;

--rm选项:该选项表示容器退出后随之将容器删除。默认情况下,退出容器不会立即删除,需要手工docker rm。这里只是演示执行命令,不需要排障和保留结果,因此使用该参数,避免空间浪费。

bash命令:放在镜像名(ubuntu: 16.04)后面的是命令,bash命令可以提供交互式shell。

进入容器后,该容器即为ubuntu系统,可以执行ubuntu相关的任何命令。

退出容器,使用exit命令即可。

3. 列出镜像

想要列出已存在的镜像,可使用docker image ls命令。列表会提供仓库名、标签、镜像ID、创建时间、占用空间。

$ docker image ls | grep -v 192.168 | grep -v gcr | grep -v none | grep -v content | grep -v down | grep -v media | grep -v wal
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2a4cca5ac898 days ago 111MB
jupyterhub/jupyterhub latest c5dc992337c7 days ago 670MB
nginx v3 fbe2b1559cb0 days ago 108MB
nginx v2 3e652016d731 days ago 108MB
nging v2 3d79377a847b days ago 108MB
quay.io/coreos/etcd latest 94bc3af972c9 days ago .2MB
busybox latest 807fd4df40d1 days ago .14MB
apollo-configservice latest 277dd2dccb3c days ago 191MB
apollo-adminservice latest 84a3ec4dfcb5 days ago 185MB
apollo-portal latest 40cfb14be3f0 days ago 164MB
jupyter/minimal-notebook latest 3130da5c9146 weeks ago .73GB
docker-start-web latest b92c92688046 weeks ago 113MB
test latest b92c92688046 weeks ago 113MB
friendlyhello latest bf1ed1612b69 weeks ago 148MB
nginx latest 3f8a4339aadd weeks ago 108MB
ifrs latest 01c81b407ffb weeks ago 476MB
cloudnativelabs/kube-router latest 79413998ed60 weeks ago .4MB
ubuntu 14.04 67759a80360c weeks ago 221MB
jenkins latest 5fc84ab0b7ad weeks ago 809MB
jetty latest 2938aa22262c weeks ago 547MB
python 2.7-slim 4fd30fc83117 weeks ago 138MB
rethinkdb latest 98ac1e7f55fd weeks ago 182MB
mysql 5.7 7d83a47ab2d2 weeks ago 408MB
mysql latest 7d83a47ab2d2 weeks ago 408MB
portainer/portainer latest f71b185552bf weeks ago .2MB
openjdk -jre-alpine a7441b26c41b weeks ago .9MB
registry 177391bcf802 weeks ago .3MB
registry latest 177391bcf802 weeks ago .3MB
alpine latest e21c333399e0 weeks ago .14MB
hello-world latest f2a91732366c months ago .85kB
quay.io/coreos/flannel v0.9.1-amd64 2b736d06ca4c months ago .3MB
swarm latest 59c0df55980b months ago .8MB
busybox latest 6ad733544a63 months ago .13MB
centos centos7.4.1708 3afd47092a0e months ago 197MB
nobodyiam/apollo-quick-start latest 6b3290a6a9cc months ago 144MB
dockersamples/visualizer stable 8dbf7c60cf88 months ago 148MB
shipyard/shipyard latest 36fb3dc0907d months ago .8MB
shipyard/docker-proxy latest cfee14e5d6f2 years ago .46MB
microbox/etcd latest 6aef84b9ec5a years ago .9MB

注意:一个镜像可以对应多个标签,因此可以看到mysql的镜像ID为7d83a47ab2d2,而对应两个标签,分别为latest和5.7。

4. 镜像体积

Docker Hub中的镜像与下载下来的镜像大小可能不同,因为Docker Hub上显示的是压缩后的大小,而下载过程中会进行解压,因此下载后的镜像尺寸更大一些。

docker image ls中列出的镜像体积总和并非是所有镜像实际硬盘消耗,由于分层存储结构,不同镜像可能会使用相同基础镜像,因此实际占用磁盘大小比列表显示总和要小很多。

可以通过docker system df 查看镜像、容器、数据卷所占用空间。

$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images .92GB .966GB (%)
Containers .7MB 0B (%)
Local Volumes .19GB .7MB (%)
Build Cache

5. 虚悬镜像

有一种特殊镜像,仓库名与标签均为<none>。该镜像原本是存在镜像名和标签,随着发布新版本后,该镜像名被转移到新下载的镜像上,就镜像上的镜像名及标签则被取消,从而成为了<none>。

镜像拉取命令docker pull与镜像构建命令docker build均可能导致这种现象。这种镜像也被成为虚悬镜像(dangling image)。

可以使用docker image ls -f dangling=true专门显示虚悬镜像。

$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> b12c7031cf96 days ago 177MB
<none> <none> b170d97325c2 days ago 686MB
<none> <none> 4fec837318a2 days ago 231MB
<none> <none> a4b3b3e053aa days ago 177MB
<none> <none> 7e1c59663166 weeks ago 191MB

6. 中间层镜像

为了加速镜像构建,重复利用资源,docker会利用中间层镜像。默认docker image ls列表只会显示顶层镜像,增加 -a 参数即可显示包括中间层镜像在内的所有镜像。

$ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
allinone-service latest e9a3879ed76f hours ago 177MB
<none> <none> ba0c65b39c64 hours ago 177MB
<none> <none> 423675da3624 hours ago 177MB
<none> <none> 935dd95fcf8c hours ago 132MB

7. 列出部分镜像

(1) 根据仓库名列出镜像:docker image ls image_name

$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2a4cca5ac898 days ago 111MB
ubuntu 14.04 67759a80360c weeks ago 221MB

(2) 基于仓库名+标签列出镜像: docker image ls image_name:tag

$ docker image ls ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2a4cca5ac898 days ago 111MB

(3) docker image ls 之前 --filter过滤器参数。

如:列出mysql:latest之前(before)/后(since)构建的镜像。

$ docker image ls -f since=mysql:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
allinone-service latest e9a3879ed76f hours ago 177MB
download_worker_test latest b5a2e88c7a66 hours ago 855MB

(4) 如果构建镜像时,定义了LABEL,也可以通过LABEL进行过滤,如: docker image ls -f label=con.example.version=0.1

(5) 以特定格式显示

例:

以镜像id进行显示:docker image ls -q ,--filter与-q结合产生指定范围的ID列表,然后作为参数传入另一个docker命令,进而可以成批进行某种操作,这种做法在Dockjer中十分常见。

(6) 有时对表格的结构不满意,希望自己组织列,可以使用Go的模板语法。

例:

a. 列出只包含镜像ID和仓库名:docker image ls --format "{{.ID}}: {{.Repository}}"

b. 以表格等距显示,并且有标题行,自己定义显示列:docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

8. 使用commit理解镜像构建

注意:不要使用commit定制镜像,定制镜像应该使用Dockerfile完成,Dockerfile会在下一节详解。

和镜像一样,容器也是多层存储。容器以镜像为基础层,在其上加一层作为容器运行的存储层。

例:

定制一个Web服务器,理解镜像如何构建:

(1) 使用nginx镜像启动容器,命名为webserver,并映射80端口。命令为:docker run --name webserver -d -p 80:80 nginx。使用浏览器,输入: localhost,即可出现nginx显示界面。如下图所示:

(2) 我们希望将该页面信息改为Docker文字,可以使用docker exec命令进入容器,修改器内容。如下命令所示:

$ docker exec -it webserver bash
root@9b59f2338c3a:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@9b59f2338c3a:/# exit
exit

显示信息如下:

(3) 修改了容器的文件,可以通过docker diff命令查看具体改动。

$ docker diff webserver
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html

(4) 现在定制好了,希望能将其保存下来形成镜像。

当运行容器时,且不使用卷时,任何文件修改都会被记录于容器存储层。可以使用docker commit命令将容器的存储层保存下来形成镜像。即在原有镜像基础上,再叠加容器的存储层,并构成新的镜像,以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit的格式为:docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

可以使用命令将容器保存为镜像:docker commit --author "ws<ws@qq.com>" --message "修改默认网页" webserver nginx:v2

其中: author指定修改作者,--message记录本次修改内容。可以使用docker image ls显示新的定制镜像,使用docker history具体查看镜像内的历史记录,如:docker history nginx:v2

(5) 镜像定制好后,可以重新运行该镜像:docker run --name web2 -d -p 81:80 nginx:v2

注意:慎用docker commit

因为docker commit会将大量无关的修改内容、构建内容添加进来,如果不小心清理,将会导致镜像极为臃肿,其次docker commit意味着所有对镜像的操作都是黑箱操作,生成的镜像也称为黑箱镜像,随着时间的延长,会无法清楚地记得所修改操作,即使docker diff也只会提供少许。

Docker学习笔记(2)-docker镜像操作的更多相关文章

  1. docker学习笔记3:镜像操作(查找和下载)

    一.查看本地镜像 只有下载后,镜像才会保存在本地(docker环境所在的主机),通过如下命令可以查看本地已经存在的镜像. 命令:dokcer images 上面命令列出本地所有已经存在的镜像,显示的信 ...

  2. Docker学习笔记之从镜像仓库获得镜像

    0x00 概述 之前我们说到了,Docker 与其他虚拟化软件的一处不同就是将镜像管理纳入到了功能之中.实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了我们在移植过程中的繁琐操作. ...

  3. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  4. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  5. DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  6. Docker学习笔记(1) — docker 常用命令

    1. docker version显示 Docker 版本信息.2. docker info显示 Docker 系统信息,包括镜像和容器数.3. docker searchdocker search ...

  7. Docker学习笔记之docker volume 容器卷的那些事(一)

    预览目录 volume 方式 相关用例 使用方式 使用 volume driver bind mount 方式 相关用例 使用方式 配置selinux标签 配置macOS的安装一致性 tmpfs 方式 ...

  8. Docker学习笔记之Docker应用于服务化开发

    0x00 概述 上一节里我们谈到了小型的独立项目如何使用 Docker Compose 来搭建程序的运行环境,对于由多人或多部门参与的中大型服务化架构的项目,仅由一个 Docker Compose 项 ...

  9. Docker学习笔记之Docker的数据管理和存储

    0x00 概述 数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重.特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能.我们知道,在 Doc ...

随机推荐

  1. 关于AJAX异步加载节点无法触发点击事件问题的解决方式

    做练习的过程中遇到一个问题,使用AJAX异步新增一个节点,无法触发点击事件,经过查阅之后知道一个方式,使用JS的委托事件,在此做一个记录. $(document).on('click', '.recr ...

  2. metasploit 读书笔记-EXPLOITATION

    一、渗透攻击基础 1.常用命令 show exploits 显示Meta框架中所有可用的渗透攻击模块。 show options 显示模块所需要的各种参数 back 返回Meta的上一个状态 sear ...

  3. win10下安装配置mysql-8.0.13--实战可用

    1.下载mysql-8.0.13安装包 1 https://dev.mysql.com/downloads/mysql/ 选择zip安装包下载就好. 2.解压到你要安装的目录 3.创建my.ini配置 ...

  4. [C++11]shared_ptr循环引用导致内存泄露

    1 /* 2 * shared_ptr循环引用导致内存泄露 3 */ 4 5 struct A 6 { 7 shared_ptr<A> ptr; // 改为weak_ptr<A> ...

  5. Swift 4.0 正式发布,更快更兼容更好用

    Swift4现已正式发布!Swift4在Swift3的基础上,提供了更强大的稳健性和稳定性,为Swift3提供源码兼容性,对标准库进行改进,并添加了归档和序列化等功能. 你可以通过观看WWDC2017 ...

  6. opencv第三课,图像滤波

    1.介绍 OpenCV图像处理技术中比较热门的图像滤波操作主要被分为了两大类:线性邻域滤波和非线性滤波.线性邻域滤波常见的有“方框滤波“,”均值滤波“和”高斯滤波“三种,二常见的非线性滤波主要是中值滤 ...

  7. opencv-Haar特征

    特征,判决,得到判决 1.什么是haar特征? 特征 = 某个区域的像素点经过某种四则运算之后得到的结果. 这个结果可以是一个具体的值也可以是一个向量,矩阵,多维.实际上就是矩阵运算 2.如何利用特征 ...

  8. react 的安装和案列Todolist

    react 的安装和案列Todolist 1.react的安装和环境的配置 首先检查有没有安装node.js和npm node -v npm -v 查看相关版本 2.安装脚手架工具 2.构建:crea ...

  9. MySQL 关联查询 内连接

    内连接    [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql>  select  *  ...

  10. C语言中的定义与声明

    什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的 ...