Docker 的重要性怎么强调都不过分,因为它有助于加快开发人员的入职速度并确保环境的一致性。

使用 Docker 部署 gin 应用程序可能会很棘手。这篇文章有两个部分。这些包括:

  1. 在 docker 中将卷与 Gin 源代码挂钩

  2. 使用 Dockerfile 为 Gin 应用程序构建一个 docker 镜像

N.B :您的机器上必须安装 golang。

在 docker 中将卷与 Gin 源代码挂钩

卷是保存 Docker 容器生成和使用的数据的首选机制。

与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外。因此,一个卷可以在多个容器之间共享

我们将使用此示例存储库。将此存储库克隆到本地计算机上的 $GOPATH。

要对 Go 应用程序进行 dockerize,您需要 golang docker image 来实现此目的。您可以使用以下命令从 docker hub 拉取 golang 映像:

docker pull golang

导航到您克隆存储库的 $GOPATH。然后运行这个命令:

docker run -d -p 3005:3004 -v $(pwd):/go/src -w "/go/src/go-docker-dev.to" golang go run go-docker-dev.to/src/app

上面的命令从 golang 镜像创建并启动一个容器。

-v $(pwd):/go/src 将当前工作目录上的文件/目录挂载到容器中的 $GOPATH /go/src

go run go-docker-dev.to/src/app 运行 go 应用程序。

-p 3005:3004 将暴露的 3004 端口绑定到 3005 端口上的 docker 主机

-w "/go/src/go-docker-dev.to" 指定容器中的工作目录

您可以使用 docker ps -a 检查创建的容器的状态。应该起来了。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--fLSP26LN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com /zeed/image/upload/v1588538850/Screen_Shot_2020-05-03_at_9.42.53_PM.png)

确认容器状态为 up 后,在浏览器上启动http://localhost:3005。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--YmDHj7vk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com /zeed/image/upload/v1588539341/Screen_Shot_2020-05-03_at_9.53.54_PM.png)

使用 Dockerfile 为 Gin 应用程序构建 docker 映像

在本节中,我们将创建一个自定义 docker 镜像,它将使用来自 docker hub 的 golang docker 镜像作为基础镜像。要创建它,请在项目目录中创建一个 Dockerfile。

建议将项目中使用的所有必要的 go 依赖项复制到项目目录的子目录中。这是为了节省创建映像时用于安装依赖项的时间。

出于本文的目的,我们将把该项目所需的依赖项从 $GOPATH/src 复制到项目目录中的子目录(依赖项)。

请参阅下面的示例 Dockerfile:

FROM golang:alpine

MAINTAINER Maintainer

ENV GIN_MODE=release
ENV PORT=3004

WORKDIR /go/src/go-docker-dev.to

COPY src /go/src/go-docker-dev.to/src
COPY templates /go/src/go-docker-dev.to/templates

# Run the two commands below to install git and dependencies for the project. 
# RUN apk update && apk add --no-cache git
# RUN go get ./...

COPY dependencies /go/src #if you don't want to pull dependencies from git 

RUN go build go-docker-dev.to/src/app

EXPOSE $PORT

ENTRYPOINT ["./app"]

FROM golang:alpine 表示要使用的基础镜像,即 golang

MAINTAINER Maintainer 指定应用程序的维护者。它可以是姓名、用户名或电子邮件地址。

ENV GIN_MODEu003drelease 设置 GIN_MODE 环境变量

ENV PORTu003d3004 设置端口环境变量

WORKDIR /go/src/go-docker-dev.to 设置容器工作目录

COPY src /go/src/go-docker-dev.to/src 将src目录从主机复制到镜像

COPY templates /go/src/go-docker-dev.to/templates 将模板目录从主机复制到镜像

RUN apk update && apk add --no-cache git 这会在环境中安装 git,因为需要 git 来拉取 go 依赖项

RUN go get ./... 这递归地拉取所需的 go 依赖项。

COPY dependencies /go/src 将需要的依赖复制到镜像的$GOPATH

RUN go build go-docker-dev.to/src/app 这将构建应用程序。

EXPOSE $PORT 这会将容器端口暴露给主机

ENTRYPOINT ["./app"] 这定义了容器启动时应用程序的入口点。它执行 go 应用程序。

在项目目录中,执行以下命令:

docker build -t go-docker-dev.to-gin  .

您将看到构建的日志,如下所示

[](https://res.cloudinary.com/practicaldev/image/fetch/s--hEP_IHnZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com /zeed/image/upload/v1588688089/Screen_Shot_2020-05-05_at_3.12.34_PM.png)

成功创建映像后,您可以使用以下命令启动容器以运行应用程序:

docker run -d -p 3006:3004 go-docker-dev.to-gin

然后,您可以在浏览器上启动 localhost:3006 以确认它已启动并正在运行。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--K1q9RhgL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com /zeed/image/upload/v1588542588/Screen_Shot_2020-05-03_at_10.49.27_PM.png)