共计 7113 个字符,预计需要花费 18 分钟才能阅读完成。
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
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.17
LABEL maintainer="Ving <ving@nivin.cn>"
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/code
EXPOSE 8000
EXPOSE 8001
EXPOSE 8002
EXPOSE 8003
EXPOSE 9000
EXPOSE 9001
EXPOSE 9002
EXPOSE 9003
其余服务容器 Dockerfile
例子:/gonivinck/dtm/Dockerfile
FROM yedf/dtm
LABEL maintainer="Ving <ving@nivin.cn>"
其余和 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: always
mysql:
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: always
redis:
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: always
mysql-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: always
redis-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: always
prometheus:
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: always
grafana:
build:
context: ./grafana
environment:
- TZ=${TZ}
ports:
- "${GRAFANA_PORT}:3000" # 设置容器 3000 端口映射指定宿主机端口,用于宿主机拜访可视化 web
networks:
- backend
restart: always
jaeger:
build:
context: ./jaeger
environment:
- TZ=${TZ}
ports:
- "${JAEGER_PORT}:16686" # 设置容器 16686 端口映射指定宿主机端口,用于宿主机拜访可视化 web
networks:
- backend
restart: always
dtm:
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 拜访验证
正文完