本文將以一個簡單的示例演示如何使用 Docker 與 Kubernetes 部署應用上線。
Http Service
首先使用 Go 語言搭建一個簡單的 Http 服務,監聽 8080 端口。
main.go
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World")
})
http.ListenAndServe(":8080", nil)
}
打開終端執行 go run main.go
,再開一個終端輸入 curl http://127.0.0.1:8080
輸出 Hello,World
則表示該 Http 服務沒有問題。
Docker
將 Http 服務打包成 Docker 鏡像,然後將鏡像實例化並運行,方便部署。
構建
Dockerfile
# 拉取 golang 鏡像,提供程序運行環境
FROM golang:1.11
# 創建 code 目錄,存放 golang 代碼
RUN mkdir /code
# 將當前目錄下的文件拷貝到 docker 中的 code 目錄
COPY . /code/
# 將 code 目錄設爲工作區
WORKDIR /code
# 編譯 go 文件,輸入名字爲 main 的二進制文件
RUN go build -o main .
# 執行 code 目錄下 main 的二進制文件
ENTRYPOINT ["/code/main"]
執行 docker build -f ./Dockerfile -t go .
構建名字爲 go 的鏡像。本地從 DockerHub 上拉取鏡像慢,推薦使Play with Docker構建。
由上圖可以看出除了我們拉取的 golang 鏡像還多出了我們自己構建的 go 鏡像。
驗證
創建一個 go 鏡像的實例看下我們的 Http 服務是否已經啓動,執行 docker run -dt --name go go
基於 go 鏡像創建一個 go 的實例,執行 docker exec -it go sh
進入到 go 實例,執行 curl http://127.0.0.1:8080
查看是否輸入 Hello,World
。
推送
執行 docker tag 43f7215dd448 pldaily/go:helloworld
給我們的 go 鏡像打一個 tag,執行 docker push pldaily/go
將你的 go 鏡像推到 DockerHub。此處以我的賬號爲例,需要推送到你自己的賬號。
部署
執行 docker rm -f go
刪除之前生成的 go 實例,執行 docker run -d -p 80:8080 --name go go
將服務器 80 端口映射到 docker 內部 8080 端口,如果需要可再通過 nginx 反向代理實現部署。
雖然這樣也能達到部署的目的,但是 docker 實例進程與 nginx 均需要自己維護,讓我們看下 Kubernetes 能幫我們做些什麼。
Kubernetes
Kubernetes 是一種自動化運維工具,本文主要需要了解 Pod,Deloyment,Service 三個概念。
- Pod 是Kubernetes 最基本的操作單元
- Deployment 用於管理Pod
- Service 提供 Pod 的對外訪問接口
Minikube
Minikube 是一個輕量級的 Kubernetes 實現,會在本機創建一臺虛擬機,並部署一個只包含一個節點的簡單集羣。由於國內網絡問題,推薦使用阿里雲鏡像的 Minikube。本地如果搭建有問題,可以使用Play with Kubernetes。
Deployment
go-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-deployment
labels:
app: go
spec:
# 起 3 個replicated Pods
replicas: 3
# 哪個 pod 被管理
selector:
matchLabels:
app: go
# 運行的容器
template:
metadata:
labels:
app: go
spec:
containers:
- name: go
# 要拉取的鏡像
image: pldaily/go:helloworld
ports:
# 暴露的端口
- containerPort: 8080
執行 kubctl create -f go-deployment.yaml
創建 Deployment,該 Deployment 會啓 3個 replicated Pods。
Service
go-service.yaml
apiVersion: v1
kind: Service
metadata:
name: go-service
spec:
type: NodePort
sessionAffinity: ClientIP
selector:
app: go
ports:
# svc 暴露的端口
- port: 8080
# 對外暴露的端口
nodePort: 30081
執行 kubctl create -f go-service.yaml
啓一個 service 將端口暴露出來。
至此成功使用 Kubernetes 部署應用。
參考
https://my.oschina.net/u/2306127/blog/1647246
https://github.com/PLDaily/docker