docker镜像
docker镜像含有启动容器所需要的文件系统和内容,因此,其用于创建并启动docker容器
docker镜像采用分层构建机制,最底层为bootfs,其之为rootfs
- bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节省内存资源
- rootfs:位于rootfs上,表现为docker容器的根文件系统
传统模式中,系统启动时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为只读模式
docker中,rootfs由内核挂在为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层
Docker Image Layer
位于下层的镜像称为父镜像(parent image),最底层的称之为基础镜像(Base Image)
最上层为“读写”层,其下层为“只读”层
想要联合挂载需要特定的文件系统Aufs
Aufs
advance multi-layered unification filesystem:高级多层统一文件系统
- 用于为linux文件系统实现“联合挂载”
- aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发
- Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持
- aufs的竞争产品是overlayfs,后者后者自从3.18版本开始被合并到了linux内核
- docker的分层镜像,除了aufs,docker还支持btrfs,devicemapper和vfs等
在Ubuntu系统下,默认文件系统为aufs,而在CentOS7上,用的是devicemapper
Docker Registry
启动容器时,docker daemon会试图从本地获取相关镜像,本地镜像不存在时,将从Registry中下载该镜像保存至本地中
镜像相关操作
镜像的生成途径
- dockerfile
- 基于容器制作
- docker hub automated builds
基于容器制作镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] Create a new image from a container's changes Options: -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true)
制作镜像案例:
[root@localhost ~]# docker commit -p -a "liwang" -m "myimage" mybox sha256:de701b01b33656a3c1e04bce397940fc7675dca4e08e60ca19425900a258274d [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> de701b01b336 3 seconds ago 1.22MB busybox latest 020584afccce 3 weeks ago 1.22MB
修改标签案例:
[root@localhost ~]# docker tag de701b01b336 liwang/busybox:v1 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE liwang/busybox v1 de701b01b336 2 minutes ago 1.22MB busybox latest 020584afccce 3 weeks ago 1.22MB
删除镜像(如果一个镜像有2个标签,其实是删除标签)
[root@localhost ~]# docker image rm liwang/busybox:v1 Untagged: liwang/busybox:v1 Deleted: sha256:de701b01b33656a3c1e04bce397940fc7675dca4e08e60ca19425900a258274d Deleted: sha256:ecb7306b32fefb8a2c964a217506696a7f41f7085fe317f7416db74a066f284e [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 020584afccce 3 weeks ago 1.22MB
修改镜像初始运行的命令
[root@localhost ~]# docker commit -a "liwang<liwang_dc@126.com>" -p -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' mybox liwang/httpd:v1 sha256:02a490f7eb0d771125f9f8a29c9ae8973862c27f7ac2481c8c19f3aa73a55506
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ddb70a657548 liwang/busybox:v1 "sh" 7 minutes ago Up 7 minutes mybox
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ddb70a657548 liwang/busybox:v1 "sh" 7 minutes ago Up 7 minutes mybox
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE liwang/httpd v1 02a490f7eb0d About a minute ago 1.22MB liwang/busybox v1 6592e65bbc7f 27 minutes ago 1.22MB nginx latest 231d40e811cd 12 hours ago 126MB busybox latest 020584afccce 3 weeks ago 1.22MB
[root@localhost ~]# docker run --name myhttpd -itd liwang/httpd:v1
9bbc0271904b9f41150911f2a11117943a7cd44c8e531b76d3f699a970411210
[root@localhost ~]# curl 172.17.0.2
<h1>this is busybox page</h1>
docker hub
上传至docker hub,这里要注意的是本地镜像标签一定要和docker hub上自己的私有仓库名字一致
登录docker hub 创建自己的仓库
填写仓库名称和描述信息,并且选择是公有仓库还是私有仓库
然后把镜像上传至docker hub上
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE liwang/httpd v1 02a490f7eb0d 37 minutes ago 1.22MB lizhaoqwe/httpd v1 02a490f7eb0d 37 minutes ago 1.22MB liwang/busybox v1 6592e65bbc7f About an hour ago 1.22MB nginx latest 231d40e811cd 12 hours ago 126MB busybox latest 020584afccce 3 weeks ago 1.22MB
[root@localhost ~]# docker login -u lizhaoqwe
Password:
[root@localhost ~]# docker push lizhaoqwe/httpd:v1 The push refers to repository [docker.io/lizhaoqwe/httpd] 69bc3e032fd9: Pushed 68eb0185b393: Pushed 1da8e4c8d307: Pushed v1: digest: sha256:593871c722b58b0d8a45978e159896737fa8b91de5cbaffecfdf4379c3598243 size: 941
上传完毕后查看docker hub
基于阿里云的镜像仓库
点击管理可以看到阿里云镜像仓库的用法
现在我们就把刚才基于busybox创建的httpd镜像上传至阿里云镜像仓库
[root@localhost ~]# docker push registry.cn-hangzhou.aliyuncs.com/liwang123/httpd The push refers to repository [registry.cn-hangzhou.aliyuncs.com/liwang123/httpd] 69bc3e032fd9: Pushed 68eb0185b393: Pushed 1da8e4c8d307: Pushed v1: digest: sha256:593871c722b58b0d8a45978e159896737fa8b91de5cbaffecfdf4379c3598243 size: 941
验证
镜像打包
镜像的导入导出
如果我们的镜像,别人也想用,但只想用一次就删除掉,那么我们要先打标签在上传,然后测试人员还要pull下来,其实也比较麻烦,那么这个时候我们可以考虑用镜像打包的方式,镜像打包可以把所需要的镜像打包在一起,然后可以用scp等命令拷贝过去,在导入就可以了
打包镜像
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE liwang/httpd v1 02a490f7eb0d 2 hours ago 1.22MB liwang123/httpd v1 02a490f7eb0d 2 hours ago 1.22MB lizhaoqwe/httpd v1 02a490f7eb0d 2 hours ago 1.22MB registry.cn-hangzhou.aliyuncs.com/liwang123/httpd v1 02a490f7eb0d 2 hours ago 1.22MB liwang/busybox v1 6592e65bbc7f 2 hours ago 1.22MB nginx latest 231d40e811cd 14 hours ago 126MB busybox latest 020584afccce 3 weeks ago 1.22MB [root@localhost ~]# docker save -o myimages.tar.gz registry.cn-hangzhou.aliyuncs.com/liwang123/httpd nginx busybox [root@localhost ~]# ls -ltr 总用量 150624 -rw-r--r-- 1 root root 22580749 7月 17 2017 Python-3.6.2.tgz -rw-------. 1 root root 1257 5月 28 08:18 anaconda-ks.cfg drwxr-xr-x. 5 root root 272 6月 16 23:03 old drwxr-xr-x. 5 root root 240 6月 16 23:31 inc1 drwxr-xr-x. 5 root root 235 6月 16 23:31 fullbackup drwxr-xr-x 17 root root 4096 6月 18 15:11 Python-3.6.2 -rw-r--r-- 1 root root 102 6月 18 21:42 test.yaml -rw-r--r-- 1 root root 15 6月 18 21:42 test.retry -rw------- 1 root root 131637760 11月 23 22:44 myimages.tar.gz
在另一台机器上执行导入命令并验证
[root@localhost ~]# docker load -i myimages.tar.gz 1da8e4c8d307: Loading layer [==================================================>] 1.437MB/1.437MB 68eb0185b393: Loading layer [==================================================>] 5.12kB/5.12kB 69bc3e032fd9: Loading layer [==================================================>] 2.56kB/2.56kB Loaded image: registry.cn-hangzhou.aliyuncs.com/liwang123/httpd:v1 831c5620387f: Loading layer [==================================================>] 72.48MB/72.48MB 5fb987d2e54d: Loading layer [==================================================>] 57.67MB/57.67MB 4fc1aa8003a3: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:latest Loaded image: busybox:latest
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/liwang123/httpd v1 02a490f7eb0d 2 hours ago 1.22MB nginx latest 231d40e811cd 14 hours ago 126MB busybox latest 020584afccce 3 weeks ago 1.22MB