使用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%

真的变得好小啊,哈哈

bannerAds