Docker容器的理念是Build、Ship和Run。
构建Docker镜像是应用容器化的第一步。
这里用一个简单的Node.js应用作为示例,实践Docker镜像的构建以及瘦身过程。
实践
准备一些文件:
- express-server.js
- package.json
express-server.js是主程序,使用express框架。该程序启动后会监听1337端口,等待接收请求并打印Hello World!

编写Dockerfile文件:
FROM node:12
WORKDIR /user/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 1337
CMD [ "node", "express-server.js" ]
大致意思是
- 使用基础镜像node:12
- 设定工作目录
- 把package*.json拷贝到镜像的工作目录。
- 在镜像中执行npm install,*载下**所需的node.js依赖库。
- 把当前目录的文件(其实就是express-server.js)拷贝到镜像的工作目录。
- 暴露1337端口
- 设置启动命令
运行之后,可以看到工作目录的状态符合我们的构想。
$ docker exec nodeapp ls -l -a
-rw-rw-r-- 1 root root 27 Feb 20 12:53 .dockerignore
-rw-rw-r-- 1 root root 149 Feb 20 13:03 Dockerfile
-rw-rw-r-- 1 root root 220 Dec 28 01:24 express-server.js
drwxr-xr-x 51 root root 4096 Feb 20 12:57 node_modules
-rw-r--r-- 1 root root 14950 Feb 20 12:57 package-lock.json
-rw-rw-r-- 1 root root 259 Dec 28 01:37 package.json
编写完成Dockerfile后,就可以构建镜像了。
生成镜像名称为u/test-docker-nodeapp。
$ docker build . -t u/test-docker-nodeapp
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
u/test-docker-nodeapp latest f13fa3f67050 9 minutes ago 921 MB
启动容器。
把监听端口映射到本机的1338端口,这样访问地址http://localhost:1338就可以看到Hello World!了。
$ docker run -p 1338:1337 --name nodeapp -itd u/test-docker-nodeapp
98e6137bf2e1030f0e24804775ad1016bf03895d9006aa23fe29ae2484162046
$ curl http://localhost:1338
Hello World!
瘦身
刚才制作的镜像u/test-docker-nodeapp大小达到921MB。相比于程序的简单功能,镜像的体积就显得比较臃肿了。
可以使用docker-slim对镜像进行瘦身。
首先,安装docker-slim。这里采用docker镜像版本。
$ docker pull dslim/slim
然后,使用slim build优化镜像 u/test-docker-nodeapp
$ docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock dslim/slim build u/test-docker-nodeapp
运行成功后,生成一个新的镜像以.slim结尾,体积从921MB减小到55.1MB。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
u/test-docker-nodeapp.slim latest 7dd001fcf597 14 seconds ago 55.1 MB
docker-slim-empty-image latest 3bbde688bcd1 28 seconds ago 0 B
u/test-docker-nodeapp latest f13fa3f67050 2 hours ago 921 MB
运行效果相同:
$ docker run -p 1339:1337 --name nodeapp.slim -itd u/test-docker-nodeapp.slim
08454b141c653672aa11327b13d03a21da28f3f4421bb632d5744d620d63cb18
$ curl http://localhost:1339
Hello World
参考:
把一个 Node.js web 应用程序给 Docker 化 | Node.js (nodejs.org)
https://github.com/slimtoolkit/slim#installation
https://github.com/slimtoolkit/slim#running-containerized