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
注:對於標籤的說明「初學者商城」- 寫在最前面 #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 配置文件中修改瞭如下幾點
- daemonize no:前臺啓動,在 Docker 中後臺啓動 Redis 容器會報錯
- requirepass 123456789:設置密碼
- # 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:① 配置文件 ② 數據目錄 ③ 日誌目錄
注:
-
volumes 映射的數據目錄
./data/nginx/
,就是 service_vue 服務從容器中映射出來的 Vue 打包後的靜態文件,container_vue 容器 映射到 宿主機,宿主機 映射到 container_nginx 容器,所以這裏需要在 depends_on 中配置 service_vue 服務等待 Vue 打包結束。這樣,啓動時靜態文件就會直接被映射到 Nginx 的訪問目錄中。 -
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 使用我的鏡像部署發佈
注:如果使用我的鏡像部署發佈的話,會簡單很多,推薦先試驗一下
- 下載
v1.0
標籤的代碼 - 把下載下來的
osc-build-1.0
目錄拷貝到服務器或者虛擬機中 - 進入到目錄中
- 日誌目錄需要賦值權限:chmod -R 777 log/
- 如果沒有安裝
Docker
和docker-compose
請先前往:CentOS7中安裝Docker,CentOS7中安裝Docker-Compose - 後臺啓動:docker-compose up -d
- 啓動情況:docker ps -a
7.2 使用你自己的鏡像部署發佈
- 具體操作步驟請前往:CentOS7中使用docker-compose快速部署前後端分離項目
8. 驗證
注:服務器需要開啓防火牆,並且需要把端口都開放出來以及加到安全組中
8.1 後臺管理系統
- 訪問
http://ip:9527
- 顯示
success
,表示成功
8.2 Navicat 連接 MySQL 容器
在 Navicat 中新建 MySQL 連接:
- 主機:服務器 ip
- 端口:3306
- 用戶名:root
- 密碼:123456
連接成功後,進入到 osc_db 庫中,目前裏面只有兩張表:
flyway_schema_history
是 Flyway 自動生成的,用來記錄版本信息的表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:
- Name:取個名
Authentication:
- 勾選 Perform authentication
- Database:osc_db
- User Name:zwc
- Passwrod:123456
連接成功後,進入到 osc_db 庫中查看Collections: to_visit_log
,存放着全部訪問記錄
8.5 service_kafka_manager
- 訪問
http://ip:9000
- 點擊頂部
Cluster
->Add Cluster
- Cluster Name:osc_cluster
- Cluster Zookeeper Hosts:zoo:2181
- 點擊
Go to cluster view.
- 接下來就可以查看
Topics
和Brokers
信息了
8.6 service_registry
- 訪問
http://ip:8761
8.7 service_turbine
- 訪問
http://ip:8762/hystrix/monitor?stream=http://ip:8762/turbine.stream
8.8 service_sleuth
- 訪問
http://ip:9411/zipkin
,點擊 Find Traces 藍色按鈕 - 訪問
http://ip:9411/zipkin/dependency/
9. 結語
部署也將變得很容易,搭建環境不再是頭疼的問題。阿,快樂。
10. 相關文章
10.1 準備工作
10.2 搭建基礎架構
10.3 搭建本地開發環境
希望能夠幫助到你
over