Docker

如何直接在 Minikube 內構建容器映像檔

利用 Docker Machine 方式構建映像檔,加速開發不必費時 push & pull images

ta-ching chen

1 minute read

開發流程發生什麼問題

對於一般開發者來說要架設 Kubernetes 是件吃力不討好的事情,自從 minikube 推出後大幅減低進入門檻,讓任何人都可以輕易在電腦上執行本地端的 Kubernetes。minikube 原理是利用 Hyperviosr 在電腦上執行已經安裝好 Kubernetes 的虛擬機,再將 kubelet 的設定指向 minikube 內。

一般開發流程大概是:

  1. 修改程式
  2. 打包成映像檔,送到 remote registry
  3. 更新 pod spec
  4. docker daemon 從 registry 拉最新映像檔

push-pull-image-to-from-remote-registry

透過 Multi-Stage Builds 改善持續交付流程

學習利用 Docker multi-stage builds

ta-ching chen

2 minute read

介紹

製作容器映像檔時有個常見的原則: 映像檔越小越好

但針對編譯式語言 (e.g. go, java),由於映像檔本身包含編譯環境、相依套件導致最終的映像檔十分肥大。在文章「打造最小 Go Docker Image」,我們必須先編譯好所需的 artifacts 再放進 scratch 裡面。可以想見對於一個建構持續交付的流水線 (Continuous Delivery Pipeline) 的開發人員而言,上述步驟會變得過於臃腫與繁雜。

為解決此問題在 Docker 17.05+ 以後提供名為「多階段構建 (multi-stage builds)」的新功能,透過將原先流水線中的多個映像檔整合進同個 Dockerfile 內,而後續的映像檔可透過指令取得中間映像檔 (intermediate image) 所產生的檔案 (artifacts),如此便能讓整個過程更為簡單,也確保流水線簡潔易懂及提高維護性。

Adopting Container and Kubernetes in Production

介紹 VMFive 導入 Kubernetes 的前與後

ta-ching chen

1 minute read

演講投影片

  • 2017 Kubernetes Conf (inwinSTACK)

提問回答

Kubernetes v.s Docker Swarm

Docker Swarm 係由 Docker 官方推出用來管理多運算節點的容器編配器,優點在於安裝簡單但功能陽春。現有大規模部署案例中,並無任何使用 Docker Swarm 的例子,可作為小型環境部署測試,但不建議用於 production 環境。

Kubernetes 使用案例較多,從 Pokemon Go 到大陸京東皆有大規模部署使用案例,且目前單個叢集可支援多達上萬個容器。另外,整個 production 所需功能完善、社群蓬勃發展,較適合用來部署線上 production 環境。

用 ctop 查看 container 狀態

用 Top-like 的方式來查看所有 container 狀態

ta-ching chen

1 minute read

前言

先前一直煩惱沒有比較好的方式來查看每個容器(Container)的資源利用狀態,正好今天看到 GitHub 上出現一個 Top-like 的觀測工具: ctop。使用上來說非常方便,下面會簡單介紹如何使用這款實用的小工具。

安裝

由於 ctop 使用 Go 來開發,因此只要下載 binary 放到對應位置就可以執行了。(目前支援 Linux 以及 macOs)

Linux

$ wget https://github.com/bcicen/ctop/releases/download/v0.4.1/ctop-0.4.1-linux-amd64 -O ctop
$ sudo mv ctop /usr/local/bin/
$ sudo chmod +x /usr/local/bin/ctop

打造最小 Go Docker Image

簡短幾步驟輕鬆打造最小 Docker Image

ta-ching chen

1 minute read

Hello World

先寫個簡單不斷印出 Hello World 的小程式

// main.go
package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Println("Hello World!")
        time.Sleep(1 * time.Second)
    }
}