构建自己的Base docker
- 镜像是docker容器的基石,容器是镜像的运行实例有了镜像才能启动容器。
1.编写C代码实现自己的docker镜像
docker pull hello-word #去官方拉取一个docker精简的镜像
mkdir /hello-world
cd /hello-world/
vim hellow.c #创建一个C语言代码并且编译成二进制代码
#include<stdio.h>
int main()
{
printf("Hellow docker!\n");
}
2.安装编译成二进制文件并运行
yum -y install git gcc glibc glibc-static
gcc -static hello.c -o hello
./hellow
3.编写dockerfile文件
vim dockerfile
FROM scratch #镜像从0开始构建
ADD hello / #将文件添加到根目录下
CMD ["/hello"] #执行命令
4.执行docker命令生成image
docker build -t ddy4633/hello-world .
docker image ls #查看是否成功
5.运行生成的docker镜像测试
docker run ddy4633/hellow-word
总结
1.我们构建的docker就是一个极度精简版本的虚拟机里面就只有包含/hello这个文件,连最基本的/usr、/bin、/etc都是没有的,而当我们执行该容器就会自动打印/hello的内容了。
2.虽然hello-world是一个完整的镜像文件,但是它并不具备实际的用途
3.能够提供一个基本的操作系统环境,可以根据用户的需求安装配置软件,这中镜像叫做私有的base镜像
深入了解base镜像
关于Base镜像的含义:
- 不依赖其他的镜像文件,使用scratch构建
- 其他的镜像可以在此基础之上进行扩展
什么是bootfs呢?
bootfs(boot file system),boofs主要是引导加载内核的,当我们的内核被成功的加载后bootfs就自动的被(卸载)umount了。
什么是rootfs呢?
rootfs(文件系统)实际上就是一个软件,帮助我们的用户管理和存储这些二进制的信息如:/dev,/proc,/bin,/etc等标准目录和文件。
看图片我们可以知道Docker可以和我们的宿主机,共用一个内核
- 容器和我们的主机共用一个内核,并且不能修改
docker的镜像分层
- Docker支持通过扩展现有的镜像,创建新的镜像
- 采用分层结构最大的好处就是共享资源
对于容器来说最大的规则是:
- 我们增删改查已经生成好的了容器image镜像都是在容器层中
- root只对容器层有写入的权限,容器层之下的镜像层都只能读取
容器的读写操作是怎么进行的?
举个例子:当我们的add image层数量越来越多的时候,所有的镜像层会集合在一起组成一个庞大的文件系统,容器层最终看见的是一个层层叠加之后的系统。
- 添加:除了容器的添加是直接在容器层进行的
- 读取:是从容器层开始逐层向下查找,然后将寻找的文件加载到内存中
- 修改:也是逐层寻找文件当找到文件时候拷贝一份到container然后在continer上进行修改
- 删除:每一次的删除命令,会逐层的向下寻找文件,最后返回Container记录删除操作但是不对Image层进行修改。
基于本次原理进行实际的操作认知:
什么是dockerfile?
基础的dockerfile格式
shell格式
RUN yum -y install tree
CMD echo 'nihao'
ENTRPRIONT echo "nihao"
exec格式
RUN [ "yum","install","-y","tree" ]
CMD [ "/bin/echo","hello docker" ]
ENTRPOINT ["/bin/echo","hello docker"]
对比分析:
Dockerfile1
FROM centos
ENV name Docker
ENTRYPOINT echo "Hello $name"
Dockerfile2
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
执行Docker命令重构docker镜像
docker build -t 名称 .
执行我们刚才构建的docker image文件