Docker 获 7500 万美元融资,估值达 13 亿美元|航海日志 Vol.24

汇总一周容器圈热点资讯,让开发者了解最 in 的容器技术,让企业熟知最实时的国内外容器行业动态。

Docker 获 7500 万美元融资,估值达 13 亿美元

企业软件公司 Docker 昨日宣布获得 7500 万美元融资,交易后估值达 13 亿美元。此轮融资预计于本月底完成,将帮助 Docker 吸引企业客户,其广受全世界开发人员欢迎的开源工具也终于可以开始赚钱了。该公司将用部分资金打造一支销售和营销团队,专门服务企业客户。Docker 的上一轮融资是在 2015 年,当时交易后估值为 10 亿美元,如今的估值又得到小幅增长。
虽然 Docker 的技术受到了大量开发人员的好评——其社区拥有 3000 多名个人贡献者和270 多个技术开发小组,但超高的人气并没有给他们带来实际收入。
Docker 方面拒绝对此次融资和公司估值置评。这家成立7年的公司拥有 ADP LLC 和通用电气等知名企业客户,竞争对手又有创企 Mesosphere 和谷歌 Kubernetes 等开源系统。
今年春天,Docker 管理层经历了一系列变动。5月,Concur Technologies 的原首席执行官Steve Singh 来到 Docker,取代联合创始人 Ben Golub 成为公司一把手。产品执行副总裁 Marc Verstaen 近日也离开了公司,接替他的是另一家公司的联合创始人兼首席技术官 Solomon Hykes。

 AWS 正式加入 CNCF,Kubernetes 已成为容器编排事实标准?

就在微软上周刚刚宣布加入 CNCF 不久,AWS 便也紧随其后,于近日宣布以铂金身份加入云原生计算基金会(CNCF),这也就意味着在容器编排方面 ,AWS 选择了拥抱开源的方式。
AWS 加入 CNCF,也就意味着要解决 AWS 和 Kubernetes 之间的融合问题。Kubernetes 这一原先由 Google 开发的开源的容器编排工具正快速成为管理容器化软件开发环境的事实标准。
CNCF 是用于管理和统筹 Kubernetes 项目的,而作为新加入 CNCF 的成员,AWS 也承诺花费时间和金钱来帮助进一步构筑和发展该项目,并贡献一些其他的小项目来让 Kubernetes 更易于使用。
亚马逊曾经一度推出自己的容器编排产品:Amazon EC2 容器服务,这样就有很多云计算用户和公司越来越担心 AWS 只关心自己的产品和服务,是想牢牢的将用户锁定在 AWS,让用户不断的投入时间和金钱。然而,Kubernetes 能够让云计算用户轻松的扩展自己的负载到多个云计算供应商中,当然也包括自己本地的服务器。AWS 可能意识到了这一点,认为应该去积极支持(尽管不是全部)。
其实,近期 AWS 的一些动作已经表明,AWS 正在向 Kubernetes 靠拢。比方说,一份近期的报告就显示,AWS 意图在 Kubernetes 之上开发一套容器编排产品,而加入 CNCF,也让这个计划水到渠成。
有分析人士表明:AWS 以实际行动站在了开源的阵营,某种程度上我们可以认为这是开源的再一次胜利,当然,最大的受益者仍然是拥抱 Kubernetes 的用户和开发者。目前为止,Gartner 公有云魔力向限的前三名:AWS、Azure、Google,均在自己的公有云服务中支持 Kubernetes,也加入了 CNCF,这意味着三家将在标准中角力。但是对于用户来说,再也不存在锁定的问题了。
这无疑是 AWS,作为强者的一次让步,也说明 AWS 的聪明之处——一切以利益为先,绝不逆势而为。

使用 Golang 在构建时注入变量

在这篇博文中,我将介绍如何在构建时将变量注入 Golang 可执行文件。
下面的实例包含了 Docker 项目的 CLI,和提交 ID77b4dce:
$ docker version
Client:  
 Version:      17.06.1-ce-rc1
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   77b4dce
 Built:        Fri Jul 14 07:38:15 2017
 OS/Arch:      darwin/amd64
为什么需要加入版本信息? 这个一个很好的客户支持方式–您可以快速,轻松地识别他们使用的版本,以及使用寿命。

获取有用的变量

在你开始之前,首先思考一下注入什么样的变量在构建时是有意义的?它可以是从 CI 机器的主机名到 Web 服务调用的结果,或者更常见的是Git日志中的最后一个提交 ID。
我们在这里使用最后一次提交 ID。创建一个包含 README 的 git 项目:
$ mkdir /tmp/git-tester && \
 cd /tmp/git-tester && \
 git init && \
 echo "Let's work with Git" > README && \
 git add . && \
 git commit -m "Initial" && \ 
 echo "Let's keep working" >> README && \
 git add . && \
 git commit -m "First update"
你会在你的 Git 日志里看到两次提交。
$ git log
commit 67b05a31758848e1e5237ad5ae1dc11c22d4e71e  
Author: Alex Ellis <alexellis2@gmail.com>  
Date:   Tue Aug 8 08:37:20 2017 +0100

    First update

commit 9b906b6d02d803111250a974ed8042c4760cde7f  
Author: Alex Ellis <alexellis2@gmail.com>  
Date:   Tue Aug 8 08:37:20 2017 +0100

    Initial
以下是您最近一次提交的 ID:
$ git rev-list -1 HEAD
67b05a31758848e1e5237ad5ae1dc11c22d4e71e
接下来,我们可以将其捕获到环境变量中:
$ export GIT_COMMIT=$(git rev-list -1 HEAD) && \
  echo $GIT_COMMIT

67b05a31758848e1e5237ad5ae1dc11c22d4e71e

代码准备

使用这个 hello world 代码:
package main

import (  
        "fmt"
)

func main() {  
        fmt.Println("Hello world")
}
为了传递构建时变量,我们需要在我们的主包中创建这个变量。我们称它为var GitCommmit string。
package main


import (  
        "fmt"
)

var GitCommit string

func main() {  
        fmt.Printf("Hello world, version: %s\n", GitCommit)
}
用它来测试:
$ go build && \
  ./git-tester 
Hello world, version:
当前版本为空,但我们现在可以开始注入一个变量。

覆写 go build

现在,我们需要覆写go build命名,使用-ldflags标记来传入信息。
$ export GIT_COMMIT=$(git rev-list -1 HEAD) && \
  go build -ldflags "-X main.GitCommit=$GIT_COMMIT"
现在我们看到应用程序在构建时注入了一个硬编码的版本。
$ ./git-tester
Hello world, version: 67b05a31758848e1e5237ad5ae1dc11c22d4e71e

使用 Docker 操作

一旦你确定了你的构建时变量,你需要更新你的Dockerfile。
编写Dockerfile:
FROM golang:1.7.5

WORKDIR /go/src/github.com/alexellis/git-tester  
COPY .git     .  
COPY app.go   .

RUN GIT_COMMIT=$(git rev-list -1 HEAD) && \  
  go build -ldflags "-X main.GitCommit=$GIT_COMMIT"

CMD ["./git-tester"]
构建并测试:
$ docker build -t git-tester .
$ docker run git-tester
Hello world, version: 67b05a31758848e1e5237ad5ae1dc11c22d4e71e
这只是一个展示如何使用Docker和Go设置构建变量的小例子。你可以继续深入了解并且使用多步构建来优化镜像的大小。
这里提供一个我的用于构建基于树莓派,MacOS和64位Linux的Dockerfile:FaaS CLI Dockerfile

Docker 中的生成器模式与多步构建

这篇文章主要介绍Docker项目中可以使开发人员有效构建小规模镜像的两个PR。
什么是生成器模式?
像 Golang 这样的静态编译语言倾向于从 Golang“SDK” 镜像中获取 Dockerfile,添加源代码,然后将其推送到 Docker Hub。不幸的是,这样形成的镜像相当大–至少有 670 MB。
构建器模式(非正式的称呼)使用两个 Docker 镜像–一个执行构建,另一个用于运送第一次构建的结果。
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
golang              1.7.3               ef15416724f6        4 months ago        672MB
Golang 不是唯一可以使用基本镜像来构建的语言。我的一些 Windows 容器同样采用这种模式来构成更小的镜像。
构建器模式的示例:
1.从整个运行时/ SDK(Dockerfile.build)的 Golang 基本镜像导出
2.添加源码
3.生成一个静态链接的二进制文件
4.将静态二进制文件从镜像复制到主机(docker create,docker cp)
5.衍生自SCRATCH或其他一些轻量级镜像,例如alpine
6.添加二进制文件
7.将小镜像推入 Docker Hub
这通常意味着有两个独立的 Dockerfile 和一个 shell 脚本来编排上述 7 个步骤。
示例
以下是我的href-counter存储库中的一个例子,它是一个Golang应用程序,用于计算网页上的内部/外部锚点标签。
我会提供创建小镜像所需要的文件,你可以清晰的明白其中的步骤。
Dockerfile.build
FROM golang:1.7.3

WORKDIR /go/src/github.com/alexellis/href-counter/

RUN go get -d -v golang.org/x/net/html  
COPY app.go    .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
Dockerfile
FROM alpine:latest  
RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY app    .

CMD ["./app"]
build.sh
#!/bin/sh
echo Building alexellis2/href-counter:build

docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \  
    -t alexellis2/href-counter:build . -f Dockerfile.build

docker create --name extract alexellis2/href-counter:build  
docker cp extract:/go/src/github.com/alexellis/href-counter/app ./app  
docker rm -f extract

echo Building alexellis2/href-counter:latest

docker build --no-cache -t alexellis2/href-counter:latest .

什么是多步构建

多步构建可以提供构建器模式的优点,而不需要维护三个独立的文件:
FROM golang:1.7.3

WORKDIR /go/src/github.com/alexellis/href-counter/

RUN go get -d -v golang.org/x/net/html  
COPY app.go    .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=0 /go/src/github.com/alexellis/href-counter/app    .

CMD ["./app"]
这对于开发人员和维护者来说是巨大的,特别是当您支持多种Dockerfiles的不同架构,如Raspberry Pi
一般的语法包括多次在Dockerfile添加FROM语句–最后一个FROM语句是最后的基本镜像。要从中间图像复制伪影和输出,请使用COPY –from= 。
第二个PR优化了这种语法,这意味着你可以做一些像这样的镜像:
FROM golang:1.7.3 as builder

WORKDIR /go/src/github.com/alexellis/href-counter/

RUN go get -d -v golang.org/x/net/html  
COPY app.go    .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=builder /go/src/github.com/alexellis/href-counter/app    .

CMD ["./app"]
这一期的『航海日志』就到这里,下期再浪~
参考链接
  • http://geek.csdn.net/news/detail/230919
  • https://blog.docker.com/2017/08/what-is-containerd-runtime/
  • https://blog.alexellis.io/inject-build-time-vars-golang/
  • https://blog.alexellis.io/mutli-stage-docker-builds/
作者介绍
杨雪颖 Misha:DaoCloud 技术顾问,能文能撸码の通用型选手,兼 Labs 吉祥物。
莫非 Beck:DaoCloud 微服务攻城狮,吃饱了就困的一流段子手。
DaoCloud 公司简介:「DaoCloud 道客」云原生领域的创新领导者,成立于 2014 年底,拥有自主知识产权的核心技术,致力于打造开放的云原生操作系统为企业数字化转型赋能。产品能力覆盖云原生应用的开发、交付、运维全生命周期,并提供公有云、私有云和混合云等多种交付方式。成立迄今,公司已在金融科技、先进制造、智能汽车、零售网点、城市大脑等多个领域深耕,标杆客户包括交通银行、浦发银行、上汽集团、东风汽车、海尔集团、屈臣氏、金拱门(麦当劳)等。目前,公司已完成了 D 轮超亿元融资,被誉为科技领域准独角兽企业。公司在北京、武汉、深圳、成都设立多家分公司及合资公司,总员工人数超过 400 人,是上海市高新技术企业、上海市“科技小巨人”企业和上海市“专精特新”企业,并入选了科创板培育企业名单。

未经允许不得转载:DaoCloud道客博客 » Docker 获 7500 万美元融资,估值达 13 亿美元|航海日志 Vol.24

申请试用