前端需要了解的 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
将 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