Docker技巧大年夜 2013年出生 到今朝已经4年有余了。对于已经回收和应用 Docker技巧 在日常开辟工作中的开辟者而言,构建 Docker镜像 已经是习认为常。但这是否意味着Docker的image构建机制已经相对完美了呢?不是的,Docker官方依旧在持续优化镜像构建机制。这不,大年夜本年宣布的 Docker 17.05版本 起,Docker开端支撑容器镜像的 多阶段构建(multi-stage build) 了。
什么是 镜像多阶段构建 呢?直接给出概念定义太突兀,这里先卖个关子,我们先大年夜日常开辟顶用到的镜像构建的方法和所碰到的镜像构建的问题说起。
一、同构的镜像构建
我们在做镜像构建时的一个常见的场景就是:应用在开辟者本身的开辟机或办事器上直接编译,编译出的二进制法度榜样再打入镜像。这种情况一般请求编译情况与镜像所应用的base image是兼容的,比如说:喂授 Ubuntu 14.04 上编译应用,并将应用打入基于 ubuntu系列base image 的镜像。这种构建我称之为“同构的镜像构建”,因为应用的编译情况与其安排运行的情况是兼容的:喂授Ubuntu 14.04下编译出来的应用,可以根本无缝地在基于ubuntu:14.04及今后版本base image镜像(比如:16.04、16.10、17.10等)中运行;但在不完全兼容的base image中,比如 centos 中就可能会运行掉败。
1、同构镜像构建举例
这里举个同构镜像构建的例子(后续的┞仿节也是基于这个例子的),留意:我们的编译情况为 Ubuntu 16.04 x86_64虚拟机、Go 1.8.3和docker 17.09.0-ce 。
我们用一个Go说话中最常见的http server作为例子:
- // github.com/bigwhite/experiments/multi_stage_image_build/isomorphism/httpserver.go
- package main
- import (
- "net/http"
- "log"
- "fmt"
- )
- func home(w http.ResponseWriter, req *http.Request) {
- w.Write([]byte("Welcome to this website!\n"))
- }
- func main() {
- http.HandleFunc("/", home)
- fmt.Println("Webserver start")
- fmt.Println(" -> listen on port:1111")
- err := http.ListenAndServe(":1111", nil)
- if err != nil {
- log.Fatal("ListenAndServe:", err)
- }
- }
接下来,我们就基于golang-builder中已经build完毕的myhttpserver来构建我们最终的应用image:
编译这个法度榜样:
- # go build -o myhttpserver httpserver.go
- # ./myhttpserver
- Webserver start
- -> listen on port:1111
这个例子看起来很简单,也没几行代码,但背后Go net/http包在底层做了大年夜量的工作,包含很多体系调用,可以或许反竽暌钩出应用与操作体系的“耦合”,这在后续的讲解中会表现出来。接下来我们就来为这个法度榜样构建一个docker image,并基于这个image来启动一个myhttpserver容器。我们选择ubuntu:14.04作为base image:
- // github.com/bigwhite/experiments/multi_stage_image_build/isomorphism/Dockerfile
- From ubuntu:14.04
- COPY ./myhttpserver /root/myhttpserver
推荐阅读
Mobile Pwn2Own世界黑客大赛攻破iOS11,iPhone X被远程越狱
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 信赖会有越来越多的年青人参加到收集安然行业中来,以“没有收集安然就没有国度安然”为指导,>>>详细阅读
本文标题:理解Docker的多阶段镜像构建
地址:http://www.17bianji.com/lsqh/38807.html
1/2 1