Docker 的重要性怎么强调都不过分,因为它有助于加快开发人员的入职速度并确保环境的一致性。
使用 Docker 部署 gin 应用程序可能会很棘手。这篇文章有两个部分。这些包括:
-
在 docker 中将卷与 Gin 源代码挂钩
-
使用 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)