1、学习课程2、个人环境3、步骤
3.1 安装Docker Compose3.2 创建目录 mkdir 与 touch 命令3.3 编写 Dockerfile3.4 编写 .env 配置文件3.5 编写 docker-compose.yml 配置文件3.6 构建运行3.7 依次去访问 1000 2000 3000 4000 5000
3.7.1 Mysql 访问验证3.7.2 Redis 访问验证3.7.3 Prometheus 访问验证3.7.4 Grafana 访问验证3.7.5 Jaeger 访问验证
1、学习课程带你十天轻松搞定 Go 微服务系列(一)
2、个人环境Ubuntu 20.04.4
docker-compose version 1.21.2, build a133471
apt install docker-compose3.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" 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"
其他和dtm/Dockerfile 差不多,依此类推,修改FROM后面的镜像就可以了
| 服务 | 基于的镜像 |
|---|---|
| DTM | yedf/dtm |
| Etcd | bitnami/etcd |
| Mysql | mysql:5.7 |
| Redis | redis:5.0 |
| Mysql Manage | phpmyadmin/phpmyadmin |
| Redis Manage | erikdubbelboer/phpredisadmin |
| Prometheus | bitnami/prometheus |
| Grafana | grafana/grafana |
| Jaeger | jaegertracing/all-in-one:1.28 |
这里配置了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=367903.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
这里就用到 .env 配置的账号密码登录



