2024年最全Docker篇之秒杀项目环境部署_docker 算法环境部署(2),技术总监都拍手叫好

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#安装好后,可以查看docker的版本
docker -v

#修改Docker配置文件,使用国内的Docker镜像:
vi /etc/docker/daemon.json

添加以下内容

{“registry-mirrors”:[“https://ncwlarc2.mirror.aliyuncs.com”]}

#使之生效
systemctl daemon-reload

#重启
systemctl restart docker


安装Docker Compose



#国内资源(建议)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

将可执行权限应用于二进制文件:

chmod +x /usr/local/bin/docker-compose

创建软链:

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

docker-compose --version


JDK安装



jdk镜像仓库:https://repo.huaweicloud.com/java/jdk/8u171-b11/

下载、解压jdk

wget https://repo.huaweicloud.com/java/jdk/8u171-b11/jdk-8u171-linux-x64.tar.gz
tar -zxf jdk-8u171-linux-x64.tar.gz
mv jdk1.8.0_171 /usr/local/jdk8

配置环境

vi /etc/profile

添加内容:

export JAVA_HOME=/usr/local/jdk8
export PATH= J A V A _ H O M E / b i n : JAVA\_HOME/bin: JAVA_HOME/bin:PATH

配置生效命令

source /etc/profile
#查看j版本命令
java -version


unzip命令安装



yum install -y unzip


#### 2. 创建Nacos



启动容器

docker run -id --name nacos
–restart=always -p 8848:8848
-e MODE=standalone nacos/nacos-server:1.4.1


#### 3. 创建MySQL


后期要使用Canal,需要把MySQL的配置文件提取出来,所以要进行相关的配置文件的编写



#创建MySQL配置文件
mkdir -p /mnt/mysql/conf
#创建配置文件mysql.cnf
vim /mnt/mysql/conf/mysql.cnf

#内容如下:
[mysqld]

设置关闭二进制日志

skip-log-bin


启动MySQL容器



创建MySQL网络环境,指定子网网段

docker network create --subnet=172.36.0.0/16 seckill_network

启动MySQL 指定容器IP,固定IP地址

docker run -id --name seckill_mysql
–net seckill_network --ip 172.36.0.3
-v /mnt/mysql/data:/var/lib/mysql
-v /mnt/mysql/conf:/etc/mysql/conf.d
–restart=always -p 3306:3306
-e MYSQL_ROOT_PASSWORD=eVcWs1dsEgiv4ijEZ1b6 mysql:8.0.18


#### 4. 创建Canal数据同步


**配置MySQL**


需要让canal伪装成salve并正确获取mysql中的binary log,首先要开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式


修改MySQL配置文件,如下操作:



执行修改命令

vi /mnt/mysql/conf/mysql.cnf



配置文件 mysql.cnf 内容如下

[mysqld]

设置关闭二进制日志

#skip-log-bin

开启二进制日志

log-bin=mysql-bin

#开启binlog 选择ROW模式
binlog-format=ROW

#server_id不要和canal的slaveId重复
server_id=1


配置文件修改完成后重启MySQL



docker restart seckill_mysql


在MySQL中执行以下sql,查询数据库状态



show variables like ‘log_bin’;
show variables like ‘binlog_format’;
show master status;


创建连接MySQL的账号`canal`并授予作为 MySQL slave 的权限,执行以下sql:



创建账号

CREATE USER canal IDENTIFIED BY ‘canal’;

授予权限

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘canal’@‘%’;

修改数据库加密算法

ALTER USER ‘canal’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘canal’;

刷新并应用

FLUSH PRIVILEGES;


**创建并配置Cancal**


创建canal-server容器



docker run -d --name canal-server
–net seckill_network --ip 172.36.0.8
–restart=always -p 11111:11111
canal/canal-server:v1.1.4


配置Canal



进入Canal容器

docker exec -it canal-server /bin/bash

修改配置文件

vi /home/admin/canal-server/conf/example/instance.properties

instance.properties需要修改以下三个部分

修改Canal的slaveId,不能和MySQL的server_id重复

canal.instance.mysql.slaveId=101

修改需要进行同步操作的MySQL的连接地址

canal.instance.master.address=172.36.0.3:3306

修改需要进行监听的数据库表

canal.instance.filter.regex=seckill_goods.tb_sku

修改完成后重启Canal服务

docker restart canal-server


监听数据库表的配置 `canal.instance.filter.regex` 如下:



mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
常见例子:

  1. 所有表:.* or .\…
  2. canal schema下所有表: canal\…*
  3. canal下的以canal打头的表:canal\.canal.*
  4. canal schema下的一张表:canal.test1
  5. 多个规则组合使用:canal\…*,mysql.test1,mysql.test2 (逗号分隔)
    注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)

#### 5. 创建Elasticsearch和kibana


准备IK分词器



创建存放IK分词器的目录

mkdir -p /mnt/elasticsearch/plugins/ik

上传IK分词器

解压IK到指定路径

tar -xf ik-7.4.0.tar -C /mnt/elasticsearch/plugins/ik


启动docker服务



创建单机版elasticsearch容器

docker run -id --name elasticsearch
–net seckill_network --ip 172.36.0.13
-v /mnt/elasticsearch/plugins:/usr/share/elasticsearch/plugins
–restart=always -p 9200:9200 -p 9300:9300
-e “discovery.type=single-node” elasticsearch:7.4.0

创建kibana

docker run -id --name kibana --net seckill_network
-e ELASTICSEARCH_HOSTS=http://172.36.0.13:9200
–restart=always -p 5601:5601 kibana:7.4.0


连接kibana,测试中文分词



GET /_analyze
{
“analyzer”: “ik_smart”,
“text”: “乒乓球明年总冠军”
}


初始化索引库



GET goodsindex
PUT goodsindex
{
“mappings”: {
“properties”: {
“name”: {
“type”: “text”,
“analyzer”: “ik_smart”
},
“price”: {
“type”: “long”
},
“seckillPrice”: {
“type”: “long”
},
“image”: {
“type”: “text”
},
“updateTime”: {
“type”: “date”
},
“category1Id”: {
“type”: “text”
},
“category2Id”: {
“type”: “text”
},
“category3Id”: {
“type”: “text”
},
“category1Name”: {
“type”: “keyword”
},
“category2Name”: {
“type”: “keyword”
},
“category3Name”: {
“type”: “keyword”
},
“brandName”: {
“type”: “keyword”
},
“bgtime”: {
“type”: “keyword”
},
“brandId”: {
“type”: “text”
},
“seckillBegin”: {
“type”: “date”
},
“seckillEnd”: {
“type”: “date”
},
“status”: {
“type”: “integer”
},

		"spec": {		
			"type": "text"
		},
		
		"points": {	
			"type": "integer"
		}
	}
}

}


#### 6. 创建Redis集群


准备环境:



#创建文件目录
mkdir -p /mnt/redis/r1/data
mkdir -p /mnt/redis/r2/data
mkdir -p /mnt/redis/r3/data
mkdir -p /mnt/redis/r4/data
mkdir -p /mnt/redis/r5/data
mkdir -p /mnt/redis/r6/data


准备Redis配置文件,需要准备6份,第一份:


执行命令 `vi /mnt/redis/r1/redis.conf` 内容为:



port 7001
bind 0.0.0.0
protected-mode no
databases 1
appendonly yes
#开启集群
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000


配置文件注意路径不同,端口号为7001~7006


编写 `vim /mnt/redis/docker-compose.yml` ,内容为:



version: “3.6”
services:
redis1:
container_name: redis1
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r1/redis.conf:/config/redis.conf
- /mnt/redis/r1/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always
redis2:
container_name: redis2
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r2/redis.conf:/config/redis.conf
- /mnt/redis/r2/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always
redis3:
container_name: redis3
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r3/redis.conf:/config/redis.conf
- /mnt/redis/r3/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always
redis4:
container_name: redis4
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r4/redis.conf:/config/redis.conf
- /mnt/redis/r4/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always
redis5:
container_name: redis5
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r5/redis.conf:/config/redis.conf
- /mnt/redis/r5/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always
redis6:
container_name: redis6
image: redis:5.0.9
network_mode: host
volumes:
- /mnt/redis/r6/redis.conf:/config/redis.conf
- /mnt/redis/r6/data:/data
command: [ “redis-server”, /config/redis.conf ]
restart: always


执行服务编排:



#进入指定路径
cd /mnt/redis

#服务编排启动Redis集群
docker-compose up -d


启动集群:



进入容器内部

docker exec -it redis1 /bin/bash

#执行Redis集群创建命令,注意要修改所有的192.168.200.188为自己设备的实际IP,如果使用云服务器,则使用公网IP
redis-cli --cluster create 192.168.200.188:7001 192.168.200.188:7002 192.168.200.188:7003 192.168.200.188:7004 192.168.200.188:7005 192.168.200.188:7006 --cluster-replicas 1

redis-cli --cluster create 39.103.206.202:7001 39.103.206.202:7002 39.103.206.202:7003 39.103.206.202:7004 39.103.206.202:7005 39.103.206.202:7006 --cluster-replicas 1

#集群节点信息
redis-cli -p 7001 cluster nodes

连接集群

redis-cli -h 127.0.0.1 -p 7001 -c


*如果卡在 `Waiting for the cluster to join`  这一步,检查端口号是否开放。redis集群除了需要使用7001~7006,还需要开通集群总线端口,端口号为redis端口号+10000 在这里就是端口号为17001~17006的都需要开放*


**注意:**


集群启动成功后,需要在宿主机中检查集群节点的配置文件(Ctrl+d可以退出容器)



#查看配置文件命令:
cat vi /mnt/redis/r1/data/nodes.conf

如果出现内网IP(例如172.x.x.x),则需要修改宿主机的集群配置文件

检查6个配置文件,把所有的内网IP都改为当前公网IP

在宿主机分别执行以下命令,分别进行修改:

vi /mnt/redis/r1/data/nodes.conf
vi /mnt/redis/r2/data/nodes.conf
vi /mnt/redis/r3/data/nodes.conf
vi /mnt/redis/r4/data/nodes.conf
vi /mnt/redis/r5/data/nodes.conf
vi /mnt/redis/r6/data/nodes.conf

#服务编排启动Redis集群
docker-compose up -d

#服务编排停止Redis集群并删除容器
docker-compose down


#### 7. 创建Zookeeper



docker run -d --name zk
–net seckill_network --ip 172.36.0.16
–restart=always
-v /etc/localtime:/etc/localtime
-p 3181:2181 zookeeper:3.4.14


#### 8. 创建Kafka


创建Kafka之前,必须先确保Zookeeper已经存在,请先确认 `7.创建Zookeeper` 是否完成。


使用Docker启动Kafka:



docker run -d --name kafka
–restart=always -p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.200.188:3181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.200.188:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
-v /etc/localtime:/etc/localtime
wurstmeister/kafka:2.12-2.4.1


注意:需要修改192.168.200.188为宿主机的实际ip地址(如果有公网IP,填写公网IP地址)


**测试Kafka**


创建队列:



进入容器

docker exec -it kafka /bin/bash

进入目录

cd /opt/kafka_2.12-2.4.1/bin

创建队列

./kafka-topics.sh --create --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 --topic itemaccess


使用kafka-topics.sh创建队列:  
 –create:执行创建一个新的队列操作


​ --bootstrap-server:需要链接的kafka配置,必填


​ --partitions 1:设置一个topic设置几个分区(就是把数据切割成几块,分别存储)


​ --replication-factor 1:设置分区的副本数量(就是设置多少个备份,有了备份,一个挂了没事,可以使用备份)


​ --topic itemaccess:队列的名字叫itemaccess


消息发布


在kafka容器中执行消息发送(接着上面的步骤执行):



发送消息

./kafka-console-producer.sh --broker-list localhost:9092 --topic itemaccess

发送内容为

{“actime”:“2021-4-10 9:50:10”,“uri”:“http://www-seckill.itheima.net/items/333.html”,“IP”:“119.123.33.231”,“Token”:“Bearer itcast”}


消息订阅



进入容器

docker exec -it kafka /bin/bash

进入目录

cd /opt/kafka_2.12-2.4.1/bin

订阅消息

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic itemaccess --from-beginning


其他命令



进入容器

docker exec -it kafka /bin/bash

进入目录

cd /opt/kafka_2.12-2.4.1/bin

查看topic列表

./kafka-topics.sh --bootstrap-server localhost:9092 --list

查看指定的topic信息

./kafka-topics.sh --bootstrap-server localhost:9092 --list

删除topics

./kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic itemaccess2


#### 9. 创建OpenRestry


如果因为本地计算机的内存不够,不能使用本地虚拟机而使用云服务器,最好还是把OpenRestry放在本地。


也就是说,**除了OpenRestry以外的服务都可以安装到云服务器上,OpenRestry需要安装到本地虚拟机中**。后面在进行秒杀抢单的时候,需要进行Nginx转发,OpenRestry在本地更方便配置。


##### 9.1 安装OpenRestry


安装OpenRestry:



安装环境

yum -y install pcre-devel openssl-devel gcc curl

上传openresty-1.11.2.5.tar.gz

解压

tar -xf openresty-1.11.2.5.tar.gz

进入到解压目录

cd openresty-1.11.2.5

安装

./configure --prefix=/usr/local/openresty
–with-luajit
–without-http_redis2_module
–with-http_stub_status_module
–with-http_v2_module
–with-http_gzip_static_module
–with-http_sub_module

编译

make
#安装
make install


配置环境变量:



修改环境文件

vi /etc/profile

修改为以下内容

export JAVA_HOME=/usr/local/jdk8
export OPENRESTY_HOME=/usr/local/openresty/nginx
export PATH= J A V A _ H O M E / b i n : JAVA\_HOME/bin: JAVA_HOME/bin:OPENRESTY_HOME/sbin:$PATH

使环境文件生效

source /etc/profile


##### 9.2 安装Lua的Kafka插件



上传lua-resty-kafka-master.zip

解压

unzip lua-resty-kafka-master.zip

移动到指定目录

mv lua-resty-kafka-master /usr/local/openresty/

修改nginx.conf

vi /usr/local/openresty/nginx/conf/nginx.conf

添加内容 在配置文件中指定lua-resty-kafka的库文件位置

配置到http里面,和server平级

lua_package_path “/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;”;


配置效果如下:



http {

#gzip on;

#添加内容 在配置文件中指定lua-resty-kafka的库文件位置
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";


server {
    listen       80;
    server_name  localhost;   
    
......

}


##### 9.2 安装Lua的Jwt插件



安装环境

yum install -y yum-utils

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

http里面,和server平级
lua_package_path “/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;”;


配置效果如下:



http {

#gzip on;

#添加内容 在配置文件中指定lua-resty-kafka的库文件位置
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";


server {
    listen       80;
    server_name  localhost;   
    
......

}


##### 9.2 安装Lua的Jwt插件



安装环境

yum install -y yum-utils

[外链图片转存中…(img-zGHzn48N-1714893635254)]
[外链图片转存中…(img-LkG1E0Lo-1714893635254)]
[外链图片转存中…(img-D5F3V25Y-1714893635254)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值