Docker部署Golang服务的实现步骤

 更新时间:2024年01月23日 09:43:19   作者:John_rush  
不管是开发还是生产环境,通过docker方式部署服务都是一种不错的选择,本文主要介绍了Docker部署Golang服务的实现步骤,具有一定的参考价值,感兴趣的可以了解一下

不管是开发还是生产环境,通过 docker 方式部署服务都是一种不错的选择,能够解决不同开发环境一致性的问题。

Dockerfile 构建 Go 运用环境

在项目根目录下添加 Dockerfile 文件:

FROM golang:alpine

# 在容器内部设置环境变量
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 设置后续指令的工作目录
WORKDIR /build

# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件
RUN go build -o go-api .

WORKDIR /dist

RUN cp /build/go-api .

COPY ./config ./config

# 需要运行的命令
ENTRYPOINT ["/dist/go-api", "/dist/config/env.yml"]

如果需要缩小镜像大小,则可以用以下方式进行构建

FROM golang:alpine AS builder

# 在容器内部设置环境变量
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 设置后续指令的工作目录
WORKDIR /build

# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件
RUN go build -o go-api .


# 创建一个小镜像
#FROM scratch
FROM debian:stretch-slim

COPY ./config /config

# 从builder镜像中把 /build/go-api 拷贝到当前目录
COPY --from=builder /build/go-api /

# 需要运行的命令
ENTRYPOINT ["/go-api", "config/env.yml"]

注:镜像scratch没有bash,会导致无法通过docker exec进入容器,建议直接改成debian:stretch-slim镜像

构建 docker 镜像 go-web-app

$ docker build -t go-web-app .

# 查看镜像
$ docker images

启动容器来运行镜像:

$ docker run -p 8888:8088 go-web-app

# 后台启动
$ $ docker run -p 8888:8088 -d go-web-app

# 查看容器
$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                    NAMES
959ee47f203b   go-web-app   "/go-api config/env.…"   23 seconds ago   Up 22 seconds   0.0.0.0:8888->8088/tcp   nostalgic_mclean

标志位-p用来定义端口绑定,容器中go服务端口为 8088,绑定到本机端口 8888,接下来就可以通过http://127.0.0.1:8888进行访问了。

Mysql 容器

拉取 Mysql 镜像:

# 拉取最新版本 mysql,也可以指定版本
$ docker pull mysql:latest

# 查看镜像
$ docker images

运行 Mysql 容器:

$ docker run --name mysql -p 8306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -v ~/docker-data/mysql:/var/lib/mysql -d mysql:latest

# 查看容器
$ docker ps -a
  • --name mysql-latest:容器命名为 mysql-latest
  • -p 8306:3306:映射容器服务的 3306 端口到宿主机的 8306 端口,外部主机可以直接通过 宿主机ip:8306 访问到MySQL服务
  • -e MYSQL_ROOT_PASSWORD=root123456:设置 MySQL 服务 root 用户密码
  • -v /Users/john/docker-data/mysql:/var/lib/mysql:表示将宿主机的/Users/john/docker-data/mysql卷映射到容器里的 /var/lib/mysql卷中,为了把数据保存在宿主机中,防止容器删掉就没了
  • -d:后台运行
  • mysql:latest:使用这个mysql镜像

连通性测试:

进入 docker 容器连接 mysql:

# 进入容器
$ docker exec -it mysql-latest /bin/sh
# 连接 mysql
$ mysql -uroot -proot123456 -h 127.0.0.1 -P3306

或者本机可以通过 navicat 等工具进行连接。

Redis 容器

拉取 Redis 镜像:

$ docker pull redis

# 查看镜像
$ docker images

运行 Redis 容器:

$ docker run --name redis -v ~/docker-data/redis:/usr/local/redis -p 6379:6379 -d redis:latest --requirepass "root123456"

# 查看容器
$ docker ps -a

其他参数同mysql配置,--requirepass 用来设置 Redis 密码

连通性测试:

直接在本地使用 redis-cli 测试 redis 连通性:

> redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> auth root123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

进入容器:

> docker exec -it redis /bin/sh
# redis-cli -p 6379
127.0.0.1:6379> auth root123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
# exit

修改配置

由于要连接不同容器内的数据库,需要修改项目数据库配置HOST地址为容器名,这里以我的项目配置 env.yml为例子:

# MySQL 配置
mysql:
#  host: 127.0.0.1 # 服务器地址
  host: mysql
  port: 3306 # 端口
  db_name: test # 数据库名称
  username: root # 数据库用户名
  password: root123456 # 数据库密码
  ...
  
# Redis 配置
redis:
#  host: 127.0.0.1 # 地址
  host: redis
  port: 6379 # 端口
  db: 0
  password: root123456 # 密码

然后重新 build Go服务镜像:

$ docker build -t go-web-app .

重新启动容器,并使用--link关联Mysql、Redis容器:

$ docker run --name go-api --link=mysql:mysql --link=redis:redis -p 8888:8088 -d go-web-app

注:使用这种方式构建环境,每次都需要单独启动Mysql、Redis、go服务容器,并通过 --link关联容器

到此这篇关于Docker部署Golang服务的实现步骤的文章就介绍到这了,更多相关Docker部署Go服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析docker三种网络模式

    深入解析docker三种网络模式

    这篇文章主要介绍了docker三种网络模式,分别是bridge桥接模式,host主机模式,none无网络模式,每种模式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Docker容器日志查看与清理的方法(亲测有效)

    Docker容器日志查看与清理的方法(亲测有效)

    这篇文章主要介绍了Docker容器日志查看与清理的方法(亲测有效),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • jenkins如何进行自动化部署

    jenkins如何进行自动化部署

    这篇文章主要介绍了jenkins如何进行自动化部署问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 浅谈Docker镜像列表中的none:none是什么

    浅谈Docker镜像列表中的none:none是什么

    这篇文章主要介绍了Docker镜像列表中的none:none问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Docker Dockerfile的使用实例

    Docker Dockerfile的使用实例

    这篇文章主要介绍了Docker Dockerfile的使用实例的相关资料,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • zabbix监控docker应用配置

    zabbix监控docker应用配置

    今天通过本文给大家分享zabbix监控docker容器的原理及部署的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • python脚本在docker上运行的方法

    python脚本在docker上运行的方法

    在本篇文章里小编给各位分享的是关于python脚本在docker上运行的方法内容,有需要的朋友们可以学习下。
    2020-03-03
  • 从零搭建到生产环境配置详解Docker部署MongoDB的完整流程

    从零搭建到生产环境配置详解Docker部署MongoDB的完整流程

    在容器化技术日益普及的今天,使用 Docker 部署 MongoDB 已经成为开发和生产环境的标配方案,本文详细介绍了使用Docker部署MongoDB的全过程,希望可以带大家全面掌握 Docker 部署 MongoDB 的核心技能
    2026-05-05
  • CentOS 7下设置Docker代理(Linux下Systemd服务的环境变量配置)

    CentOS 7下设置Docker代理(Linux下Systemd服务的环境变量配置)

    本文给大家分享Linux下Systemd服务的环境变量配置方法,此示例将覆盖默认docker.service文件,对CentOS 7下设置Docker代理的相关知识感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • docker entrypoint入口文件详解

    docker entrypoint入口文件详解

    这篇文章主要介绍了docker entrypoint入口文件详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论