当前位置: 代码迷 >> 综合 >> Docker-Compose部署Vue+Golang+MySQL+RabbitMQ+MinIO
  详细解决方案

Docker-Compose部署Vue+Golang+MySQL+RabbitMQ+MinIO

热度:57   发布时间:2023-12-10 22:50:04.0

  • 一、环境介绍
  • 二、安装Docker-Compose
  • 三、准备工作
  • 四、docker-compose讲解
        • yaml文件内容
        • links的作用
        • depends_on的作用
  • 五、执行docker-compose

一、环境介绍

Go版本:1.13.1
部署环境:centos7
Docker版本:18.06.1
Docker-Compose版本:1.26.0
Mysql版本:5.7
RabbitMQ版本:3.8.4

二、安装Docker-Compose

下载

[root@localhost tools]# wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64

拷贝

[root@localhost tools]# cp /ssd/tools/docker-compose-Linux-x86_64 /usr/local/bin
[root@ localhost tools]# mv docker-compose-Linux-x86_64 docker-compose

授权

[root@localhost tools]# chmod -R 777 /usr/local/bin/docker-compose

查看版本

[root@ localhost tools]# docker-compose --version
docker-compose version 1.26.0, build d4451659

卸载docker-compose
二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

三、准备工作

docker-compose和docker的版本配套关系在下面的地址可以查看
https://docs.docker.com/compose/compose-file/

下面的version: ‘3.7’ 是docker-compose的版本
在这里插入图片描述

创建docker网络

docker network create ainet

查看网络

docker network ls

一键部署目录结构

[root@localhost app_deploy]# tree
.
├── ai_algorithm
├── ai_server
├── backend
│   ├── aisvc
│   └── Dockerfile
├── dbconf
│   └── aimysql.cnf
├── dbsql
│   └── dxm.sql
├── docker-compose.yaml
└── frontend├── conf│   └── nginx.conf├── conf.d│   └── default.conf├── dist└── Dockerfile

目录说明如下
在这里插入图片描述
mysql初始化目录,可以存放创建表的sql脚本文件,在mysql容器启动后,会自动执行这个sql脚本文件

go代码后端Dockerfile内容如下

#使用了镜像大小体积只5MB的alpine镜像
FROM alpine:latest
#设置环境变量
#ENV env test
#在docker的根目录下创建相应的使用目录
RUN mkdir -p /go/app
#设置工作路径
WORKDIR /go/app
#把上文编译好的main文件添加到镜像里
COPY . .
#暴露容器内部端口
EXPOSE 9090
#入口
ENTRYPOINT ["/go/app/aisvc"]

前端Dockerfile内容如下

#FROM node:12.16.1 as build#在docker的根目录下创建相应的使用目录
#RUN mkdir -p /app/www
#clone分支branchA的代码到容器/app/www目录
#RUN git clone -b branchA https://username:password@github.com/xxx.git /app/www
#设置工作路径
#WORKDIR /app/www
#RUN npm install
#RUN npm run buildFROM nginx:latest
#添加自己的配置 default.conf
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY dist/ /usr/share/nginx/html/#暴露容器内部端口
#EXPOSE 8080
#ENTRYPOINT ["npm", "start"]

四、docker-compose讲解

yaml文件内容
version: '3.7'
services:studioui:build: frontendcontainer_name: studiouiimage: studioui:V1.0depends_on:- studioservicerestart: alwayslinks:- studioserviceports:- 80:80networks:- ainetstudioservice:build: backend#生成容器名container_name: studioapi#生成镜像名和tagimage: studioapi:V1.0#关机或者重启docker同时重启容器restart: alwaysdepends_on:- mysql- rabbitmqlinks:- mysql- rabbitmq- minio1ports:- 9090:9090networks:- ainetrabbitmq:# management安装客户端插件,可以浏览器访问rabbitmqimage: rabbitmq:3.8.4-managementcontainer_name: ai_rabbitmqports:#erlang发现端口- 4369:4369- 5671:5671#client端通信端口- 5672:5672#管理界面ui端端口- 15672:15672#server间内部通信端口- 25672:25672#setup host namehostname: worknode1#设置环境变量environment:RABBITMQ_DEFAULT_VHOST: testvhRABBITMQ_DEFAULT_USER: testRABBITMQ_DEFAULT_PASS: 1234RABBITMQ_LOGS: /var/lib/rabbitmq/rabbitmq.logRABBITMQ_SASL_LOGS: /var/lib/rabbitmq/rabbitmq-sasl.logRABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX#宿主机和容器关联的目录.如果非root账号执行,挂载目录必须是登录账号家目录volumes:- /opt/rabbitmq/data:/var/lib/rabbitmq- /opt/rabbitmq/log:/var/log/rabbitmq/log#- /etc/hosts:/etc/hosts#关机或者重启docker同时重启容器restart: alwaysnetworks:- ainetmysql:image: mysql:5.7container_name: ai_mysqlports:- 3306:3306environment:MYSQL_DATABASE: aisvcMYSQL_USER: aisvcMYSQL_PASSWORD: 20191014MYSQL_ROOT_PASSWORD: 20191014volumes:# 挂载数据件目录.如果非root账号执行,挂载目录必须是登录账号家目录- /opt/mysql/data:/var/lib/mysql# 挂载配置文件目录- ./dbconf:/etc/mysql/conf.d# 挂载日志文件目录- /opt/mysql/logs:/logs# 初始化脚本件目录,相对docker-compose所在目录路径- ./dbsql:/docker-entrypoint-initdb.d/#- /etc/localtime:/etc/localtime:ro#关机或者重启docker同时重启容器restart: alwayscommand:--character-set-server=utf8--collation-server=utf8_general_ci--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONnetworks:- ainetminio1:image: minio/minio:latestcontainer_name: ai_minio1volumes:- /opt/minio/data1-1:/data1- /opt/minio/data1-2:/data2ports:- "9001:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
    1...4}/data{
    1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio2:image: minio/minio:latestcontainer_name: ai_minio2volumes:- /opt/minio/data2-1:/data1- /opt/minio/data2-2:/data2ports:- "9002:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
    1...4}/data{
    1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio3:image: minio/minio:latestcontainer_name: ai_minio3volumes:- /opt/minio/data3-1:/data1- /opt/minio/data3-2:/data2ports:- "9003:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
    1...4}/data{
    1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainetminio4:image: minio/minio:latestcontainer_name: ai_minio4volumes:- /opt/minio/data4-1:/data1- /opt/minio/data4-2:/data2ports:- "9004:9000"environment:MINIO_ACCESS_KEY: miniotestMINIO_SECRET_KEY: 12345678command: server http://minio{
    1...4}/data{
    1...2}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3networks:- ainet
networks:ainet:external: true

如果非root账号执行docker-compose,那么yaml文件里挂载的目录,根目录只能是/home/账号名(账号的家目录)

links的作用

下图,go编写的后端服务在run容器的时候,会把mysq、RabbitMQ、MinIO容器信息记录到自己的容器中,那么后端应用在访问mysq、RabbitMQ、MinIO的时候,可用使用container_name而不使用IP
在这里插入图片描述

怎么验证这一点呢?
进入go编写后端服务的容器

docker exec -it studioapi sh

在这里插入图片描述

depends_on的作用

       下下图,go编写的后端服务容器依赖于mysql、rabbitmq容器服务,容器启动有先后顺序。
       后端服务容器启动晚于mysql、rabbitmq容器的启动。如下图看一下执行docker-comose的顺序。
       可以看到,studioui依赖于studioservice,而studioservice又依赖mysql、rabbitmq、minio,因此mysql、rabbitmq、minio容器先启动,studioservice次之,studioui最后启动。
       但是注意,并不是说studioservice会等mysql、rabbitmq、minio完全启动了再启动,而是mysql、rabbitmq、minio一启动后,studioservice就会启动,那么如果studioservice启动的过程中有可能连不上mysql、rabbitmq、minio
在这里插入图片描述
在这里插入图片描述

五、执行docker-compose

在docker-compose.yaml文件目录执行

下面的命令,每次都会重新build使用到的docker镜像

docker-compose -f docker-compose.yaml up --build -d

下面的命令,如果使用到的docker镜像存在,直接使用,不build镜像。如果不存在,会build镜像

docker-compose -f docker-compose.yaml up -d

看一下执行完的结果
在这里插入图片描述

  相关解决方案