Skip to content

Commit

Permalink
[container] refactor: use golang http server default port 3000
Browse files Browse the repository at this point in the history
  • Loading branch information
guangzhengli committed Aug 23, 2022
1 parent 75b2e51 commit aa95043
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 17 deletions.
67 changes: 52 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,40 +109,77 @@ docker login

## Container

```ruby
# app.rb
require "sinatra"
新建一个 `main.go` 的 golang 文件,里面写的是 `v1` 版本的代码,逻辑很简单,创建一个 `http server`,调用配置端口 `3000` 返回字符串 `[v1] Hello, Kubernetes!`

set :bind, "0.0.0.0"
```go
package main

get "*" do
"[v1] Hello, Kubernetes!\n"
end
import (
"io"
"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "[v1] Hello, Kubernetes!")
}

func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":3000", nil)
}
```

接下来我们编写 `Dockerfile` 文件,简单的方案当然是直接使用 golang 的 alpine 镜像来打包,但是因为我们后续练习需要频繁的 push image 到 dockerhub 和 pull image 到 kubenates 中,为了优化网络速度,可以先在 `golang:1.16-buster` 中将上述代码编译成二进制文件,再将二进制文件复制到 `base-debian10` 镜像中运行。

这样我们可以将 300MB~500MB 大小的镜像变成只有 20MB 的镜像,甚至压缩上传到 DockerHub 后大小只有 10MB。

```dockerfile
# Dockerfile
FROM ruby:2.6.1-alpine3.9
FROM golang:1.16-buster AS builder
RUN mkdir /src
ADD . /src
WORKDIR /src

RUN apk add curl && gem install sinatra
COPY app.rb .
ENTRYPOINT ["ruby", "app.rb"]
```
RUN go env -w GO111MODULE=auto
RUN go build -o main .

FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=builder /src/main /main
EXPOSE 3000
ENTRYPOINT ["/main"]
```

执行 `docker build` 命令,第一次需要先 pull base images,需要耐心等待一会。

需要注意将 `guangzhengli` 替换成自己的 `DockerHub` 账号名称。 这样我们后续可以 push image 到我们自己的 `DockerHub` 仓库当中。

```shell
docker build . -t guangzhengli/hellok8s:v1
```

```
docker run -p 4567:4567 --name hellok8s -d guangzhengli/hellok8s:v1
```
`docker build` 完成后我们可以通过 `docker images` 查看镜像基础信息,执行 `docker run` 命令将容器启动, `-p` 指定 `8080` 作为端口,`-d` 指定刚打包成功的镜像名称。

```shell
docker run -p 3000:3000 --name hellok8s -d guangzhengli/hellok8s:v1
```

运行成功后,可以通过浏览器或者 `curl` 来访问 `http://127.0.0.1:8080` , 查看是否成功返回字符串 `[v1] Hello, Kubernetes!`

这里因为我的 docker runtime 是使用 `minikube`,所以我需要先调用 `minikube ip` 来或者 IP 地址,例如这里返回了 `192.168.59.100`,所以我需要访问 `http://192.168.59.100:3000` 来判断是否成功返回字符串 `[v1] Hello, Kubernetes!`

```shell
docker push guangzhengli/hellok8s:v1
```

最后确认没有问题,`docker push` 将镜像上传到远程的 `DockerHub` 仓库当中,这样可以供他人下载使用,也方便后续 `Minikube` 下载镜像使用。

## Pod

关于 `pod` 的练习,我们先来练习下[官网的例子](https://kubernetes.io/docs/concepts/workloads/pods/)

```yaml
# nginx.yaml
apiVersion: v1
Expand Down
2 changes: 1 addition & 1 deletion container/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ FROM gcr.io/distroless/base-debian10
WORKDIR /

COPY --from=builder /src/main /main
EXPOSE 8080
EXPOSE 3000
ENTRYPOINT ["/main"]
2 changes: 1 addition & 1 deletion container/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ func hello(w http.ResponseWriter, r *http.Request) {

func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8080", nil)
http.ListenAndServe(":3000", nil)
}

0 comments on commit aa95043

Please sign in to comment.