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后面的镜像就可以了
文章图片
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
文章图片
这种情况翻就解决了,如果翻了也timeout,关了再跑
docker-compose up -d
,也会解决(我印象中运行golang不能翻,mysql也不能翻,其他好像都得翻)好几次
docker-compose up -d
后,运行成功,我在我的Ubuntu虚拟机启动了文章图片
docker ps
文章图片
3.7 依次去访问 1000 2000 3000 4000 5000 3.7.1 Mysql 访问验证
文章图片
3.7.2 Redis 访问验证
这里就用到 .env 配置的账号密码登录
文章图片
3.7.3 Prometheus 访问验证
文章图片
3.7.4 Grafana 访问验证
文章图片
3.7.5 Jaeger 访问验证
文章图片