本文將以一個簡單的示例演示如何使用 Docker 與 Kubernetes 部署應用上線。node
首先使用 Go 語言搭建一個簡單的 Http 服務,監聽 8080 端口。nginx
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 服務沒有問題。git
將 Http 服務打包成 Docker 鏡像,而後將鏡像實例化並運行,方便部署。github
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
由上圖能夠看出除了咱們拉取的 golang 鏡像還多出了咱們本身構建的 go 鏡像。docker
建立一個 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
。api
執行 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 能幫咱們作些什麼。session
Kubernetes 是一種自動化運維工具,本文主要須要瞭解 Pod,Deloyment,Service 三個概念。
Minikube 是一個輕量級的 Kubernetes 實現,會在本機建立一臺虛擬機,並部署一個只包含一個節點的簡單集羣。因爲國內網絡問題,推薦使用阿里雲鏡像的 Minikube。本地若是搭建有問題,能夠使用Play with Kubernetes。
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。
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 部署應用。
http://www.javashuo.com/article/p-suuacjbh-dv.html
https://github.com/PLDaily/docker