前端須要瞭解的 Docker 與 Kubernetes 知識

本文將以一個簡單的示例演示如何使用 Docker 與 Kubernetes 部署應用上線。node

Http Service

首先使用 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

Docker

將 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

Kubernetes 是一種自動化運維工具,本文主要須要瞭解 Pod,Deloyment,Service 三個概念。

  1. Pod 是Kubernetes 最基本的操做單元
  2. Deployment 用於管理Pod
  3. 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 部署應用。

參考

http://www.javashuo.com/article/p-suuacjbh-dv.html
https://github.com/PLDaily/docker

相關文章
相關標籤/搜索