Docker-构建Base私人镜像

构建自己的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文件

发表评论