意义:
在前人的工作中: 创建尽可能小的Docker容器 , 中文翻译版本 。经过对比我们可以发现 Adriaan de Jonge的的工作方式是通过CGO实现golang的静态编译以达到目的。我们认为这种方式虽然很棒,但是操作起来并不容易,而且在很多项目中编译起来颇为麻烦。
为了精益求精,我们在极致精简与正常使用操作系统(比如说基于ubuntu14.04)做工程角度的平衡,我们还是基于Scratch空Docker image进行构建,使用busybox重新构建了一个大小为5MB左右裁剪过的Linux作为golang运行环境,该系统可以直接使用普通golang编译器输出amd64架构的程序,整个image构建完成之后大小为11.75mb。在DaoCloud中可以达到秒级构建,经过4次测试3次在一分钟以下最短45秒。
Dockerfile以及环境参考: https://github.com/lijianying10/DaoCloudStaticBlog
golang HTTP 主程序
Golang给出了足够多的Web开发工具包,可以编写简短的代码写出高性能web静态服务器。
Docker image中底层系统的构建
如果方便使用ubuntu 14.04 amd64的情况下:
构建调试过程中的注意事项:
- 在复制lib文件夹的底层动态库的时候需要不断调试动态库的依赖。
- 因为容器中要运行不同的项目,有可能对设备与权限上有不同的需求,需要注意定制脚本及时调整。
- 整个打包过程每次项目几乎只需要一次,调整项目大部分情况都是增量打包因此精简系统文件尽量仔细做。
boot2Docker 跨平台解决方案的Dockerfile(仿造上面来):
非安全快速解决方案
我们这里的安全性是指,我提供的tar根目录中也许包含了老版本的代码漏洞,或者各种技术债务。如果不是特殊场景下不需要自己手动构建Linux根。
具体解决方案如下:
- 直接在Dockerhub上使用progrium/busybox
- 直接使用我们在github上共享的rootfs.tar
方式1不是很推荐,因为构建的适合需要从网上下载依赖,可能会降低构建速度。非安全情况下推荐方式2构建所需要的docker image
方式1构建的Dockerfile:
方式2构建使用的Dockerfile:
Tip: static为第一节编译好的golang静态程序public为静态网站根目录
Tip:在构建时请不要使用 sudo docker build -< somefile
要使用 sudo docker build .
Tip: 方式2是我在Github中提供的方式。
跨平台支持
在本方案中跨平台的支持主要有两个方面:
- golang源程序的跨平台编译:GOX
- busybox 系统根(方案二中的Dockerfile中的文件rootfs.tar)的编译可以通过boot2docker来实现。
DaoCloud部署
DaoCloud给我们提供了一个非常好的测试平台,验证性能工作方式等等,不需要电脑中有Docker环境也可非常方便测试。
在这里我们介绍一下上面提供的 github仓库 的使用方法。
- Fork我们提供的代码仓库到您的github账号中。
- 登陆到 DaoCloud.io 使用代码构建功能
- 给项目取名字
- 登陆到github中系统会列出您在Github中的所有项目。并选中DaoCloudStaticBlog项目点击开始创建
在这之后DaoCloud会帮您创建目标项目的DockerImage。在镜像仓库中找到项目点击部署给容器起名选择环境即可运行。
注意事项
- Golang程序中的端口一定要与Dockerfile中的EXPOSE的号码对应,不然外网无法从DaoCloud访问您的容器。
- CMD中注意要直接运行网站。
- 如果条件允许请在本地调试运行之后再部署到DaoCloud中。
总结
在本次工作中我们使用了BusyBox来替代原来CGO的实施方案,有效的解决了编译时的麻烦。建立了底层依赖后直接复制应用程序进入Docker image完成在DaoCloud上的部署。在Dockerfile的依赖上我们直接使用了scratch没有任何依赖,加快了构建的速度达到秒级构建。