Docker镜像管理基础与基于容器的镜像制作示例
一、Docker镜像
Docker镜像是启动Docker容器的一个非常重要的组件。Docker各组件之间的关系如图:

Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建并启动容器。并且Docker镜像是采用分层构建,联合挂载的机制实现的。那什么是分层构建,联合挂载呢?如图:

在分层构建机制中,最底层为bootfs,用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节省内存资源。在bootfs之上的是rootfs,这里就是docker容器的根文件系统,要指出的是在docker中,由内核挂载为“只读模式”,而后通过“联合挂载”额外挂载一个可写层。
例如我们需要做一个httpd的Docker镜像,通常是在一个最小的Linux系统之上利用分层构建技术再新建一个层用来构建httpd服务。所有的写操作都只能在writable层实现。
二、Overlayfs和Aufs
要实现分层构建需要特殊的文件系统来支持,最早是使用Aufs,但现在Docker中默认的是使用Overlayfs。
三、Docker Registry
启动容器时,Docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地,在不指定Registry时会默认指向dockerhub。Docker Registry分类:Sponsor Registry、Mirror Registry、Vendor Registry、Private Registry。
Registry是由repository和index组成。repository可分为顶层仓库和用户仓库,用户仓库的格式为“用户名/仓库名”。镜像的开发与维护:

四、基于容器的Docker镜像制作示例
下面举一个简单的小例子:在busybox镜像的基础上制作一个网页镜像,每次启动运行这个镜像时,这个网页页面都会自动存在并运行。
1.启动一个最小系统,如busybox,创建一个页面:
]# docker run --name box1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # mkdir -p /data/html
/ # vi /data/html/index.html
<h1>Hello Docker.</h1>
2.保证容器处于运行状态,使用docker commit命令制作:
~]# docker commit -h
Flag shorthand -h has been deprecated, please use --help
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) #容器运行时还在不停的生成新文件,为了完整性,可以使用这一选项。
~]# docker commit -p box1
sha256:15cb8525323f4287b2977b4f0d4809421aaab194b39985ad8f3cd32b9a721bc9
~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 15cb8525323f seconds ago .2MB
busybox latest 3a093384ac30 weeks ago .2MB
<none>就是刚才制作的的镜像,因为没有指定Repository名和Tag所以显示为<none>。为了使用便利,也可以用 docker tag 打上标签和Repository名:
~]# docker tag 15cb8525323f ready/httpd:v0.
~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ready/httpd v0. 15cb8525323f minutes ago .2MB
busybox latest 3a093384ac30 weeks ago .2MB
启动镜像,可以看到文件都在:
~]# docker run --name new1 -it ready/httpd:v0.
/ # ls data/html/index.html
data/html/index.html
/ #
3.查看docker容器启动时默认运行的程序
用 docker inspect 命令可以查看容器启动时默认运行的程序:
~]# docker inspect new1
...略去...
"Cmd": [
"sh" #说明启动时默认运行的是shell
]
...略去...
~]# docker inspect nginx:1.14-alpine
"Cmd": [
"nginx",
"-g",
"daemon off;" #nginx必须运行在前台,不然就代表启动即停止
]
用 docker commit 修改容器启动时默认运行的程序:
~]# docker commit -a "Ready" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p new1 ready/httpd:v0.2
sha256:d2eee7f29cc73a7bd64487752133772be8dd69fbf6c2f0db92ff07e33bc8c5ee
-a :是指明作者,-c :是修改默认配置,上面的示例只是修改了CMD的参数。
启动新镜像,现在默认运行的不是shell了,所以不使用-it选项:
~]# docker container run --name new2 ready/httpd:v0.
再启一个终端,用curl命令就可以直接访问这个容器的页面了:
~]# curl 172.17.0.2
<h1>Hello Docker.</h1>
4.做好容器后就能根据需要push到容器仓库中了
可以根据实际情况push到docker hub或者阿里云的容器仓库,或者其他的仓库。
虽然这个容器中的httpd服务和网页都已经搭建好了,但只有容器的宿主机和同一宿主机上的其他容器能够访问这个页面,这是因为容器的网卡是链接在宿主机上的虚拟网卡上的,如果要外部能访问容器的网页,需要打开宿主机Linux的核心转发功能。
Docker镜像管理基础与基于容器的镜像制作示例的更多相关文章
- Docker镜像管理基础篇
Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...
- 3、Docker镜像管理基础
Docker image # docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis -alpine 23d561d12e92 d ...
- Docker创建支持ssh服务的容器和镜像
原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
- docker第三篇 镜像管理基础
docker 工作原理: 常用的命令docker run .create .start... 都是客户端命令 Docker Daemon 接收到客户端传过来的命令以后 docker daemon会根据 ...
- 3.docker镜像管理基础
一.docker镜像相关 1.About Docker Image Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器. 采用分层构建机制,最底层为bootf ...
- Docker基于容器创建镜像
docker commit -m "提交信息" -a "作者信息" imgId imgName
- docker镜像管理基础
[root@node01 ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64 v0.10.0-amd64: Pulling from coreos ...
- UVM基础总结——基于《UVM实战》示例
一.前言 工作一直在做SoC验证,更关注模块间的连接性和匹配性,所以相比于擅长随机约束激励的UVM来说,定向测试的概念更容易debug.当然前提是IP已经被充分验证.因此觉得接触UVM的机会较少.到现 ...
随机推荐
- STM32 HAL库的使用心得
1.I2C函数中HAL_I2C_Mem_Write和HAL_I2C_Master_Transmit有啥区别?{ 使用HAL_I2C_Mem_Write等于 先使用HAL_I2C_Master_Tran ...
- Python环境安装及IDE介绍
因为最近时间比较松散,公司的业务也不多,所以想趁机赶紧投入到人工智能的学习大业当中.经过多次比较,看到目前市面上还是使用Python做为基础语言较多,进儿学习算法.人工智能组件.机器学习.数据挖掘等课 ...
- 急速安装lnmp 编译版本
急速安装lnmp 编译版本 安装msyql+PHP 系统centos6.5 安装 开发软件包 已经改成了163的源需要执行下面的代码 官网不自带 libmcrypt libmcrypt-devel w ...
- visual studio 2015 Opencv 3.4.0配置
因为想做AR方面,需要了解计算机视觉知识,决定从opencv开始入门,在网上买了本毛星云的<Opencv3编程入门>开始自学. 一.opencv 3.4.0下载安装 在官网http://o ...
- linux-ssh登陆导语
用户登录前显示的导语信息(在你选择的文件中配置,例如 /etc/login.warn) 用户成功登录后显示的导语信息(在 /etc/motd 中配置) 如何在用户登录前连接系统时显示消息 当用户连接到 ...
- 无法从项目中获取SSIS包的列表
一直做的SSIS项目,突然在生成项目的时候没有反应,crtl + alt +o 提示:无法从项目中获取SSIS包的列表,发现是最近的包没有设计数据源, 解决思路:检查最近的包,挨个运行一遍,看看有没有 ...
- 自定义滚动条样式(layui.v1)
来源于 layui css 代码 ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-button, ::-w ...
- 第81节:Java中的数组
第81节:Java中的数组 本节介绍数组的基本概念,数据就是一种数据结构,可以用来存储多个数据,每个数组中可以存放相同类型的数据.比如,在学校,我们是一个班,这里的班级中每个同学都是这个班级数组中的元 ...
- springmvc的Controller里实现转发的同时弹出提示对话框
以前写servlet时就用到这个,但是现在学了springMVC+hibernate后就不知道怎么实现了,后来在网上找了好多,看了好多,最后经过自己实践成功的如下: 1.首先是Controller控制 ...
- 深度学习环境配置:Ubuntu16.04安装GTX1080Ti+CUDA9.0+cuDNN7.0完整安装教程(多链接多参考文章)
本来就对Linux不熟悉,经过几天惨痛的教训,参考了不知道多少篇文章,终于把环境装好了,每篇文章或多或少都有一些用,但没有一篇完整的能解决我安装过程碰到的问题,所以决定还是自己写一篇我安装过程的教程, ...