1. 镜像是什么
镜像是什么?
• 一个分层存储的文件
• 一个软件的环境
• 一个镜像可以创建N个容器
• 一种标准化的交付
• 一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。
# docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
53f3fd8007f7 5 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 5 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 5 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 5 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 5 days ago /bin/sh -c set -x && apt-get update && apt… 54.1MB
<missing> 5 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.15.12.0… 0B
<missing> 5 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.15.12… 0B
<missing> 5 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 5 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 5 days ago /bin/sh -c #(nop) ADD file:fcb9328ea4c115670… 55.3MB
Docker镜像默认存储在/var/lib/docker/<storage-driver>中。
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 地址:https://hub.docker.com/explore
配置镜像加速器:https://www.daocloud.io/mirror
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker的特点:
(1)易于扩展
(2)优化存储空间
2. 镜像与容器联系
image.png
如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时, 会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多 少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作 的,并不会修改镜像的源文件,这种方式提高磁盘利用率。 若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像,但不建议这么做。
查看一个容器的可写层:
# docker inspect 916b2fd08347
....
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/2279e938e1b301c6152ce6fb22b113c504b6c3da4da4ee786edb4a118bc7ba4d-init/diff:/var/lib/docker/overlay2/30f80d2a5d401521615037313ff41c8089b95151488a03677faab9b4426034d5/diff:/var/lib/docker/overlay2/1b6ad43a498a9e4ce8be9d34f440c8fa22df88978d42f43a0ed6b5a1cd433f76/diff:/var/lib/docker/overlay2/6334b0d8ba92c546faf08c49ead1880dc29aea7d74eba67c27d62ab1f47bdb80/diff",
"MergedDir": "/var/lib/docker/overlay2/2279e938e1b301c6152ce6fb22b113c504b6c3da4da4ee786edb4a118bc7ba4d/merged",
"UpperDir": "/var/lib/docker/overlay2/2279e938e1b301c6152ce6fb22b113c504b6c3da4da4ee786edb4a118bc7ba4d/diff",
"WorkDir": "/var/lib/docker/overlay2/2279e938e1b301c6152ce6fb22b113c504b6c3da4da4ee786edb4a118bc7ba4d/work"
},
....
进入可写层:
# cd var/lib/docker/overlay2/2279e938e1b301c6152ce6fb22b113c504b6c3da4da4ee786edb4a118bc7ba4d/
# du -sh ./*
8.0K ./diff ## 此目录是记录容器可写层对文件目录的变化
4.0K ./link
4.0K ./lower
112M ./merged
0 ./work
# ls merged/ ## 这里的文件系统和进入docker里ls的文件系统是一样的
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
# docker exec -it 916b2fd08347 bash
root@916b2fd08347:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3. 管理镜像常用命令
查看docker 命令的用法:docker --help
查看管理镜像常用命令image 的用法:docker image --help
| 指令 | 描述 |
|---|---|
| ls | 列出镜像 |
| build | 构建镜像来自Dockerfile |
| history | 查看镜像历史 |
| inspect | 显示一个或多个镜像详细信息 |
| pull | 从镜像仓库拉取镜像 |
| push | 推送一个镜像到镜像仓库 |
| rm | 移除一个或多个镜像 |
| prune | 移除未使用的镜像。没有被标记或被任何容器引用的 |
| tag | 创建一个引用源镜像标记目标镜像 |
| export | 导出容器文件系统到tar归档文件 |
| import | 导入容器文件系统tar归档文件创建镜像 |
| save | 保存一个或多个镜像到一个tar归档文件 |
| load | 加载镜像来自tar归档或标准输入 |
# docker image ls
# docker image inspect nginx
# docker image pull nginx:1.14
# docker image rm nginx:1.14
# docker image prune
例如你要将一个镜像导出,然后发给朋友,朋友再导入
# docker image save nginx > nginx.tar
# ls -sh nginx.tar
108M nginx.tar
# docker image rm nginx
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 9f38484d220f 8 weeks ago 202MB
# docker image load < nginx.tar
Loaded image: nginx:latest
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 53f3fd8007f7 5 days ago 109MB
centos latest 9f38484d220f 8 weeks ago 202MB








网友评论