1. 前言


部署暂时是在单机中,如果有需要考虑上k8s

项目使用docker-compose部署;就目前而言,服务器硬件最低要求是4c8g…我手上就一台1c2g的学生机,资源直接被占百分百;无奈高配置的服务器太贵了,好在有按量付费的计费方式,不过也是一路被坑过来,先租了2c4g发现有两三个服务总是在重启,一直以为配置有问题,后来发现是硬件跟不上导致的,最终租了4c8g的才完美启动成功;但是按量有个最大的缺陷是每次租的服务器都需要重新搭建环境,拉取镜像,这个是不能忍受的,最后,分了4c8g给虚拟机,在虚拟机中部署了。

现在就先看看如何来部署「初学者商城」的。


2. 源码


完整项目地址:https://github.com/intomylife/osc-build

v1.0 标签地址:https://github.com/intomylife/osc-build/releases/tag/v1.0

v1.0 下载地址:ziptar.gz

注:对于标签的说明「初学者商城」- 写在最前面 #5.1


3. 环境


  • CentOS7.3 64位

4. 工具


  • Termius
  • Cyberduck
  • Navicat Premium
  • Redis Desktop Manager
  • Robo 3T

5. 目录结构


osc-build-1.0/
├── config
│   ├── mysql
│   │   └── my.cnf
│   ├── nginx
│   │   └── nginx.conf
│   └── redis
│       └── redis.conf
├── data
│   ├── mongodb
│   ├── mysql
│   ├── nginx
│   ├── redis
│   └── zookeeper
├── docker-compose.yaml
├── init
│   ├── mongodb
│   │   └── setup.js
│   └── mysql
│       └── init.sql
├── log
│   ├── kafka
│   ├── mongodb
│   ├── mysql
│   ├── nginx
│   └── redis
└── README.md
  • config:应用的配置文件
  • data:映射出来的数据
  • docker-compose.yaml:核心配置文件
  • init:初始化脚本
  • log:映射出来的日志

6. docker-compose.yaml


6.1 文件说明

此文件的默认名称为 docker-compose,后缀名可以为 .yml 也可以为 .yaml。

6.2 version

version: '3'
  • 构建文件的语法版本信息。version: ‘3’ 表示使用第三代语法

6.3 services

version: '3'
 
services:
 
    service_redis:
        ...
    
    service_mysql:
        ...

    service_mongodb:
        ...

    service_zookeeper:
        ...

    service_kafka:
        ...

    service_kafka_manager:
        ...

    service_registry:
        ...

    service_sleuth:
        ...

    service_turbine:
        ...

    service_gateway:
        ...

    service_base:
        ...

    service_log:
        ...

    service_vue:
    	...
    	
    service_nginx:
        ...
  • 包含此工程中所有的服务列表
  • 服务可以是已存在的镜像(本地或远程),也可以是构建出来的镜像;如果其中有需要构建的镜像,则需要一个 Dockerfile 文件

6.4 服务相同属性

注:这里先把服务的相同点写一下,然后不同的点会在下面单独写出来

  • service_xxxxxx:服务名称,可自定义
  • container_name:容器名称,可自定义;也可不写,那样会自动生成,生成规则为 【docker-compose.yaml 文件的父目录名称 + _ + 服务名称 + 从一开始的数字】
  • image:指定镜像来启动容器
  • links:连接指定的服务,规则为 服务名称:别名
  • environment:为启动的容器添加环境变量
  • ports:端口映射,映射规则为 宿主机端口:容器端口
  • expose:暴露容器内端口,不映射到宿主机
  • volumes:配置映射,映射规则为 宿主机:容器,可以映射文件或目录
  • depends_on:依赖服务。在整个工程启动时,会先启动依赖服务,再启动当前服务
  • command:容器启动后执行的命令
  • restart:赋固定值 always,表示如果容器启动失败,会一直尝试重启

6.5 service_redis

    service_redis:
        container_name: container_redis
        image: redis:4.0.14
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "6379:6379"
        volumes:
            - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
            - ./data/redis/:/data/
            - ./log/redis/:/var/log/redis/
        command: redis-server /usr/local/etc/redis/redis.conf
        restart: always

Redis 服务描述:

  • image:Redis 官方镜像,版本为 4.0.14
  • environment:容器的时区
  • volumes:① 配置文件 ② 数据目录 ③ 日志目录
  • command:使用配置文件来启动 Redis 容器

注:redis.conf 配置文件中修改了如下几点

  1. daemonize no:前台启动,在 Docker 中后台启动 Redis 容器会报错
  2. requirepass 123456789:设置密码
  3. # bind 127.0.0.1:注释掉了,使外网可访问

6.6 service_mysql

    service_mysql:
        container_name: container_mysql
        image: mysql:5.7
        environment:
            TZ: Asia/Shanghai
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_ROOT_HOST: '%'
        ports:
            - "3306:3306"
        volumes:
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./init/mysql/:/docker-entrypoint-initdb.d/
            - ./data/mysql/:/var/lib/mysql/
            - ./log/mysql/:/var/log/mysql/
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        restart: always

MySQL 服务描述:

  • image:MySQL 官方镜像,版本为 5.7
  • environment:① 容器的时区 ② 设置数据库 ROOT 密码 ③ 设置数据库权限
  • volumes:① 配置文件 ② 初始化 SQL 目录 ③ 数据目录 ④ 日志目录
  • command:设置字符编码

注:my.cnf 配置文件中有一个需要注意的地方如下

# 开启 bin-log,并指定文件目录和文件名前缀
log-bin=/var/log/mysql/binlog

6.7 service_mongodb

    service_mongodb:
        container_name: container_mongodb
        image: mongo:4.0.9
        environment:
            TZ: Asia/Shanghai
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: 123456
        ports:
            - "27017:27017"
        volumes:
            - ./init/mongodb/:/docker-entrypoint-initdb.d/
            - ./data/mongodb/:/data/db/
            - ./log/mongodb/:/var/log/mongodb/
        restart: always

MongoDB 服务描述:

  • image:MongoDB 官方镜像,版本为 4.0.9
  • environment:① 容器的时区 ② 管理员的用户名和密码
  • volumes:① 初始化脚本目录 ② 数据目录 ③ 日志目录

注:setup.js 初始化脚本文件用来创建 MongoDB 初始库并设置库的登录用户

6.8 service_zookeeper

    service_zookeeper:
        container_name: container_zookeeper
        image: wurstmeister/zookeeper:3.4.13
        image: wurstmeister/zookeeper
        environment:
            TZ: Asia/Shanghai
        expose:
            - "2181"
        volumes:
            - ./data/zookeeper/:/opt/zookeeper-3.4.13/data/
        restart: always

Zookeeper 服务描述:

  • image:远程仓库中 wurstmeister/zookeeper 镜像,版本为 3.4.13。写两个 image 主要为了确保拉取的是 3.4.13 版本的镜像,从而能顺利把数据映射出来;后面会把这个版本号写到环境变量里面
  • environment:容器的时区
  • volumes:数据目录

6.9 service_kafka

    service_kafka:
        container_name: container_kafka
        image: wurstmeister/kafka
        links:
            - service_zookeeper:zoo
        environment:
            TZ: Asia/Shanghai
            KAFKA_ADVERTISED_HOST_NAME: service_kafka
            KAFKA_MESSAGE_MAX_BYTES: 2000000
            KAFKA_ZOOKEEPER_CONNECT: zoo:2181
            KAFKA_LOG_DIRS: "/var/log/kafka"
        ports:
            - "9092:9092"
        volumes:
            - ./log/kafka/:/var/log/kafka/
            - /var/run/docker.sock:/var/run/docker.sock
        depends_on:
            - service_zookeeper
        restart: always

Kafka 服务描述:

  • image:远程仓库中 wurstmeister/kafka 镜像,版本为 最新
  • environment:① 容器的时区 ② Kafka 的主机地址(当前服务)③ 消息体的最大大小 ④ Zookeeper 集群地址(service_zookeeper 服务)⑤ Kafka 的日志目录
  • volumes:① 日志目录 ② docker.sock。至于为什么需要 docker.sock 是因为这个 Kafka 服务需要使用 Docker 命令

6.10 service_kafka_manager

    service_kafka_manager:
        container_name: container_kafka_manager
        image: sheepkiller/kafka-manager
        links:
            - service_zookeeper:zoo
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            ZK_HOSTS: zoo:2181
            KAFKA_BROKERS: kafka:9092
        ports:
            - "9000:9000"
        depends_on:
            - service_zookeeper
            - service_kafka
        restart: always

Kafka 服务描述:

  • image:远程仓库中 sheepkiller/kafka-manager 镜像,版本为 最新
  • environment:① 容器的时区 ② Zookeeper 的地址(service_zookeeper 服务)③ Kafka 的地址(service_kafka 服务)

6.11 service_registry

    service_registry:
        container_name: container_registry
        image: intomylife/osc-registry:1.0
        environment:
            TZ: Asia/Shanghai
        ports:
            - "8761:8761"
        restart: always

Registry 服务描述:

  • image:远程仓库中 intomylife/osc-registry 镜像,版本为 1.0
  • environment:容器的时区

6.12 service_sleuth

    service_sleuth:
        container_name: container_sleuth
        image: intomylife/osc-sleuth:1.0
        links:
            - service_registry:registry
        environment:
            TZ: Asia/Shanghai
            eureka.server.host: registry
        ports:
            - "9411:9411"
        depends_on:
            - service_registry
        restart: always

Sleuth 服务描述:

  • image:远程仓库中 intomylife/osc-sleuth 镜像,版本为 1.0
  • environment:① 容器的时区 ② 指定了注册中心地址为 service_registry 服务(eureka.server.host 配置在接口的链路跟踪监控中心工程的 application.yml 文件中)

6.13 service_turbine

    service_turbine:
        container_name: container_turbine
        image: intomylife/osc-turbine:1.0
        links:
            - service_registry:registry
        environment:
            TZ: Asia/Shanghai
            eureka.server.host: registry
        ports:
            - "8762:8762"
        depends_on:
            - service_registry
        restart: always

Turbine 服务描述:

  • image:远程仓库中 intomylife/osc-turbine 镜像,版本为 1.0
  • environment:① 容器的时区 ② 指定了注册中心地址为 service_registry 服务(eureka.server.host 配置在接口的链路跟踪监控中心工程的 application.yml 文件中)

6.14 service_gateway

    service_gateway:
        container_name: container_gateway
        image: intomylife/osc-gateway:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            eureka.server.host: registry
            spring.zipkin.host: sleuth
        ports:
            - "8000:8000"
        depends_on:
            - service_redis
            - service_registry
            - service_sleuth
        restart: always

Gateway 服务描述:

  • image:远程仓库中 intomylife/osc-gateway 镜像,版本为 1.0
  • environment:① 容器的时区 ② 指定了 Redis 地址为 service_redis 服务 ③ 指定了注册中心地址为 service_registry 服务 ④ 指定了 Zipkin 地址为 service_sleuth 服务 注:配置都在接口的网关工程的 application.yml 文件中

6.15 service_base

    service_base:
        container_name: container_base
        image: intomylife/osc-base:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            spring.datasource.host: service_mysql
            spring.data.mongodb.host: service_mongodb
            eureka.server.host: registry
            spring.zipkin.host: sleuth
            spring.kafka.host: kafka
        ports:
            - "8080:8080"
        depends_on:
            - service_redis
            - service_mysql
            - service_mongodb
            - service_registry
            - service_sleuth
            - service_turbine
            - service_kafka
        restart: always

Base 服务描述:

  • image:远程仓库中 intomylife/osc-base 镜像,版本为 1.0
  • environment:① 容器的时区 ② 指定了 Redis 地址为 service_redis 服务 ③ 指定了 MySQL 地址为 service_mysql 服务 ④ 指定了 MongoDB 地址为 service_mongodb 服务 ⑤ 指定了注册中心地址为 service_registry 服务 ⑥ 指定了 Zipkin 地址为 service_sleuth 服务 ⑦ 指定了 Kafka 地址为 service_kafka 服务 注:配置都在接口的基础工程 - 核心的 application.yml 文件中

6.16 service_log

    service_log:
        container_name: container_log
        image: intomylife/osc-log:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            spring.datasource.host: service_mysql
            spring.data.mongodb.host: service_mongodb
            eureka.server.host: registry
            spring.zipkin.host: sleuth
            spring.kafka.host: kafka
        expose:
            - "8081"
        depends_on:
            - service_redis
            - service_mysql
            - service_mongodb
            - service_registry
            - service_sleuth
            - service_turbine
            - service_kafka
        restart: always

Log 服务描述:

  • image:远程仓库中 intomylife/osc-log 镜像,版本为 1.0
  • environment:① 容器的时区 ② 指定了 Redis 地址为 service_redis 服务 ③ 指定了 MySQL 地址为 service_mysql 服务 ④ 指定了 MongoDB 地址为 service_mongodb 服务 ⑤ 指定了注册中心地址为 service_registry 服务 ⑥ 指定了 Zipkin 地址为 service_sleuth 服务 ⑦ 指定了 Kafka 地址为 service_kafka 服务 注:配置都在接口的日志工程 - 核心的 application.yml 文件中

6.17 service_vue

    service_vue:
        container_name: container_vue
        image: intomylife/osc-front:1.0
        environment:
            - TZ=Asia/Shanghai
        volumes:
            - ./data/nginx/:/app/dist/

Vue 服务描述:

  • image:远程仓库中 intomylife/osc-front 镜像,版本为 1.0
  • environment:容器的时区
  • volumes:把 Vue 打包后的静态文件映射出来

注:此服务的作用就是把 Vue 打包成静态页面,映射到宿主机目录;此服务在打包结束后就会自动停止。

6.18 service_nginx

    service_nginx:
        container_name: container_nginx
        image: nginx:1.8
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "9527:9527"
        volumes:
            - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
            - ./data/nginx/:/usr/share/nginx/html/
            - ./log/nginx/:/var/log/nginx/
        depends_on:
            - service_vue
        restart: always

Nginx 服务描述:

  • image:Nginx 官方镜像,版本为 1.8
  • environment:容器的时区
  • volumes:① 配置文件 ② 数据目录 ③ 日志目录

注:

  1. volumes 映射的数据目录./data/nginx/,就是 service_vue 服务从容器中映射出来的 Vue 打包后的静态文件,container_vue 容器 映射到 宿主机,宿主机 映射到 container_nginx 容器,所以这里需要在 depends_on 中配置 service_vue 服务等待 Vue 打包结束。这样,启动时静态文件就会直接被映射到 Nginx 的访问目录中。

  2. nginx.conf 配置文件中需要注意如下地方

... 省略部分 ...

    # 负载均衡
    upstream dispense {
        server container_gateway:8000;
    }

... 省略部分 ...

        # 代理静态页面
        location / {
            root /usr/share/nginx/html;
            index  index.html index.htm;
        }

        # 代理接口地址
        location ^~ /api/ {
            proxy_pass http://dispense/;
		}
  • 直接访问 Nginx,就会访问到 Vue 打包后的静态文件,也就是后台管理系统页面
  • /api开头的请求会被转发到 Gateway 服务,也就是接口中的网关;这里也解决了发布后跨域问题
  • /api与 Vue 中 config/prod.env.js 文件配置的 VUE_APP_BASE_API 对应

7. 部署


7.1 使用我的镜像部署发布

注:如果使用我的镜像部署发布的话,会简单很多,推荐先试验一下

  1. 下载v1.0标签的代码
  2. 把下载下来的osc-build-1.0目录拷贝到服务器或者虚拟机中
  3. 进入到目录中
  4. 日志目录需要赋值权限:chmod -R 777 log/
  5. 如果没有安装Dockerdocker-compose请先前往:CentOS7中安装DockerCentOS7中安装Docker-Compose
  6. 后台启动:docker-compose up -d
  7. 启动情况:docker ps -a

7.2 使用你自己的镜像部署发布

  1. 具体操作步骤请前往:CentOS7中使用docker-compose快速部署前后端分离项目

8. 验证


注:服务器需要开启防火墙,并且需要把端口都开放出来以及加到安全组中

8.1 后台管理系统

  1. 访问http://ip:9527
  2. 显示success,表示成功

8.2 Navicat 连接 MySQL 容器

在 Navicat 中新建 MySQL 连接:

  • 主机:服务器 ip
  • 端口:3306
  • 用户名:root
  • 密码:123456

连接成功后,进入到 osc_db 库中,目前里面只有两张表:

  1. flyway_schema_history是 Flyway 自动生成的,用来记录版本信息的表
  2. visit是基础工程的配置文件(osc-base-service - osc-base-service-core - resources - db.zwc)中的.sql脚本执行结果所产生的表,表里还有刚刚访问时插入的数据

8.3 rdm 连接 Redis 容器

在 rdm 中新建连接:

  • Host:服务器 ip
  • Port:6379
  • Auth:123456789

连接成功后,进入到 db_0 库中查看key: to_visit,存放着最新的访问记录

8.4 Robo 3T 连接 MongoDB 容器

在 Robo 3T 中新建连接:

Connection:

  1. Name:取个名

Authentication:

  1. 勾选 Perform authentication
  2. Database:osc_db
  3. User Name:zwc
  4. Passwrod:123456

连接成功后,进入到 osc_db 库中查看Collections: to_visit_log,存放着全部访问记录

8.5 service_kafka_manager

  1. 访问http://ip:9000
  2. 点击顶部Cluster->Add Cluster
  3. Cluster Name:osc_cluster
  4. Cluster Zookeeper Hosts:zoo:2181
  5. 点击Go to cluster view.
  6. 接下来就可以查看TopicsBrokers信息了

8.6 service_registry

  1. 访问http://ip:8761

8.7 service_turbine

  1. 访问http://ip:8762/hystrix/monitor?stream=http://ip:8762/turbine.stream

8.8 service_sleuth

  1. 访问http://ip:9411/zipkin,点击 Find Traces 蓝色按钮
  2. 访问http://ip:9411/zipkin/dependency/

9. 结语


部署也将变得很容易,搭建环境不再是头疼的问题。阿,快乐。


10. 相关文章


10.1 准备工作

「初学者商城」- 写在最前面

10.2 搭建基础架构

「初学者商城」- 搭建基础架构(接口)

「初学者商城」- 搭建基础架构(后台管理系统)

「初学者商城」- 搭建基础架构(部署)  👀

10.3 搭建本地开发环境

「初学者商城」- 搭建本地开发环境(JDK)

「初学者商城」- 搭建本地开发环境(Maven)

「初学者商城」- 搭建本地开发环境(Redis)

「初学者商城」- 搭建本地开发环境(MySQL)

「初学者商城」- 搭建本地开发环境(MongoDB)

「初学者商城」- 搭建本地开发环境(ZooKeeper)

「初学者商城」- 搭建本地开发环境(Kafka)


希望能够帮助到你

over




Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐