学习笔记(带你十天轻松搞定 Go 微服务系列(一))

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 微服务系列(一))
文章图片

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 微服务系列(一))
文章图片

这种情况翻就解决了,如果翻了也timeout,关了再跑docker-compose up -d,也会解决(我印象中运行golang不能翻,mysql也不能翻,其他好像都得翻)
好几次docker-compose up -d 后,运行成功,我在我的Ubuntu虚拟机启动了
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

docker ps
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

3.7 依次去访问 1000 2000 3000 4000 5000 3.7.1 Mysql 访问验证
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

3.7.2 Redis 访问验证
这里就用到 .env 配置的账号密码登录
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

3.7.3 Prometheus 访问验证
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

3.7.4 Grafana 访问验证
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

3.7.5 Jaeger 访问验证
学习笔记(带你十天轻松搞定 Go 微服务系列(一))
文章图片

    推荐阅读