本文将以一个简单的示例演示如何使用 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。