使用Docker来运行通过Go编写的Web应用程序
总结
我将在Docker上部署用Golang编写的API。
关于这个API:我用Golang编写了一个简单的RESTful API。
样品在这里
准备一个Dockerfile
FROM golang:latest
WORKDIR /app
ADD . /app/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags="-s -w" -installsuffix cgo -o hello main.go
CMD ["./hello"]
准备Docker Compose文件
version: "3.1"
services:
api:
build: .
ports:
- 1323:1323
environment:
DATA_SOURCE_NAME: root:root@tcp(db:3306)/sample
PORT: :1323
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: sample
volumes:
- ./migration:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
开动
由于所需的容器创建所需文件已准备齐全,进行构建并启动。
$ docker-compose up --build -d
确认图像是否被创建
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld_api latest eaa02e55c990 11 seconds ago 908MB
确认是否执行成功
$ curl http://127.0.0.1:1323/users/1
{"ID":1,"Name":"suzuki"}
压缩图像大小
为了减小图像大小,使用alpine。
因为有多阶段构建功能,所以使用它。
确保以下有两个FROM,并对中间阶段的内容进行命名,如builder。
FROM golang:alpine as builder
WORKDIR /app
ADD . /app/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags="-s -w" -installsuffix cgo -o hello main.go
FROM alpine:latest
COPY --from=builder /app/hello /bin/hello
CMD ["/bin/hello"]
搭建并确认图像。
$ docker-compose build
...
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld_api latest 0dada9b8827e 25 seconds ago 12.2MB
908MB → 12.2MB!
减少约98.6%!
额外赠品
进一步缩小图像
基于一个没有任何内容的图像scratch,将静态链接的二进制文件放置在其中。
※ 在使用时需要注意证书、时区等。
当使用Go和Docker中的scratch时需要注意的事项。
FROM golang:alpine as builder
WORKDIR /app
ADD . /app/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags="-s -w" -installsuffix cgo -o hello main.go
FROM scratch
COPY --from=builder /app/hello /bin/hello
CMD ["/bin/hello"]
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld_api latest d96e6246972c 8 seconds ago 6.6MB
使用UPX进行更进一步的压缩
FROM golang:alpine as builder
RUN apk --update add upx
WORKDIR /app
ADD . /app/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags="-s -w" -installsuffix cgo -o hello main.go &&\
upx /app/hello
FROM scratch
COPY --from=builder /app/hello /bin/hello
CMD ["/bin/hello"]
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld_api latest 0b7c833abf5c 9 seconds ago 2.58MB
イメージサイズ1つ上からの削減率golangからの削減率golang908MB–alpine12.2MB98.6%98.6%scratch6.6MB45.9%99.2%scratch & upx2.58MB60.9%99.7%
真的变得好小啊,哈哈