Go 语言怎么使用 Docker 部署项目?

简介: Go 语言怎么使用 Docker 部署项目?

介绍

Go 语言可以使用内置命令行工具 go build 编译生成可执行文件。自 Go1.5 版本开始实现自举后,交叉编译也很方便,只需使用 GOOSGOARCH 环境变量指定目标平台和架构。

部署 Go 项目,只需运行可执行文件,一般有三种方式,分别是使用 nohup 命令、使用 supervisord 进程管理工具、使用 Docker。

本文我们介绍怎么使用 Docker 部署 Go 项目。阅读本文,需要读者朋友们了解 Docker 的基本操作。

web 项目

首先,我们开发一个简单的 Go Web 项目,使用 Go 内置命令行工具 go build 编译生成可执行文件 ./hello

项目目录:

.
├── Dockerfile
├── go.mod
├── hello
├── main.go
└── service.log

我们使用 Go 标准库编写一个 Web 项目,运行编译生成的可执行程序,访问 http://127.0.0.1:8080/hello,输出 hello word

# 编译
go build -o hello
./hello
# 访问
curl http://127.0.0.1:8080/hello
# 输出
hello world

如果使用 curl 访问,可以正常输出 hello world,说明我们程序已正常运行。需要注意的是在我们构建 Docker 镜像之前,我们需要重新使用以下命令,交叉编译生成 linux 平台的可执行程序。

# 编译
GOOS=linux GOARCH=amd64 go build -o hello

在完成以上准备工作之后,我们开始编写 Dockerfile 文件,使该项目可以支持使用 Docker 部署。

Dockerfile 文件:

# 基础镜像
FROM alpine:3.12
# 维护者
MAINTAINER frank
# docker build 时执行命令 - 创建目录
RUN mkdir -p "/data/app" \
&& ln -sf /dev/stdout /data/app/service.log
# 工作目录
WORKDIR "/data/app"
# 拷贝
COPY hello /data/app/hello
# docker run 时执行命令
ENTRYPOINT ["./hello"]

在编写完 Dockerfile 文件之后,我们可以使用 docker 命令构建镜像,前提是我们本机已安装 Docker。

docker build -t hello:v1.0.0 .

运行以上构建 Docker 镜像的命令之后,我们就已成功构建 Docker 镜像。

03

Docker 部署

我们已经构建好了 Docker 镜像,现在可以使用 Docker 部署项目了。

首先,执行 docker images 命令,查看镜像列表。

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hello        v1.0.0    8daaf8297956   11 seconds ago   11.7MB

运行上面命令,我们可以看到我们构建好的镜像名称为 hello 的 Docker 镜像。

然后,我们使用该镜像,运行一个容器。

docker run -d -p 9090:8080 hello:v1.0.0
74f75a374493f21caaf0f2e7f3d14698c3909446c78af6dc1172ac3f9052d839

需要注意的是,我们使用宿主机端口 9090 映射容器端口 8080。其中参数 -d 用于该程序在后台运行,参数 -p 用于映射端口。

查看容器列表:

docker ps -a
CONTAINER ID   IMAGE          COMMAND     CREATED         STATUS         PORTS                    NAMES
74f75a374493   hello:v1.0.0   "./hello"   9 seconds ago   Up 8 seconds   0.0.0.0:9090->8080/tcp   dazzling_ramanujan

执行 docker ps -a 命令,我们可以查看容器列表。

最后,我们使用 curl 访问 http://127.0.0.1:9090/hello,输出 hello world

# 访问
curl http://127.0.0.1:9090/hello
# 输出
hello world

如果使用 curl 访问,可以正常输出 hello world,说明我们已经成功完成使用 Docker 部署 Go 项目。

我们可以使用 docker logs 命令,查看程序日志。

docker logs -f 74
2022/04/09 05:09:08 [info]run success
2022/04/09 05:09:21 [info]run success
2022/04/09 05:09:21 [info]run success
2022/04/09 05:09:22 [info]run success

我们可以使用 docker exec 命令进入容器中,查看项目文件。

docker exec -it 74 /bin/sh
/data/app # ls -al
total 5948
drwxr-xr-x    1 root     root          4096 Apr  9 05:07 .
drwxr-xr-x    1 root     root          4096 Apr  9 05:07 ..
-rwxr-xr-x    1 root     root       6075093 Apr  9 04:12 hello
lrwxrwxrwx    1 root     root            11 Apr  9 05:07 service.log -> /dev/stdout
/data/app #

04

Docker 容器管理工具 docker compose

使用 Docker 部署 Go 项目,我们需要先使用 docker build 命令构建 Docker 镜像,然后使用 docker run 命令运行容器,并且命令后面一般还需要一些参数,操作多少有些繁琐。

我们可以使用 Docker 容器管理工具 docker compose 解决此问题。读者朋友们如果不了解 docker compose,请自行查阅相关资料,限于篇幅,本文不再赘述。

我们主要介绍怎么将 docker compose 和 Dockerfile 配合使用,管理容器和镜像。

我们需要创建一个 docker-compose.yml 文件,在该文件中配置运行容器需要的命令和参数。

docker-compose.yml 文件:

version: '3.8'
services:
  webapp:
    restart: always # Docker 重启时,容器也重启
    build: # 构建 Docker 镜像
      context: ./ # Dockerfile 文件的目录
      dockerfile: Dockerfile # Dockerfile 文件的名称
    image: hello:1.0.0 # 镜像名称和版本号
    container_name: hello # 容器名称
    ports: # 宿主机和容器之间映射端口
      - "9090:8080"

在编写完 docker-compose.yml 文件之后,我们可以使用 docker-compose 命令行工具管理容器。

# 启动容器
docker-compose up -d
# 查看容器列表
docker-compose ps
# 查看日志
docker-compose -f
# 关闭容器
docker-compose stop
# 启动容器
docker-compose start
# 重启容器
docker-compose restart
# 关闭并删除容器
docker-compose down

需要注意的是,使用 docker-compose 命令行工具,需要在 docker-compose.yml 文件当前目录执行。

05

总结

本文我们介绍怎么使用 Docker 部署 Go 项目,并且介绍 Docker 容器管理工具 docker compose 的简单使用,关于 docker 和 docker compose 的更多介绍,感兴趣的读者朋友们可以自行查阅资料。

使用 Docker 部署 Go 项目,主要共分为四步:

  1. 交叉编译
  2. 编写 Dockfile 文件
  3. 构建镜像
  4. 运行容器
目录
相关文章
|
8月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1398 162
|
7月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
391 2
|
9月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
595 1
|
10月前
|
监控 Java 编译器
限流、控并发、减GC!一文搞懂Go项目资源优化的正确姿势
本章介绍Go语言项目在构建与部署阶段的性能调优和资源控制策略,涵盖编译优化、程序性能提升、并发与系统资源管理、容器化部署及自动化测试等内容,助力开发者打造高效稳定的生产级应用。
|
10月前
|
测试技术 Go 开发工具
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
Go语言项目工程化实践中的开发工具与CI/CD支持,涵盖格式化、静态检查、依赖管理、构建打包、自动化测试及部署策略。内容包括常用工具如gofmt、go vet、golangci-lint、Docker、GitHub Actions等,并提供实战建议与总结,提升团队协作效率与项目质量。
|
10月前
|
人工智能 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
持续集成与持续部署(CI/CD)是现代软件开发的关键实践,尤其适用于Go语言项目。本文探讨了Go项目中常见的CI/CD问题,如测试覆盖不足、版本不一致和构建时间过长,并提供解决方案及GitHub Actions示例代码,帮助开发者优化流程,提升交付效率和质量。
321 5
|
10月前
|
NoSQL 中间件 Go
Go语言项目工程化 — 项目结构与模块划分
本章讲解Go语言项目工程化中的结构设计与模块划分,涵盖单体及分层架构方案,指导如何按功能组织代码,提升项目的可维护性、扩展性,适用于不同规模的开发场景。
|
9月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
607 0
|
9月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
427 0
|
9月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
469 0

热门文章

最新文章