制作rootfs常用的方式:Dockerfile
#使用官方提供的Python开发镜像作为基础镜像 从python 2.7苗条 #将工作目录切换为/应用程序 WORKDIR/应用程序 #将当前目录下的所有内容复制到/app下 添加。/应用程序 #使用pip命令安装这个应用所需要的依赖 运行pip安装——可信主机pypi.python.org - r让 #允许外界访问容器的80端口 80年公开 #设置环境变量 ENV名字世界 #设置容器进程为:python app.py,即:这个python应用的启动命令 CMD (“python”、“app.py”)
注意事项:
1,入口点和CMD为容器启动必需参数,码头工人会提供一个默认的入口点:/bin/sh - c,故在不指定入口点时,直接指定CMD,实际上执行的命令是/bin/sh - c CMD
2,添加和复制的区别:添加可以如果添加的是一个压缩包,会自动解压,复制不会
3,每个指令都会生成对应的镜像层,所以在写运行的时候可以通过连接符写多个命令,避免产生过多的镜像层,例如:
运行ln - s/数据/服务/nginx/usr/local/nginx,,\ mkdir - p/数据/博客/nginx,,\/etc/init.d/nginx开始
创建完dockerfile通过以下命令构建镜像(在dockerfile所在目录下)
#码头工人建造- t测试图象。
然后通过码头工人上推传到镜像仓库
#码头工人标签测试图象测试/nginx: 1.14.2 #码头工人推测试/nginx: 1.14.2
也可以通过提交的方式创建容器镜像,具体做法如下;
码头工人exec - 4 ddf4638572d/bin/sh #在容器内部新建了一个文件 root@4ddf4638572d:/app #碰用法 root@4ddf4638572d:/app #退出 #将这个新建的文件提交到镜像中保存 码头工人提交4美元ddf4638572d geektime/helloworld: v2
码头工人提交其实就是在容器起来后,加上最上层的读写层,还有原先镜像中的只读层构成镜像。其中只读层在宿主机上是共享的,不会占用额外空间。
根据联合文件系统,在镜中像rootfs上做的任何更改都会在最上层先复制一层,再此基础上进行修改,也就是所谓的写时复制(ls - l>/proc/25686/ns副本 总0 lrwxrwxrwx 1根根0 8月13日14:05 cgroup→cgroup (4026531835): lrwxrwxrwx 1根根0 8月13日14:05 ipc→ipc (4026532278): lrwxrwxrwx 1根根0 8月13日14:05 mnt→mnt (4026532276): lrwxrwxrwx 1根根0 8月13日14:05净→净(4026532281): lrwxrwxrwx 1根根0 8月13日14:05 pid→pid (4026532279): lrwxrwxrwx 1根根0 8月13日14:05 pid_for_children→pid (4026532279): lrwxrwxrwx 1根根0 8月13日14:05用户→用户:[4026531837] lrwxrwxrwx 1根根0 8月13日14:05 uts→uts (4026532277):
然后通过setns()的系统调用,即可将进程加入到对应的ns中。
setns()需要2个参数,第一个参数是要加入的名称空间文件路径,如/proc/25686/ns/净;第二个参数是要执行的程序,如/bin/bash
当码头工人启动时指定——净=主机,则容器启动时不会为进程启动网络名称空间,容器跟宿主机共享一个网络栈。
<强> 3,voluem实现机制强>
主要解决宿主机和容器之间文件互通的问题,例如:
(1)宿主机上如何访问到容器产生的文件
(2)容器怎么访问到宿主机上的文件
在码头工人上,可以通过以下两种方式实现
美元码头工人运行- v/测试…… 码头工人- v/家庭运行:美元/测试……
第一种方式相当于在宿主机本地创建一个临时目录,再挂载到容器的/测试目录
第二种方式则是将宿主机上的/home目录挂载到容器的/测试目录
本质上是使用了linux的绑定挂载机制,其主要作用是允许将一个目录或文件而不是这块设备挂载到指定目录上。其原理是一个inode替换的过程,在linux中,inode存放的文件内容的对象,而dentry则存放的是指向这个对象的指针。故这个挂载的过程,实际上就是修改指针,指向另外一个inode,执行umount时来则将指针指向回原来的inode。
注意:
1,在挂载目录上做的操作并不会影响源目录
2,对于挂载目录的修改,执行码头工人提交时不会生效,只会创建对应的空目录