持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
Build,Ship and Run Any App,Anywhere
docker安装
docker的安装不在本节的重点范围之内。
- win参考:docker 安装
- 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"%