k8s(三)Docker 简单使用

99 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

Build,Ship and Run Any App,Anywhere

docker安装

docker的安装不在本节的重点范围之内。

  1. win参考:docker 安装
  2. linux直接yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15一条命令搞定

dokcer实操

构建镜像

部署一个Go项目,该项目有一个接口/返回ok

FROM golang:alpine AS builder

RUN mkdir /app

WORKDIR /app

COPY . .

RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod tidy

Run go build main.go -o demo-gin
 
CMD ["./demo-gin"]

会发现他非常的大,足足有300M,这显然不符合我们的预期。

究其原因是基础镜像太大了,如果想要这个镜像变小应该怎么做?

那么我们可以先构建好,再将构建好的程序放到我们最终的容器中就可以了。这里有两种方法:

  • 可以自己编译,再打包,这样一致性不太好,因为如果你在win中编译的放在linux并不能用;
  • 在打包之前用一个拿一个镜像来编译,编译后复制到最终的镜像内

所以果断采取第二种方法:

FROM golang:alpine AS builder

RUN mkdir /app

WORKDIR /app

COPY . .

RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod tidy


Run go build main.go -o demo-gin



FROM alpine
 
WORKDIR /app
COPY --from=builder /app/demo-gin /app/demo-gin
 
CMD ["./demo-gin"]

在项目目录下使用docker build进行编译:

[root@master demo-gin]# docker build -t demo-gin .
Sending build context to Docker daemon  9.728kB
Step 1/11 : FROM golang:alpine AS builder
 ---> dd6fd110e957
Step 2/11 : RUN mkdir /app
 ---> Using cache
 ---> 0b6745385c76
Step 3/11 : WORKDIR /app
 ---> Using cache
 ---> 244a453fc1b5
Step 4/11 : COPY . .
 ---> 8238e479ac95
Step 5/11 : RUN go env -w GOPROXY=https://goproxy.cn,direct
 ---> Running in b3ba7bddda82
Removing intermediate container b3ba7bddda82
 ---> f6705d03f979
Step 6/11 : RUN go mod tidy
 ---> Running in 32537fd42323
go: downloading github.com/gin-gonic/gin v1.7.7
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading github.com/golang/protobuf v1.3.3
go: downloading github.com/stretchr/testify v1.4.0
go: downloading github.com/json-iterator/go v1.1.9
go: downloading github.com/go-playground/validator/v10 v10.4.1
go: downloading github.com/ugorji/go/codec v1.1.7
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading golang.org/x/sys v0.0.0-20200116001909-b77594299b42
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421
go: downloading github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742
go: downloading github.com/go-playground/universal-translator v0.17.0
go: downloading github.com/leodido/go-urn v1.2.0
go: downloading github.com/ugorji/go v1.1.7
go: downloading golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
go: downloading github.com/go-playground/assert/v2 v2.0.1
go: downloading github.com/go-playground/locales v0.13.0
go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405

Removing intermediate container 32537fd42323
 ---> d117b4852e6a
Step 7/11 : Run go build -o demo-gin main.go
 ---> Running in 5acd88af4878
Removing intermediate container 5acd88af4878
 ---> f4153d9c7a5e
Step 8/11 : FROM alpine
latest: Pulling from library/alpine
df9b9388f04a: Already exists 
Digest: sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454
Status: Downloaded newer image for alpine:latest
 ---> 0ac33e5f5afa
Step 9/11 : WORKDIR /app
 ---> Running in 55c0e0652368
Removing intermediate container 55c0e0652368
 ---> 88534de5b753
Step 10/11 : COPY --from=builder /app/demo-gin /app/demo-gin
 ---> 229f0992f605
Step 11/11 : CMD ["./demo-gin"]
 ---> Running in e6ac1b4bbc1d
Removing intermediate container e6ac1b4bbc1d
 ---> 74b0086fe7c6
Successfully built 74b0086fe7c6
Successfully tagged demo-gin:latest

docker build 操作完成后,我可以通过 docker images 命令查看结果:

[root@master demo-gin]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
demo-gin     latest    74b0086fe7c6   1 minutes ago   14.8MB

最终镜像大小只有14.8MB。接下来,我使用这个镜像,通过 docker run 命令启动容器:

[root@master demo-gin]# docker run -p 3001:8080 demo-gin
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (1 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080

同时,使用-p 3001:8080参数将容器内的8080端口映射到宿主机器上的3001端口,这样就可以通过宿主机器的3001端口访问容器的8080端口。

后台运行

如果需要后台运行,在run后面加上 -d 参数即可

随后通过暴露的端口访问。

lomtom@atongmudeMacBook ~ % curl http://8.16.0.67:3001
"ok"%