如何制作自己的docker镜像 (构建自定义镜像docker怎么做)

Docker容器的理念是Build、Ship和Run。

构建Docker镜像是应用容器化的第一步

这里用一个简单的Node.js应用作为示例,实践Docker镜像的构建以及瘦身过程。

实践

准备一些文件:

  1. express-server.js
  2. package.json

express-server.js是主程序,使用express框架。该程序启动后会监听1337端口,等待接收请求并打印Hello World!

docker镜像瘦身思路,如何搭建docker镜像仓库

​编写Dockerfile文件:

FROM node:12
WORKDIR /user/src/app

COPY package*.json ./
RUN npm install
COPY . .

EXPOSE 1337
CMD [ "node", "express-server.js" ]

大致意思是

  1. 使用基础镜像node:12​​
  2. 设定工作目录
  3. 把package*.json拷贝到镜像的工作目录。
  4. 在镜像中执行npm install​,*载下**所需的node.js依赖库。
  5. 把当前目录的文件(其实就是express-server.js)拷贝到镜像的工作目录。
  6. 暴露1337端口
  7. 设置启动命令

运行之后,可以看到工作目录的状态符合我们的构想。

$ 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