Docker部署Golang服务的实现步骤
作者: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服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!