从空白镜像创建Docker hello world

写在前面

尝试搞了下docker,网上的教程大多是让下载一个ubuntu这种完整镜像,寥寥几篇从空白镜像开始创建的,也要去下载一个文件系统;我的天,就一个hello world,不至于吧
本篇会以三种方法,从空白镜像创建一个迷你的docker hello world镜像

基础知识

# 使用当前目录作为根目录构建镜像
docker build -t myimage .
# 查看镜像列表
docker images
# 导出镜像
docker save myimage > myimage.tar
# 加载镜像
docker load < myimage
# 启动镜像
docker run -it myimage

Dockerfile中的指令

FROM:指定基础镜像
COPY:将文件或目录复制到镜像中
CMD:容器创建时的默认命令

注意:docker构建的时候会以当前目录为根目录,也就是说,比如我在/home/arco/docker目录下创建镜像,想从/bin目录下拷贝个文件到镜像中,是拷不了的,要先把这个文件拷贝到/home/arco/docker/bin目录下

方法一:使用echo工具

linux系统中最简单的打印命令就是echo了,直接弄个echo过来输出一下多方便呢?
那就搞个如下的Dockerfile试试

FROM scratch
COPY /bin/echo /bin/echo
WORKDIR /
CMD ["/bin/echo", "hello docker"]

看似没啥问题,实则运行不了,报错如下:
在这里插入图片描述
原因:echo是个链接了动态库的可执行文件,只拷个echo能执行才怪了
执行ldd命令查看echo依赖的库:
在这里插入图片描述
嗯,依赖c库和链接器,那就把它们都拷过来,在当前目录下新建lib64目录,如下所示:
在这里插入图片描述

修改Dockerfile如下:

FROM scratch
COPY /bin/echo /bin/echo
COPY /lib64/libc.so.6 /lib64/libc.so.6
COPY /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
WORKDIR /
CMD ["/bin/echo", "hello docker"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小3.4兆
在这里插入图片描述

方法二,使用c语言程序

这次不用echo,自己写程序打印
c源代码如下:

#include<stdio.h>
int main()
{
    printf("hello docker!\n");
    return 0;
}

ldd查看编译出的可执行文件:
在这里插入图片描述
嗯,和echo的依赖一样,那么目录结构就是:
在这里插入图片描述
Dockerfile内容如下:

FROM scratch
COPY /a.out /a.out
COPY /lib64/libc.so.6 /lib64/libc.so.6
COPY /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
WORKDIR /
CMD ["/a.out"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小也是3.4兆(比echo那个小了几十kb
在这里插入图片描述

方法三,使用汇编语言

x86平台AT&T入门汇编请参考:AT&T hello world 有对下面汇编代码的解释

汇编源码如下:

.data
	strr:   .string  "hello docker~\n"
	len = .-strr
.text
	.global _start
_start:
	movq    $1,    %rax    # syscall number of write
	movq    $1,    %rdi    # param1: stdout
	movq    $strr, %rsi    # param2: str address
	movq    $len,  %rdx    # param3: out length
	syscall

	movq    $60,   %rax    # syscall number of exit
	syscall

汇编代码写的hello world并不依赖c库,直接通过write系统调用输出hello world
Dockerfile内容如下(hello是汇编代码编译出的可执行文件)

FROM scratch
COPY /hello /hello
WORKDIR /
CMD ["/hello"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小仅有12kb
在这里插入图片描述

小结

以上方法任选其一即可

相关推荐

  1. centos镜像创建具备SSH链接的Dockerfile

    2024-03-11 18:08:04       54 阅读
  2. 如何创建docker镜像

    2024-03-11 18:08:04       59 阅读
  3. 怎么创建docker镜像

    2024-03-11 18:08:04       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 18:08:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 18:08:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 18:08:04       87 阅读
  4. Python语言-面向对象

    2024-03-11 18:08:04       96 阅读

热门阅读

  1. docker创建自定义网络

    2024-03-11 18:08:04       47 阅读
  2. python协程理解笔记,

    2024-03-11 18:08:04       39 阅读
  3. 递归在解决链表问题中的应用

    2024-03-11 18:08:04       39 阅读
  4. 前端环境配置Nodejs,NRM,YARN

    2024-03-11 18:08:04       37 阅读
  5. vue,elementUI多表单同时提交,表单校验解决方案

    2024-03-11 18:08:04       42 阅读
  6. 高级优化理论与方法(三)

    2024-03-11 18:08:04       36 阅读
  7. List数据去重的4种有效方法

    2024-03-11 18:08:04       45 阅读