介绍

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

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

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

 

02 

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​​ 文件当前目录执行。