持续创作,加速成长!这是我参与「掘金日新计划 · 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获取
首先第一种方法,docker提供了Dockerfile这种格式文件,可以定义一个docker-image,也可以通过这个文件build出来一个image。
Dockerfile有自己的语法,后面会详解:
FROM:基础的image-base image
LABEL:基本标识,例如作者
RUN:base-image之上做的事情,运行的命令
EXPOSE:暴露的端口
ENTRYPOINT:启动的入口
之后通过build -t(tag) ,然后会有很多step进行build(对应左边的行数的具体操作)
第二种方式是从registry仓库里面来pull拉取--类似github:
简单来说我们可以把自己的image push上去,然后pull下来,也可以pull别人的公共镜像~
默认pull的image都是从docker hub上面拉取,pull是不需要创建用户的,但是push需要创建一个。
docker hub可以访问:
制作一个base image
这里我们会制作一个hello world的小巧的base image
这里肯定不是pull的,而是需要借助dockerfile从头构建的,我们可以先看一下官方的hello-world image:
他也是一个base image,里面包含一个可执行文件,其实就是创建了一个容器,执行hello-world container:
编写hello-world程序
接着咱们编写了一个简单的c程序
然后编译成二进制文件,教程里面是用的linux下的编译链和工具,这里我们用vscode来进行。zhuanlan.zhihu.com/p/77645306
这里为了节省时间我就不进行本地测试了(vscode调试编译C C++还是需要一些步骤的),直接截图进行:
打包image
在当前目录下我们创建一个Dockerfile文件,开始编写,打成一个docker image:
FROM scratch // base image
ADD hello / //位置
CMD ["/hello"] //执行命令
保存退出。
docker build -t xxxx/hello-world .