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. 运行容器
目录
相关文章
|
10天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
39 10
|
7天前
|
人工智能 API 数据库
FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
【9月更文挑战第5天】 FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
 FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
|
17天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
17天前
|
虚拟化 Docker Windows
window 10专业版部署docker环境
本文介绍了如何在Windows 10专业版上部署Docker环境,包括安装步骤、配置镜像加速以及可能遇到的错误处理。
41 2
window 10专业版部署docker环境
|
8天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
10天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
33 10
|
5天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
9天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
7天前
|
存储 监控 数据可视化
Go 语言打造公司监控电脑的思路
在现代企业管理中,监控公司电脑系统对保障信息安全和提升工作效率至关重要。Go 语言凭借其高效性和简洁性,成为构建监控系统的理想选择。本文介绍了使用 Go 语言监控系统资源(如 CPU、内存)和网络活动的方法,并探讨了整合监控数据、设置告警机制及构建可视化界面的策略,以满足企业需求。
24 1
|
14天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。