分享
  1. 首页
  2. 文章

在 Go 语言项目中使用 Docker

line · · 1521 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

原文链接:在 Go 语言项目中使用 Docker

容器(Container) 将程序及其所需的任何内容捆绑在一起,包括依赖项、工具和配置文件等等。这样使得程序不受环境的干扰,真正意义上做到开发环境和生成环境完全一致。

而 Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。与传统虚拟机相比,Docker 也有许多优点,如:更高效的系统资源利用和更快速的启动时间。

在本文中,通过一个简单的 Go 语言项目,您将学习如何在 Go 语言项目中使用 Docker。

Golang and Docker logo

创建一个简单的 Go 语言项目

让我们来创建一个作为示例的 Go 语言项目。在命令行下输入以下命令以创建文件夹:

mkdir gdp

我们将使用 Go Module 进行依赖性管理。转到项目的根目录,然后初始化 Go Module:

cd gdp
go mod init github.com/linehk/gdp

我们将创建一个简单的 hello 服务器。在项目根目录中创建一个名为 hello_server.go 的新文件:

touch hello_server.go

文件内容如下:

package main
import (
 "fmt"
 "log"
 "net/http"
 "time"
 "github.com/gorilla/mux"
)
func handler(w http.ResponseWriter, r *http.Request) {
 query := r.URL.Query()
 name := query.Get("name")
 if name == "" {
 name = "Guest"
 }
 log.Printf("Received request for %s.\n", name)
 w.Write([]byte(fmt.Sprintf("Hello, %s!\n", name)))
}
func main() {
 r := mux.NewRouter()
 r.HandleFunc("/", handler)
 server := &http.Server{
 Handler: r,
 Addr: ":8080",
 ReadTimeout: 10 * time.Second,
 WriteTimeout: 10 * time.Second,
 }
 log.Println("Starting Server.")
 if err := server.ListenAndServe(); err != nil {
 log.Fatal(err)
 }
}

该项目使用 gorilla/mux 包来创建 HTTP 路由(导入包是为了展示 Docker 容器捆绑依赖项的作用),地址是 localhost:8080

尝试在本地编译并运行项目

让我们先尝试在本地编译和运行项目。可以在项目根目录输入以下命令来编译项目:

go build

go build 命令将会生成一个名为 gdp 的可执行文件。可以像这样运行该文件:

./gdp
2020年08月19日 21:33:49 Starting Server.

我们的 hello 服务器现在正在运行,可以尝试使用 curl 或其它工具与其交互:

curl http://localhost:8080
Hello, Guest!
curl http://localhost:8080?name=sulinehk
Hello, sulinehk!

编写 Dockerfile 定义 Docker 镜像

让我们来为这个项目编写 Dockerfile,在根目录创建文件名为 Dockerfile 的文件,内容如下:

# 拉取 Go 语言最新的基础镜像
FROM golang:latest
# 在容器内设置 /app 为当前工作目录
WORKDIR /app
# 把文件复制到当前工作目录
COPY . .
# 设置 GOPROXY 环境变量
ENV GOPROXY="https://goproxy.cn"
# 下载全部依赖项
RUN go mod download
# 编译项目
RUN go build -o gdp .
# 暴露 8080 端口
EXPOSE 8080
# 执行可执行文件
CMD ["./gdp"]

构建镜像和运行容器

镜像(Image) 是实际的软件分发包,其中包含运行应用程序所需的所有内容。

而容器根据镜像构建,是镜像的运行示例,类似 Go 语言中结构体定义和结构体变量之间的关系。

  • 构建镜像:
docker build -t gdp .
  • 运行容器:
docker run -d -p 8080:8080 gdp
aa6a1afbe1b13ad0b0d1d656e157f762c5fe2229a8e0d95a025df26396ffc08f
  • 与容器内运行的服务器交互:
curl http://localhost:8080
Hello, Guest!
curl http://localhost:8080?name=sulinehk
Hello, sulinehk!

下面是一些其它的 Docker 命令:

Docker 命令

总结

可以看出,一个定义良好的 Dockfile 文件在整个流程中起到承上启下的作用。

Dockerfile

参考链接

Docker — 从入门到实践

Docker Documentation


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:line

查看原文:在 Go 语言项目中使用 Docker

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1521 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏