Docker 獲 7500 萬美元融資,估值達 13 億美元|航海日誌 Vol.24

DaoCloud發表於2019-02-15

Docker 獲 7500 萬美元融資,估值達 13 億美元|航海日誌 Vol.24

➤ Docker 獲 7500 萬美元融資,估值達 13 億美元

Docker 獲 7500 萬美元融資,估值達 13 億美元|航海日誌 Vol.24


企業軟體公司 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 已成為容器編排事實標準?

Docker 獲 7500 萬美元融資,估值達 13 億美元|航海日誌 Vol.24

就在微軟上週剛剛宣佈加入 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 微服務攻城獅,吃飽了就困的一流段子手。


點這裡,回顧船長的過去

Docker 獲 7500 萬美元融資,估值達 13 億美元|航海日誌 Vol.24


相關文章