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

4 篇文章 0 订阅
1 篇文章 0 订阅

一、环境介绍

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 build

FROM 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: frontend
    container_name: studioui
    image: studioui:V1.0
    depends_on:
      - studioservice
    restart: always
    links:
      - studioservice
    ports:
      - 80:80
    networks:
      - ainet

  studioservice:
    build: backend
    #生成容器名
    container_name: studioapi
    #生成镜像名和tag
    image: studioapi:V1.0
    #关机或者重启docker同时重启容器
    restart: always
    depends_on:
      - mysql
      - rabbitmq
    links:
      - mysql
      - rabbitmq
      - minio1
    ports:
      - 9090:9090
    networks:
      - ainet

  rabbitmq:
    # management安装客户端插件,可以浏览器访问rabbitmq
    image: rabbitmq:3.8.4-management
    container_name: ai_rabbitmq
    ports:
      #erlang发现端口
      - 4369:4369
      - 5671:5671
      #client端通信端口
      - 5672:5672
      #管理界面ui端端口
      - 15672:15672
      #server间内部通信端口
      - 25672:25672
    #setup host name
    hostname: worknode1
    #设置环境变量
    environment:
      RABBITMQ_DEFAULT_VHOST: testvh
      RABBITMQ_DEFAULT_USER: test
      RABBITMQ_DEFAULT_PASS: 1234
      RABBITMQ_LOGS: /var/lib/rabbitmq/rabbitmq.log
      RABBITMQ_SASL_LOGS: /var/lib/rabbitmq/rabbitmq-sasl.log
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
    #宿主机和容器关联的目录.如果非root账号执行,挂载目录必须是登录账号家目录
    volumes:
      - /opt/rabbitmq/data:/var/lib/rabbitmq
      - /opt/rabbitmq/log:/var/log/rabbitmq/log
      #- /etc/hosts:/etc/hosts
    #关机或者重启docker同时重启容器
    restart: always
    networks:
      - ainet

  mysql:
    image: mysql:5.7
    container_name: ai_mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: aisvc
      MYSQL_USER: aisvc
      MYSQL_PASSWORD: 20191014
      MYSQL_ROOT_PASSWORD: 20191014
    volumes:
      # 挂载数据件目录.如果非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: always
    command:
      --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_SUBSTITUTION
    networks:
      - ainet

  minio1:
    image: minio/minio:latest
    container_name: ai_minio1
    volumes:
      - /opt/minio/data1-1:/data1
      - /opt/minio/data1-2:/data2
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: miniotest
      MINIO_SECRET_KEY: 12345678
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - ainet

  minio2:
    image: minio/minio:latest
    container_name: ai_minio2
    volumes:
      - /opt/minio/data2-1:/data1
      - /opt/minio/data2-2:/data2
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: miniotest
      MINIO_SECRET_KEY: 12345678
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - ainet

  minio3:
    image: minio/minio:latest
    container_name: ai_minio3
    volumes:
      - /opt/minio/data3-1:/data1
      - /opt/minio/data3-2:/data2
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: miniotest
      MINIO_SECRET_KEY: 12345678
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - ainet

  minio4:
    image: minio/minio:latest
    container_name: ai_minio4
    volumes:
      - /opt/minio/data4-1:/data1
      - /opt/minio/data4-2:/data2
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: miniotest
      MINIO_SECRET_KEY: 12345678
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - 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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值