Docker构建镜像

介绍如何构建一个简单的docker镜像

Posted by Cheney.Yin on May 4, 2022

Docker构建镜像

1 build镜像方式

docker提供的镜像构建方式包括两种:

  • 使用docker commit命令从运行中的容器提交为镜像。
  • 使用docker build命令从Dockerfile文件构建镜像。

第一种方式这里不做赘述,第二种方式是最重要、最常用的方式。

2 Dockerfile构建镜像

Dockerfile常用指令如下,

Dockerfile指令 说明
FROM Dockerfile除了注释第一行必须是FROMFROM后面跟镜像名称,代表我们要基于哪个基础镜像构建。
RUN RUN后面跟一个具体的命令,类似于Linux命令行执行命令。
ADD 拷贝本机文件或远程文件至镜像,压缩文件会被展开。
COPY 拷贝本机文件至镜像内。
USER 指定容器启动的用户。
ENTRYPOINT 容器的启动命令。
CMD CMDENTRYPOINT指令提供默认参数,也可以单独使用CMD指定容器启动参数。
ENV 指定容器运行时的环境变量,格式为key=value
ARG 定义外部变量,构建镜像时可以使用build-arg=的格式传递参数用于构建。
EXPOSE 指定容器监听的端口,格式[port]/tcp或者[port]/udp
WORKDIR Dockerfile中跟在其后的所有命令设置工作目录。

3 Tiny示例镜像制作

这里,为大家演示如何使用Dockerfile构建一个极为精简的镜像。

首先,编写一段名为say.c的代码,内容如下,

1
2
3
4
5
6
7
8
#include <stdio.h>

int main() {
	char buf[128];
	scanf("%s", buf);
	printf("say:%s\n", buf);
	return 0;
}

执行编译。(这里使用了--static开启了静态链接,如果遵循动态链接,在打包镜像时还需要复制若干动态链接库文件,为了简化演示过程,这里使用了静态链接)

1
gcc --static -O2 -o say ./say.c
1
2
du -h ./say
904K	./say
1
2
3
./say
hello #输入
say:hello

接下来编写Dockerfile文件,

1
2
3
4
FROM scratch
WORKDIR /
COPY ./say /
CMD ["/say"]

为了压缩镜像体积,这里空白镜像scratch作为基础镜像,并且镜像中只拷贝了say可执行文件。(当然,生产环境下不可能如此精简。)

然后执行构建命令。

1
docker build -t say .

执行完毕后,docker images可以看到REPOSITORYsay的镜像文件,其大小仅为923kB

1
2
3
4
sudo docker images
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
say                      latest    aa5bb1e797b5   8 seconds ago   923kB
busybox                  latest    cabb9f684f8b   8 days ago      1.24MB

最后,从say镜像启动一个容器来验证是否成功。

1
2
3
❯ docker run -it --name say-c say
hello
say:hello

从上可知,say在容器内正常执行。