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