Docker学习笔记(2)-docker镜像操作
本节将会涉及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镜像操作的更多相关文章
- docker学习笔记3:镜像操作(查找和下载)
一.查看本地镜像 只有下载后,镜像才会保存在本地(docker环境所在的主机),通过如下命令可以查看本地已经存在的镜像. 命令:dokcer images 上面命令列出本地所有已经存在的镜像,显示的信 ...
- Docker学习笔记之从镜像仓库获得镜像
0x00 概述 之前我们说到了,Docker 与其他虚拟化软件的一处不同就是将镜像管理纳入到了功能之中.实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了我们在移植过程中的繁琐操作. ...
- Docker学习笔记2: Docker 概述
一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" , ...
- DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战
前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...
- DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结
前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...
- Docker学习笔记(1) — docker 常用命令
1. docker version显示 Docker 版本信息.2. docker info显示 Docker 系统信息,包括镜像和容器数.3. docker searchdocker search ...
- Docker学习笔记之docker volume 容器卷的那些事(一)
预览目录 volume 方式 相关用例 使用方式 使用 volume driver bind mount 方式 相关用例 使用方式 配置selinux标签 配置macOS的安装一致性 tmpfs 方式 ...
- Docker学习笔记之Docker应用于服务化开发
0x00 概述 上一节里我们谈到了小型的独立项目如何使用 Docker Compose 来搭建程序的运行环境,对于由多人或多部门参与的中大型服务化架构的项目,仅由一个 Docker Compose 项 ...
- Docker学习笔记之Docker的数据管理和存储
0x00 概述 数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重.特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能.我们知道,在 Doc ...
随机推荐
- javascript javascript加载类似星座、血型的函数
javascript加载类似星座.血型的函数 //加载血型 function bloodtypelaod(constellation) { var obj = document.getElement ...
- 正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》
前面几个章节简述了 C#中得常用得算术运算符.这一章节说布尔值与其布尔运算符. 布尔值在c#中表示方式是 bool类型,这个类型可以储存两个值,true或者false,或者真或者假,可以说0或者1. ...
- Shell-2-命令之乐
1.cat (1)基本用法 [root@cai tmp]# cat 1.txt 2.txt this is a test1 this is a test 2 (2)cat -s file(删除额外空白 ...
- web安全-密码安全
web安全-密码安全 1.密码的作用 2.储存 3.传输 4.替代方案 5.生物特征密码 (指纹 人脸) 6.密码单向变换彩虹表 组合 密码变换次数越多越安全 加密成本几乎不变(生成密码速度慢一点) ...
- ipad中icon与launchimage的size
图标(AppIcon)与启动图(LaunchImage)是开发iOS应用程序必不可少的内容,但是在网络上对于这部分的内容讲解的并不详细,所以花些时间写了这篇文章,希望有需要的朋友可以随时查看 想知道A ...
- sql遍历查询结果sql循环查询结果集sql循环查询
--查询表B,把查询到的数据插入临时表#A中,根据表B 的ID 进行排序:表#A中 的 i 字段 由1开始增加排序: SELECT ROW_NUMBER() OVER ( ORDER ...
- Git 的简单测试
Git 简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开 ...
- ajax加载菊花loading效果
Ajax异步请求的时候,一般都会利用一个动态的gif小图片来制作一个Ajax Loading,以便增加用户体验. 这里我们可以使用Spin.js,该js脚本压缩后5k,可以不用任何图片,任何外部CSS ...
- hdu3746 KMP-next数组的应用
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- restframework CBV试图的4种方式
day100 上节回顾 1 APIView流程 2 序列化组件(restframework) 1 # 自定义序列化组件 class BookSerializers(serializers.Serial ...