本文将以图文的形式说一下Mini-Mall
项目是如何在Linux环境下基于Docker部署的,主要包括JDK、Docker、MySQL、Nginx、Redis、MongoDB、RabbitMQ、ELK(非必须)、Seata、Zipkin(非必须)等。
前提条件:请先准备好CentOS 7
服务器环境,服务器内存最好在8G以上。
其它说明:
- 远程工具:SecureCRT
- 文件传输工具:WinSCP
1. JDK
1.1 下载安装包
- 版本:
jdk-8u171-linux-x64
- 下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
1.2 解压并配置变量
- 解压到
/usr/local/jdk1.8
中
# 解压
tar -zxvf jdk-8u171-linux-x64.tar.gz
# 移动到/usr/local/jdk1.8下
mv jdk1.8.0_171 /usr/local/jdk1.8/
- 配置环境变量
# 编辑/etc/profile
vim /etc/profile
# 在profile文件末尾添加以下内容
export JAVA_HOME=/usr/local/jdk1.8/jdk1.8.0_171
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
# 生效环境变量
source /etc/profile
1.3 测试
使用java -version
命令测试是否安装成功。
2. Docker
官网地址:https://www.docker.com/,安装过程如下:
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y (这个步骤需要一定的时间,可能会失败,失败后重新执行)
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
- 启动docker服务:
systemctl start docker
- 停止docker服务:
systemctl stop docker
- 设置开机启动docker服务:
systemctl enable docker
更多Docker详情内容,可参考《学习Docker,这里没有废话》这篇文章。
3. MySQL
-
拉取mysql镜像
docker pull mysql:5.6
-
创建并启动容器
docker run -id \ -p 3306:3306 \ --name=mysql \ -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \ -v /usr/local/docker/mysql/logs:/logs \ -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=Anbang713 \ mysql:5.6
-
进入到mysql容器
docker exec -it mysql /bin/bash
-
登录mysql,设置root可以通过任何客户端连接
# 1.登录mysql mysql -u root -p # 2.设置root用户可以远程访问 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "Anbang713"; # 3.刷新权限 flush privileges;
-
客户端连接测试
- 创建数据库和表
将项目工程中的mall-doc
下对应各个微服务的数据库执行脚本导入即可。
4. Nginx
-
拉取nginx镜像
docker pull nginx
-
编写nginx.conf
# 创建nginx.conf,添加以下内容 vim /var/local/docker/nginx/conf/nginx.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; server { listen 80; server_name api.mall.com; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; # 转发时,携带自身的host,而不是转发后的host:127.0.0.1 location / { proxy_pass http://192.168.1.17:9015; #将请求转发到网关 proxy_connect_timeout 600; proxy_read_timeout 600; } } server { listen 80; server_name manage.mall.com; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; location / { root /usr/share/nginx/html/mini-mall-web; #这里配的是docker里nginx的文件路径而不是虚拟机的文件路径 autoindex on; } } }
-
创建并启动容器
docker run -id \ --name=nginx \ -p 80:80 \ -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /usr/local/docker/nginx/logs:/var/log/nginx \ -v /usr/local/docker/nginx/html:/usr/share/nginx/html \ nginx
-
浏览器访问nginx
注意:别忘记在/etc/hosts
文件里添加api.mall.com
和manage.mall.com
的映射。
5. Redis
-
拉取redis镜像
docker pull redis:5.0
-
创建并启动容器
docker run -id --name=redis -p 6379:6379 redis:5.0
-
客户端连接测试
6. MongoDB
-
拉取镜像
docker pull mongo
-
创建并启动容器
docker run -id \ --name=mongodb \ -p 27017:27017 \ -v /usr/local/docker/mongodb/db:/data/db \ mongo
7. RabbitMQ
-
拉取镜像
# 带控制台 docker pull rabbitmq:management
-
创建并启动容器
docker run -id --name rabbitmq -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=Anbang713 -p 15672:15672 -p 5672:5672 rabbitmq:management
-
浏览器访问控制台测试
8. Seata
-
拉取镜像
docker pull seataio/seata-server
-
创建并启动容器
docker run -id \ --name seata-server \ -p 8091:8091 \ -e SEATA_CONFIG_NAME=file:/root/seata-config/registry \ -v /usr/local/docker/seata/conf/:/root/seata-config \ -v /usr/local/docker/seata/logs/:/root/logs \ seataio/seata-server
-
配置文件
- register.conf
registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa type = "eureka" nacos { serverAddr = "localhost" namespace = "" cluster = "default" } eureka { serviceUrl = "http://Anbang713:pwd713@localhost:9010/eureka" application = "default" weight = "1" } redis { serverAddr = "localhost:6379" db = "0" } zk { cluster = "default" serverAddr = "127.0.0.1:2181" session.timeout = 6000 connect.timeout = 2000 } consul { cluster = "default" serverAddr = "127.0.0.1:8500" } etcd3 { cluster = "default" serverAddr = "http://localhost:2379" } sofa { serverAddr = "127.0.0.1:9603" application = "default" region = "DEFAULT_ZONE" datacenter = "DefaultDataCenter" cluster = "default" group = "SEATA_GROUP" addressWaitTime = "3000" } file { name = "file.conf" } } config { # file、nacos 、apollo、zk、consul、etcd3 type = "file" nacos { serverAddr = "localhost" namespace = "" group = "SEATA_GROUP" } consul { serverAddr = "127.0.0.1:8500" } apollo { app.id = "seata-server" apollo.meta = "http://192.168.1.204:8801" namespace = "application" } zk { serverAddr = "127.0.0.1:2181" session.timeout = 6000 connect.timeout = 2000 } etcd3 { serverAddr = "http://localhost:2379" } file { name = "file.conf" } }
- file.conf
## transaction log store, only used in seata-server store { ## store mode: file、db mode = "db" ## file store property file { ## store location dir dir = "sessionStore" # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions maxBranchSessionSize = 16384 # globe session size , if exceeded throws exceptions maxGlobalSessionSize = 512 # file buffer size , if exceeded allocate new buffer fileWriteBufferCacheSize = 16384 # when recover batch read size sessionReloadReadSize = 100 # async, sync flushDiskMode = async } ## database store property db { ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc. datasource = "dbcp" ## mysql/oracle/h2/oceanbase etc. dbType = "mysql" driverClassName = "com.mysql.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata" user = "root" password = "Anbang713" minConn = 1 maxConn = 10 globalTable = "global_table" branchTable = "branch_table" lockTable = "lock_table" queryLimit = 100 } }
-
测试
因为我们是使用Eureka作为Seata的注册配置中心,所以我们需要先启动Eureka,这里就先暂不测试。
9. Zipkin
-
拉取zipkin镜像
docker pull openzipkin/zipkin
-
创建并启动容器
docker run -id \ --name zipkin \ -p 9411:9411 \ -e STORAGE_TYPE=mysql \ -e MYSQL_DB=mall_zipkin \ -e MYSQL_USER=root \ -e MYSQL_PASS=Anbang713 \ -e MYSQL_HOST=192.168.1.17 \ -e MYSQL_TCP_PORT=3306 \ -e RABBIT_ADDRESSES=192.168.1.17:5672 \ -e RABBIT_USER=root \ -e RABBIT_PASSWORD=Anbang713 \ -e RABBIT_QUEUE=zipkin \ openzipkin/zipkin
-
测试
需要注意的是,启动Zipkin之前,我们要先启动mysql容器和RabbitMQ容器,而判断Zipkin是否启动成功很简单,打开RabbitMQ界面控制台,如果有自动创建zipkin队列,则说明启动成功。
10. Elastic Stack
注意:该技术栈的版本要统一,本次安装7.6.0(当前最新版本7.6.2)
10.1 ElasticSearch
官方安装说明文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
-
拉取镜像
docker pull elasticsearch:7.6.0
-
创建并启动容器
docker run -id \ --name elasticsearch \ -p 9200:9200 \ -p 9300:9300 \ -e "discovery.type=single-node" \ elasticsearch:7.6.0
-
测试
curl 127.0.0.1:9200
10.2 Kibana
官方安装说明文档:https://www.elastic.co/guide/en/kibana/current/docker.html
-
拉取镜像
docker pull kibana:7.6.0
-
创建并启动容器
docker run -id \ --name kibana \ -p 5601:5601 \ -v /usr/local/docker/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \ kibana:7.6.0
-
kibana.yml配置
server.name: kibana server.host: "0.0.0.0" elasticsearch.hosts: [ "http://192.168.1.17:9200" ] i18n.locale: "zh-CN"
-
浏览器访问测试
10.3 filebeat
官方安装说明文档:https://www.elastic.co/guide/en/beats/filebeat/current/running-on-docker.html
-
拉取镜像
docker pull store/elastic/filebeat:7.6.0
-
创建并启动容器
docker run -id \ --name filebeat \ -p 5044:5044 \ --volume="/usr/local/docker/elk/filebeat/mini-mall.yml:/usr/share/filebeat/filebeat.yml:ro" \ --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \ --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \ store/elastic/filebeat:7.6.0
-
filebeat.yml配置
filebeat.inputs: - type: log enabled: true paths: - /usr/local/mini-mall/logs/*/*.log - /var/lib/docker/containers/*/*-json.log setup.kibana: host: 192.168.1.17:5601 output.elasticsearch: hosts: ["192.168.1.17:9200"]
至此,所需的环境已全部搭建完成,后面我们需要将制作微服务镜像,让它们在Linux环境跑起来。下回见喽。