1、学习课程
带你十天轻松搞定 Go 微服务系列(一)
2、个人环境
Ubuntu 20.04.4
docker-compose version 1.21.2, build a133471
3、步骤
3.1 安装Docker Compose
apt install docker-compose
3.2 创建目录 mkdir 与 touch 命令 创建如下目录:
gonivinck
├── dtm# DTM 分布式事务管理器
│├── config.yml# DTM 配置文件
│└── Dockerfile
├── etcd# Etcd 服务注册发现
│└── Dockerfile
├── golang# Golang 运行环境
│└── Dockerfile
├── grafana# Grafana 可视化数据监控
│└── Dockerfile
├── jaeger# Jaeger 链路追踪
│└── Dockerfile
├── mysql# Mysql 服务
│└── Dockerfile
├── mysql-manage# Mysql 可视化管理
│└── Dockerfile
├── prometheus# Prometheus 服务监控
│├── Dockerfile
│└── prometheus.yml# Prometheus 配置文件
├── redis# Redis 服务
│└── Dockerfile
├── redis-manage# Redis 可视化管理
│└── Dockerfile
├── .env# env 配置
└── docker-compose.yml
【学习笔记(带你十天轻松搞定 Go 微服务系列(一))】mkdir新建文件夹,touch新建文件
cd 目录(你放项目的目录)
mkdir gonivinck
cd gonivinck
mkdir dtm
cd dtm
touch config.yml
touch Dockerfile
其他目录同上,返回上级目录
cd ../
3.3 编写 Dockerfile 以 golang 容器的 Dockerfile 代码为例:
cd golang (进golang文件夹)
touch Dockerfile (新建Dockerfile文件)
vi Dockerfile (编辑Dockerfile文件)
golang 容器的 Dockerfile 代码如下:
FROM golang:1.17LABEL maintainer="Ving "ENV GOPROXY https://goproxy.cn,direct# 安装必要的软件包和依赖包
USER root
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
sed -i 's/security-cdn.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
apt-get update && \
apt-get upgrade -y && \
apt-get install -y --no-install-recommends \
curl \
zip \
unzip \
git \
vim # 安装 goctl
USER root
RUN GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
# 安装 protoc
USER root
RUN curl -L -o /tmp/protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.19.1/protoc-3.19.1-linux-x86_64.zip && \
unzip -d /tmp/protoc /tmp/protoc.zip && \
mv /tmp/protoc/bin/protoc $GOPATH/bin# 安装 protoc-gen-go
USER root
RUN go get -u github.com/golang/protobuf/protoc-gen-go@v1.4.0# $GOPATH/bin添加到环境变量中
ENV PATH $GOPATH/bin:$PATH# 清理垃圾
USER root
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
rm /var/log/lastlog /var/log/faillog# 设置工作目录
WORKDIR /usr/src/codeEXPOSE 8000
EXPOSE 8001
EXPOSE 8002
EXPOSE 8003
EXPOSE 9000
EXPOSE 9001
EXPOSE 9002
EXPOSE 9003
其他服务容器 Dockerfile
例子:/gonivinck/dtm/Dockerfile
FROM yedf/dtmLABEL maintainer="Ving "
其他和dtm/Dockerfile 差不多,依此类推,修改FROM后面的镜像就可以了
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/e7f18abcf49d4c7791744950d99d77d9.jpg)
文章图片
3.4 编写 .env 配置文件 这里配置了redis-manage等等的账号密码,以后会用到
# 设置时区
TZ=Asia/Shanghai
# 设置网络模式
NETWORKS_DRIVER=bridge# PATHS ##########################################
# 宿主机上代码存放的目录路径
CODE_PATH_HOST=./code
# 宿主机上Mysql Reids数据存放的目录路径
DATA_PATH_HOST=./data# MYSQL ##########################################
# Mysql 服务映射宿主机端口号,可在宿主机127.0.0.1:3306访问
MYSQL_PORT=3306
MYSQL_USERNAME=admin
MYSQL_PASSWORD=123456
MYSQL_ROOT_PASSWORD=123456# Mysql 可视化管理用户名称,同 MYSQL_USERNAME
MYSQL_MANAGE_USERNAME=admin
# Mysql 可视化管理用户密码,同 MYSQL_PASSWORD
MYSQL_MANAGE_PASSWORD=123456
# Mysql 可视化管理ROOT用户密码,同 MYSQL_ROOT_PASSWORD
MYSQL_MANAGE_ROOT_PASSWORD=123456
# Mysql 服务地址
MYSQL_MANAGE_CONNECT_HOST=mysql
# Mysql 服务端口号
MYSQL_MANAGE_CONNECT_PORT=3306
# Mysql 可视化管理映射宿主机端口号,可在宿主机127.0.0.1:1000访问
MYSQL_MANAGE_PORT=1000# REDIS ##########################################
# Redis 服务映射宿主机端口号,可在宿主机127.0.0.1:6379访问
REDIS_PORT=6379# Redis 可视化管理用户名称
REDIS_MANAGE_USERNAME=admin
# Redis 可视化管理用户密码
REDIS_MANAGE_PASSWORD=123456
# Redis 服务地址
REDIS_MANAGE_CONNECT_HOST=redis
# Redis 服务端口号
REDIS_MANAGE_CONNECT_PORT=6379
# Redis 可视化管理映射宿主机端口号,可在宿主机127.0.0.1:2000访问
REDIS_MANAGE_PORT=2000# ETCD ###########################################
# Etcd 服务映射宿主机端口号,可在宿主机127.0.0.1:2379访问
ETCD_PORT=2379# PROMETHEUS #####################################
# Prometheus 服务映射宿主机端口号,可在宿主机127.0.0.1:3000访问
PROMETHEUS_PORT=3000# GRAFANA ########################################
# Grafana 服务映射宿主机端口号,可在宿主机127.0.0.1:4000访问
GRAFANA_PORT=4000# JAEGER #########################################
# Jaeger 服务映射宿主机端口号,可在宿主机127.0.0.1:5000访问
JAEGER_PORT=5000# DTM #########################################
# DTM HTTP 协议端口号
DTM_HTTP_PORT=36789
# DTM gRPC 协议端口号
DTM_GRPC_PORT=36790
3.5 编写 docker-compose.yml 配置文件
version: '3.5'
# 网络配置
networks:
backend:
driver: ${NETWORKS_DRIVER}# 服务容器配置
services:
golang:# 自定义容器名称
build:
context: ./golang# 指定构建使用的 Dockerfile 文件
environment:# 设置环境变量
- TZ=${TZ}
volumes:# 设置挂载目录
- ${CODE_PATH_HOST}:/usr/src/code# 引用 .env 配置中 CODE_PATH_HOST 变量,将宿主机上代码存放的目录挂载到容器中 /usr/src/code 目录
ports:# 设置端口映射
- "8000:8000"
- "8001:8001"
- "8002:8002"
- "8003:8003"
- "9000:9000"
- "9001:9001"
- "9002:9002"
- "9003:9003"
stdin_open: true# 打开标准输入,可以接受外部输入
tty: true
networks:
- backend
restart: always# 指定容器退出后的重启策略为始终重启etcd:# 自定义容器名称
build:
context: ./etcd# 指定构建使用的 Dockerfile 文件
environment:
- TZ=${TZ}
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379
ports:# 设置端口映射
- "${ETCD_PORT}:2379"
networks:
- backend
restart: alwaysmysql:
build:
context: ./mysql
environment:
- TZ=${TZ}
- MYSQL_USER=${MYSQL_USERNAME}# 设置 Mysql 用户名称
- MYSQL_PASSWORD=${MYSQL_PASSWORD}# 设置 Mysql 用户密码
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}# 设置 Mysql root 用户密码
volumes:
- ${DATA_PATH_HOST}/mysql:/var/lib/mysql# 引用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上存放 Mysql 数据的目录挂载到容器中 /var/lib/mysql 目录
ports:
- "${MYSQL_PORT}:3306"# 设置容器3306端口映射指定宿主机端口
networks:
- backend
restart: alwaysredis:
build:
context: ./redis
environment:
- TZ=${TZ}
volumes:
- ${DATA_PATH_HOST}/redis:/data# 引用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上存放 Redis 数据的目录挂载到容器中 /data 目录
ports:
- "${REDIS_PORT}:6379"# 设置容器6379端口映射指定宿主机端口
networks:
- backend
restart: alwaysmysql-manage:
build:
context: ./mysql-manage
environment:
- TZ=${TZ}
- PMA_ARBITRARY=1
- MYSQL_USER=${MYSQL_MANAGE_USERNAME}# 设置连接的 Mysql 服务用户名称
- MYSQL_PASSWORD=${MYSQL_MANAGE_PASSWORD}# 设置连接的 Mysql 服务用户密码
- MYSQL_ROOT_PASSWORD=${MYSQL_MANAGE_ROOT_PASSWORD} # 设置连接的 Mysql 服务 root 用户密码
- PMA_HOST=${MYSQL_MANAGE_CONNECT_HOST}# 设置连接的 Mysql 服务 host,可以是 Mysql 服务容器的名称,也可以是 Mysql 服务容器的 ip 地址
- PMA_PORT=${MYSQL_MANAGE_CONNECT_PORT}# 设置连接的 Mysql 服务端口号
ports:
- "${MYSQL_MANAGE_PORT}:80"# 设置容器80端口映射指定宿主机端口,用于宿主机访问可视化web
depends_on:# 依赖容器
- mysql# 在 Mysql 服务容器启动后启动
networks:
- backend
restart: alwaysredis-manage:
build:
context: ./redis-manage
environment:
- TZ=${TZ}
- ADMIN_USER=${REDIS_MANAGE_USERNAME}# 设置 Redis 可视化管理的用户名称
- ADMIN_PASS=${REDIS_MANAGE_PASSWORD}# 设置 Redis 可视化管理的用户密码
- REDIS_1_HOST=${REDIS_MANAGE_CONNECT_HOST}# 设置连接的 Redis 服务 host,可以是 Redis 服务容器的名称,也可以是 Redis 服务容器的 ip 地址
- REDIS_1_PORT=${REDIS_MANAGE_CONNECT_PORT}# 设置连接的 Redis 服务端口号
ports:
- "${REDIS_MANAGE_PORT}:80"# 设置容器80端口映射指定宿主机端口,用于宿主机访问可视化web
depends_on:# 依赖容器
- redis# 在 Redis 服务容器启动后启动
networks:
- backend
restart: alwaysprometheus:
build:
context: ./prometheus
environment:
- TZ=${TZ}
volumes:
- ./prometheus/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml# 将 prometheus 配置文件挂载到容器里
ports:
- "${PROMETHEUS_PORT}:9090"# 设置容器9090端口映射指定宿主机端口,用于宿主机访问可视化web
networks:
- backend
restart: alwaysgrafana:
build:
context: ./grafana
environment:
- TZ=${TZ}
ports:
- "${GRAFANA_PORT}:3000"# 设置容器3000端口映射指定宿主机端口,用于宿主机访问可视化web
networks:
- backend
restart: alwaysjaeger:
build:
context: ./jaeger
environment:
- TZ=${TZ}
ports:
- "${JAEGER_PORT}:16686"# 设置容器16686端口映射指定宿主机端口,用于宿主机访问可视化web
networks:
- backend
restart: alwaysdtm:
build:
context: ./dtm
environment:
- TZ=${TZ}
entrypoint:
- "/app/dtm/dtm"
- "-c=/app/dtm/configs/config.yaml"
volumes:
- ./dtm/config.yml:/app/dtm/configs/config.yaml # 将 dtm 配置文件挂载到容器里
ports:
- "${DTM_HTTP_PORT}:36789"
- "${DTM_GRPC_PORT}:36790"
networks:
- backend
restart: always
3.6 构建运行
docker-compose up -d
运行时会报Timeout
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/e3e6ffac36e1487e976647bec175311c.jpg)
文章图片
这种情况翻就解决了,如果翻了也timeout,关了再跑
docker-compose up -d
,也会解决(我印象中运行golang不能翻,mysql也不能翻,其他好像都得翻)好几次
docker-compose up -d
后,运行成功,我在我的Ubuntu虚拟机启动了![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/082158d76f124bc28ed2118ae15569cf.png)
文章图片
docker ps
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/618a6209deaf44dabb24dec44793e92b.jpg)
文章图片
3.7 依次去访问 1000 2000 3000 4000 5000 3.7.1 Mysql 访问验证
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/d7ffa2a65a2f4d4483cd9836210a06e5.jpg)
文章图片
3.7.2 Redis 访问验证
这里就用到 .env 配置的账号密码登录
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/8c87860d84bb4bacbc58e29da6be1f0a.jpg)
文章图片
3.7.3 Prometheus 访问验证
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/ac9e99e66e9d4b3cafd32327563ac18a.jpg)
文章图片
3.7.4 Grafana 访问验证
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/9daa13e9af564e228f9ebaacf155fdb2.jpg)
文章图片
3.7.5 Jaeger 访问验证
![学习笔记(带你十天轻松搞定 Go 微服务系列(一))](https://img.it610.com/image/info9/c0bcdb2c450d442583f8c9d269a22c3a.jpg)
文章图片