前端需要了解的 Docker 与 Kubernetes 知识

本文将以一个简单的示例演示如何使用 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 与 Kubernetes 知识

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构建。
前端需要了解的 Docker 与 Kubernetes 知识

由上图可以看出除了我们拉取的 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 与 Kubernetes 知识

推送

执行 docker tag 43f7215dd448 pldaily/go:helloworld 给我们的 go 镜像打一个 tag,执行 docker push pldaily/go 将你的 go 镜像推到 DockerHub。此处以我的账号为例,需要推送到你自己的账号。
前端需要了解的 Docker 与 Kubernetes 知识

部署

执行 docker rm -f go 删除之前生成的 go 实例,执行 docker run -d -p 80:8080 --name go go 将服务器 80 端口映射到 docker 内部 8080 端口,如果需要可再通过 nginx 反向代理实现部署。
前端需要了解的 Docker 与 Kubernetes 知识

虽然这样也能达到部署的目的,但是 docker 实例进程与 nginx 均需要自己维护,让我们看下 Kubernetes 能帮我们做些什么。

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。
前端需要了解的 Docker 与 Kubernetes 知识

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 将端口暴露出来。
前端需要了解的 Docker 与 Kubernetes 知识

至此成功使用 Kubernetes 部署应用。

参考

https://my.oschina.net/u/2306127/blog/1647246
https://github.com/PLDaily/docker

相关推荐