no-image

Golang的docker嘗試

                                    

一、 前言

docker 就不在這裡介紹了,相關的文件已經很完善,中文文件 Docker —— 從入門到實踐 寫的很棒,推薦去看看。

docker 基於 Golang 開發,已經不用解釋了,而 Golang 天生適合執行在 docker 容器中,卻不是這個原因,這得益於:Golang 的靜態編譯,當在編譯的時候關閉 cgo 的時候,可以完全不依賴系統環境。

二、 Golang程式碼

我們打算在 docker 中測試 Golang ,所以先編寫一個 Golang 的測試程式碼。

新建檔案:vi main.go

scratch 是一個特殊的映象,它是一個虛擬映象,也就是一個空白映象;利用Golang的靜態化編譯無依賴性,可以大幅度減少編譯時間和映象大小。

1) 編譯Golang

基於scratch必須先打包,然後才能進行執行。

GOOS=linux 是將交叉編譯的目標設定為Linux,這樣你在Mac或者Win下也不會出現問題。
cgo 是為了在靜態編譯中匯入net

2) 編輯dockerfile

修改檔案:vi dockerfile

scratch和golang:latest的大小差了730多兆。。。。

4) 空白映象掛載檔案

啟動映象

sudo docker run -it --rm --name my-golang-scratch golang-scratch-app

你會發現提示:

Get https://www.baidu.com: x509: failed to load system roots and no roots provided

這是一個非常常見的問題:為了進行SSL請求,我們需要SSL根證書。

5) 掛載檔案

根據作業系統,這些證書可以在許多不同的地方。如果您檢視Gox509庫,可以檢視Go搜尋的所有位置。對於許多Linux發行版,這是/etc/ssl/certs/cacert.pem。首先,我們將把我們的機器(或Linux VM線上證書提供者)的cacert.pem複製到我們的儲存庫中。然後,我們將在Docker檔案中新增一個ADD,將這個檔案放在Go所期望的位置:

下載 cacert.pem 到當前工作目錄:

wget https://curl.haxx.se/ca/cacert.pem

再次編輯dockerfile

FROM scratch
ADD cacert.pem /etc/ssl/certs/
ADD main /
CMD ["/main"]

6) 執行映象

sudo docker run -it --rm --name my-golang-scratch golang-scratch-app

輸入圖片說明

完美執行!

四、 關鍵點

  • Dockerfile 指令詳情
  • 映象編譯命令: sudo docker build -t golang-latest-app . => golang-latest-app 為映象名
  • 容器啟動命令: sudo docker run -it --rm --name my-golang-app golang-latest-app => my-golang-app 為容器名,golang-latest-app 為映象名
  • Golang的靜態編譯: CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

五、 連結

  1. Building Minimal Docker Containers for Go Applications
  2. [建立超小的Golang docker 映象](http://colobu.com/2015/10/12/create-minimal-golang-docker-images/

關聯文章