天天看點

你的第一個容器鏡像,建構、分發、運作映射容器内 80 端到主控端上的 8000 端口curl 一下檢視結果mydemo 可以替換成自己的命名空間

原文作者:木環 原文連結 更多雲原生技術資訊可關注 阿裡巴巴雲原生技術圈

什麼是容器?

因為虛拟機(vm)存在一定不足,容器技術的誕生後才如此受歡迎。以傳統的Java應用架構而言,将一個應用程式生成一個war包,放到一個tomcat容器當中并在一台虛拟機(VM)中啟動運作,然後配置nginx的負載均衡政策,将來自使用者的請求轉發到某個tomcat應用上,這種基于主機或虛拟機部署的應用會存在以下問題:可移植性差、可維護性差、可擴充性差、無法資源隔離。[擴充閱讀]()

而容器是什麼呢?它就是一個視圖隔離、資源可限制、獨立檔案系統的程序集合。所謂“視圖隔離”就是能夠看到部分程序以及具有獨立的主機名等;控制資源使用率則是可以對于記憶體大小以及 CPU 使用個數等進行限制。容器就是一個程序集合,它将系統的其他資源隔離開來,具有自己獨立的資源視圖。

容器具有一個獨立的檔案系統,因為使用的是系統的資源,是以在獨立的檔案系統内不需要具備核心相關的代碼或者工具,我們隻需要提供容器所需的二進制檔案、配置檔案以及依賴即可。隻要容器運作時所需的檔案集合都能夠具備,那麼這個容器就能夠運作起來。

擴充閱讀《詳解 K8s 容器基本概念》

什麼是容器鏡像?

從一個比較具體的角度去看,鏡像就是一個多層存儲的檔案,相較于普通的ISO系統鏡像來說,分層存儲會帶來兩個優點:

  • 一個是分層存儲的鏡像比較容易擴充,比如我們可以基于一個Ubuntu鏡像去建構我們的Nginx鏡像,這樣我們隻需要在Ubuntu鏡像的基礎上面做一些Nginx的安裝配置工作。一個Nginx鏡像工作就算制作完成了,我們不需要從頭開始去制作各種鏡像。
  • 另一點是可以優化鏡像存儲空間,假如我們有兩個鏡像,Tag1.0鏡像和 Tag2.0鏡像,我們如果以傳統方式去傳這兩個鏡像,每個鏡像大概130多兆,但如果我們以分層的方式去存儲兩個鏡像,我們通過下面兩個紫色的才能共享,可以節約大量的空間,兩個鏡像加起來隻需要140多兆的空間就可以存下來。這樣一是節省了存儲空間,二是可以減少網絡上的開銷,比如我們已經把下面鏡像下載下傳了,我們要去下載下傳上面鏡像的時候,我們隻需要去下10M的部分。

如果從抽象的角度去看,Docker鏡像其實是Docker提供的一種标準化的傳遞手段,傳統應用在傳遞的時候其實是傳遞一個可執行文j件。問題在于傳統方式的這個可執行檔案不包括它的運作環境,我們可能會因為32位系統或64位系統,或者開發測試使用1.0軟體,結果傳遞時候發現使用者的環境是2.0等各種各樣的問題,導緻我們要去花時間去排查;但是,如果我們以Docker鏡像的标準化形式去傳遞,我們就會避免掉這些問題。

擴充閱讀《

Docker 鏡像優化與最佳實踐

好了,閑話少叙。下面開始實驗時間。

1. 實驗概述

本實驗會使用 Dockerfile 将下面 golang 代碼建構成鏡像,并通過阿裡雲鏡像服務将鏡像分發到阿裡雲虛拟機,運作該鏡像。

package main
import (
        "fmt"
        "net/http"
)
func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                fmt.Fprintf(w, "Hello! World\n")
        })
        fmt.Println("start to serve...")
        http.ListenAndServe(":80", nil)
}           

2. 實驗目标

完成此實驗後,可以掌握的能力有:

  1. Dockerfile 編寫和使用
  2. 使用阿裡雲鏡像服務來分發鏡像。
NOTE: 學前建議: 了解 docker 的基本操作指令 以及 如何使用 ECS 執行個體。

3. 實驗詳情

3.1 準備應用代碼和 Dockerfile

首先在本地生成一個檔案夾

demo

,并将 golang 代碼拷貝到

demo

檔案夾下的

main.go

.

$ pwd
/tmp/demo
$ ls
main.go
$ cat main.go
package main
import (
        "fmt"
        "net/http"
)
func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                fmt.Fprintf(w, "Hello! World\n")
        })
        fmt.Println("start to serve...")
        http.ListenAndServe(":80", nil)
}           

在目前

demo

目錄下編寫 Dockerfile ,如下所示

$ cat Dockerfile
FROM golang:1.12-alpine
# change current working dir
WORKDIR /go/src/app
# copy main.go into /go/src/app
COPY . .
# go build and install the app
RUN go install -v ./...
# run the app by default
CMD ["app"]           

3.2 建構鏡像

通常情況下,使用以下指令即可建構鏡像

$ pwd
/tmp/demo
# demo:v1 表示鏡像名字demo和标簽v1
$ docker build . -t demo:v1
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM golang:1.12-alpine
 ---> 8ff3fd35cf82
Step 2/5 : WORKDIR /go/src/app
Removing intermediate container ffd88a948413
 ---> 1056ea513b89
Step 3/5 : COPY . .
 ---> 9fc4655c973a
Step 4/5 : RUN go install -v ./...
 ---> Running in 928fc776a6e1
app
Removing intermediate container 928fc776a6e1
 ---> a93f17a3a726
Step 5/5 : CMD ["app"]
 ---> Running in 9e3463aa81f6
Removing intermediate container 9e3463aa81f6
 ---> 8697c7279c74
Successfully built 8697c7279c74
Successfully tagged demo:v1           

NOTE:

在國内通路 Docker Hub 速度比較慢,可以在Docker引擎中設定鏡像加速器加速對Docker Hub的通路。

更新

/etc/docker/daemon.json

,添加如下參數,并重新開機Docker引擎。
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}           

建構完畢之後,可以在本地運作驗證下是否符合預期

映射容器内 80 端到主控端上的 8000 端口

$ docker run -d -p 8000:80 demo:v1
<a name="o6x1Z"></a>           

curl 一下檢視結果

$ curl localhost:8000<br />Hello! World           

如果看到

Hello! World

字樣,我們就可以進入下一個環節了。

3.3 推送鏡像至阿裡雲容器鏡像服務

在推送之前,需要注冊阿裡雲賬号和開通阿裡雲容器鏡像服務

阿裡雲注冊連結: 注冊阿裡雲 阿裡雲登入連結: 登入阿裡雲 阿裡雲容器鏡像服務頁面: 通路阿裡雲容器鏡像服務 容器鏡像服務(Container Registry)提供安全的應用鏡像托管能力,精确的鏡像安全掃描功能,穩定的國内外鏡像建構服務,便捷的鏡像授權功能,友善使用者進行鏡像全生命周期管理。

當我們擁有阿裡雲容器鏡像服務賬号之後呢,可以使用 docker 用戶端來登陸服務。

$ docker login -username=_*_* registry.cn-hangzhou.aliyuncs.com<br />Password:<br />Login Succeeded           

在推送到鏡像之前,需要将本地鏡像修改為對應的鏡像倉庫位址:

mydemo 可以替換成自己的命名空間

$ docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1<br />$ docker push registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1           

3.4 登陸阿裡雲 ECS 機器來下載下傳 demo:v1 鏡像

登陸 ECS 執行個體,通過 docker pull 來下載下傳鏡像

<a name="fwe7n"></a>
# mydemo 請替換成 3.3 步驟中指定的指令空間
$ docker pull registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1           

下載下傳完畢之後,我們就可以直接運作該鏡像

$ docker run -d -p 8000:80 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1           

并檢視 ECS 機器的

8000

端口

$ curl localhost:8000           
阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”

繼續閱讀