Docker容器技术:Docker Image概述

233 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

Image(镜像)概念

  • 文件和meta data的集合 - root filesystem
  • 分层的,并且每一层都可以添加改变和删除文件,成为一个新的image
  • 不同的image可以共享相同的layer
  • image本身是只读的

内核空间:linux kernal -- boot fs

用户空间:boot fs上面做的发行版,例如unbuntu。

图上面的base image:bootfs之上建立的镜像包含root fs,不包含kernal,共享主机的kernal,在此之上我们可以对此增删文件,从而产生新的一层---新的image。

例如图里面的#2 #4虽然是不同的image,#4在#2上面修改,但是#4也共享了base image

image.png

Image获取

image.png

首先第一种方法,docker提供了Dockerfile这种格式文件,可以定义一个docker-image,也可以通过这个文件build出来一个image。

Dockerfile有自己的语法,后面会详解:

image.png

FROM:基础的image-base image

LABEL:基本标识,例如作者

RUN:base-image之上做的事情,运行的命令

EXPOSE:暴露的端口

ENTRYPOINT:启动的入口

之后通过build -t(tag) ,然后会有很多step进行build(对应左边的行数的具体操作)

第二种方式是从registry仓库里面来pull拉取--类似github:

image.png

简单来说我们可以把自己的image push上去,然后pull下来,也可以pull别人的公共镜像~

默认pull的image都是从docker hub上面拉取,pull是不需要创建用户的,但是push需要创建一个。

docker hub可以访问:

image.png

制作一个base image

这里我们会制作一个hello world的小巧的base image

这里肯定不是pull的,而是需要借助dockerfile从头构建的,我们可以先看一下官方的hello-world image:

image.png

他也是一个base image,里面包含一个可执行文件,其实就是创建了一个容器,执行hello-world container:

image.png

编写hello-world程序

接着咱们编写了一个简单的c程序

image.png

然后编译成二进制文件,教程里面是用的linux下的编译链和工具,这里我们用vscode来进行。zhuanlan.zhihu.com/p/77645306

这里为了节省时间我就不进行本地测试了(vscode调试编译C C++还是需要一些步骤的),直接截图进行:

image.png

打包image

在当前目录下我们创建一个Dockerfile文件,开始编写,打成一个docker image:

FROM scratch // base image

ADD hello / //位置

CMD ["/hello"] //执行命令

保存退出。

docker build -t xxxx/hello-world .

image.png