文章目录
- 写在前面
- 基础知识
- 方法一:使用echo工具
- 方法二,使用c语言程序
- 方法三,使用汇编语言
- 小结
写在前面
尝试搞了下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 有对下面汇编代码的解释
汇编源码如下:
.datastrr: .string "hello docker~\n"len = .-strr
.text.global _start
_start:movq $1, %rax # syscall number of writemovq $1, %rdi # param1: stdoutmovq $strr, %rsi # param2: str addressmovq $len, %rdx # param3: out lengthsyscallmovq $60, %rax # syscall number of exitsyscall
汇编代码写的hello world并不依赖c库,直接通过write系统调用输出hello world
Dockerfile内容如下(hello是汇编代码编译出的可执行文件)
FROM scratch
COPY /hello /hello
WORKDIR /
CMD ["/hello"]
创建-执行:
导出镜像查看,大小仅有12kb
小结
以上方法任选其一即可