如何创建最小的容器镜像
优化容器镜像尺寸的方法一般是使用 alpine 或者 busybox 这类超轻量级的linux 作为 base image.
然而,所谓容器说到底不过就是一堆进程而已,之所以要引入这些base image不过是为进程提供依赖的动态库而已。
也就是说,如果采取静态方式来编译程序的话,那么就可以完全省略掉base image,从而节省出一些空间。
比如,我们可以先创建一个示例程序:
#include<iostream> using namespace std; int main(){ cout << "Hello World \n "; return 0; }
我们对它进行静态编译:
g++ -o hello -static hello.cpp
现在编写Dockerfile
FROM scratch
ADD hello /
CMD ["/hello"]
其中第一句 FROM scratch
中的 scratch
并不是parent镜像的名字,它表示Docker在构建该镜像时并不基于任何其他的镜像。
现在我们试一下,构建该镜像
docker build --tag scratch .
Sending build context to Docker daemon 557.1kB Sending build context to Docker daemon 11.7MB Sending build context to Docker daemon 23.4MB Sending build context to Docker daemon 34.54MB Sending build context to Docker daemon 42.36MB Step 1/3 : FROM scratch ---> Step 2/3 : COPY hello / ---> 645b80b836a7 Step 3/3 : CMD ["/hello"] ---> Running in 762c0cb569cb Removing intermediate container 762c0cb569cb ---> b63cd83c8576 Successfully built b63cd83c8576 Successfully tagged scratch:latest
我们来运行一下这个容器
docker run --rm scratch
Hello World
容器能正常运行。
现在我们来看一下 Docker 镜像的大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE scratch latest b63cd83c8576 4 minutes ago 2.15MB lujun9972/archlinuxcn.docker latest 9462714d994c 46 hours ago 628MB silex/emacs master 05a842271d75 2 months ago 439MB alpine latest 3fd9065eaf02 5 months ago 4.15MB richxsl/rhel7 latest 9c7b3825758a 3 years ago 245MB
你会发现,scratch镜像只有2.15M,而相比之下alpine则有4.15M大小