Dockerfile构建java运行环境
Maven&Java
wget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz --no-check-certificate
https://www.oracle.com/java/technologies/downloads/#java8
Dockerfile
FROM docker.io/centos:7
MAINTAINER lklbjn
RUN yum -y install vim
RUN yum install glibc-langpack-zh
RUN yum install kde-l10n-Chinese glibc-common -y
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
# 安装Python
# RUN yum update -y && yum install -y python3
ADD jdk-8u351-linux-x64.tar.gz /opt/localhost/
ADD apache-maven-3.8.6-bin.tar.gz /opt/localhost/
ENV LANG zh_CN.utf8
ENV LC_ALL zh_CN.utf8
ENV JAVA_HOME /opt/localhost/jdk1.8.0_351
ENV MAVEN_HOME /opt/localhost/apache-maven-3.8.6
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
ENV PATH $PATH:$MAVEN_HOME/bin
Build
docker build -t jdk:1.0.0 .
RUN
FROM jdk:1.0.0
ADD app.jar app.jar
RUN echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 8080
ENTRYPOINT ["sh","-c","java -jar app.jar --spring.profiles.active=$PROFILES"]
# 如果有Python可以使用以下代码
FROM jdk:1.0.0
ADD app.jar app.jar
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
COPY requirements.txt /python/requirements.txt
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r /python/requirements.txt
EXPOSE 8080
ENTRYPOINT ["sh","-c","java -jar app.jar --spring.profiles.active=$PROFILES"]
docker run -idt \
-p 10070:8080 \
--link mysql:mysql \
-e PROFILES=prod \
--restart=always \
--name electric electric:$1
Docker常用命令
docker inspect 容器id #查看镜像的元数据
docker save -o centos_jdk.tar xxxx/jdk:1.1.1 #将指定镜像保存成 tar 归档文件
docker load < centos_jdk.tar #导入使用 docker save 命令导出的镜像
docker rmi `docker images -q -f dangling=true`
Docker应用
安装MySQL
docker pull mysql:8.0.30
docker run \
--name mysql \
-d \
-p 13306:3306 \
--restart always \
--network common \
--network-alias mysql \
-v /usr/local/mysql/log:/log \
-v /usr/local/mysql/data:/data \
-v /usr/local/mysql/conf:/conf \
-v /usr/local/mysql/sql:/sql \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.30
docker exec -it mysql /bin/bash
docker volume inspect mysql
CREATE DATABASE IF NOT EXISTS ises
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
定时备份Docker下的Mysql数据
Linux
crontab e
*/1 * * * * /shell/mysql/backup-local.sh
crontab -l
service crond restart
# backup-docker.sh 放入docker容器内
time=$(date +'%Y%m%d')
mysqldump -u root -p123456 django> /sql/django${time}.sql
echo "`date +%Y/%m/%d-%H:%M:%S`数据备份成功"
# backup-local.sh 放入物理机内
docker exec -d mysql /bin/bash -c ". shell/backup.sh"
echo "`date +%Y/%m/%d-%H:%M:%S`数据备份成功" >> /usr/local/mysql/log/backup.log
chmod 777 backup-local.sh
show variables like '%log_bin%';
show master status;
show master logs;
# 查看binlog
show binlog events in 'mysql-bin.000007';
mysqldump -u root -p --master-data=2 --single-transaction -F -B ises > /data/mysqlbackup/fullbackup/ises20230103.sql;
# 恢复增量备份
mysqlbinlog master-bin.000007 | mysql -uroot -p123456
electric
time=$(date +'%Y%m%d')
mysqldump -u root -p abcd.1234 electric > /sql/electricity${time}.sql
echo "`date +%Y/%m/%d-%H:%M:%S`数据备份成功"
docker exec -d mysql /bin/bash -c ". data/backup-docker.sh"
echo "`date +%Y/%m/%d-%H:%M:%S`数据备份成功" >> /usr/local/mysql/log/backup.log
crontab e
0 0 0 * * * /home/electric/mysql/shell/backup-local.sh
*/1 * * * * /home/electric/mysql/shell/backup-local.sh
crontab -l
Windows
@echo off
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
md D:\mysite-backup\%Ymd%\
C:\"Program Files"\"mysql-server 5.7.14"\bin\mysqldump --opt -hx.x.x.x database > D:\database-backup\%Ymd%\database_%Ymd%.sql
echo "数据库备份完毕"
导入大文件(几十G)至表
只针对大表
show global variables like '%secure_file_priv%';
-- 在my.ini 或者 my.cnf中将 secure-file-priv设置如下(导入导出都需要设置):
secure-file-priv="" -- 允许所有
-- 导出数据文件
select * from django_admin_log into outfile '/sql/django_log.txt';
## 1 张三
## 2 李四
# -- 使用字符分隔符(terminated by )为逗号(',') 。使用字段引用符(enclosed by)为双引号( ' " ')
select * from django_admin_log into outfile '/sql/django_admin_log.txt' fields terminated by ',' enclosed by '"';
## "1" "张三"
## "2" "李四"
select * from django_admin_log into outfile '/sql/django_admin_log.txt' fields terminated by ',' optionally enclosed by '"';
## 1 "张三"
## 2 "李四"
-- 导入数据文件
load data infile 'C:\Users\wangbinzhe\Desktop\fsdownload\django_log.txt' into table django_admin_log;
# 导完之后最好还是改回去
安装MongoDB
docker pull mongo:6.0.2
docker run -d \
-p 27017:27017 \
--name mongo \
--restart always \
-v /data/mongo:/data/db \
mongo:6.0.2
docker run -d \
-p 27017:27017 \
--name mongo \
--restart always \
-v /data/mongo:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=1234 \
mongo:6.0.2
常用命令
DOS
mongosh -u root -p 1234
# 有则切换,无则新建
use user_db
# 需要先use数据库才能删除
db.dropDatabase()
# 创建集合
db.createCollection(name, options)
-- db.createCollection(website)
# 删除集合
db.collection_name.drop()
-- db.website.drop()
# 插入文档
db.collection_name.insert(document) -- 存在则更新,不存在则插入
db.collection_name.save(document) -- 若主键存在报异常
-- db.website.insert({name:"玛卡巴卡",url:"baidu.com"})
-- db.website.insert({name:"玛卡巴卡",url:"baidu.com"})
# 查询文档
db.collection_name.find(query, projection)
db.collection_name.findOne(query, projection)
# 更新文档
db.collection_name.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
-- db.website.update({name:"木樨地西"},{$set:{name:'玛卡巴卡',url:'www.baidu.com'}})
-- db.website.update({_id:ObjectId("6361f5efa42190252addd6df")},{$set:{name:'玛卡巴卡',url:'www.baidu.com'}})
-- 更新多个文档
-- db.website.update({name:"木樨地西"},{$set:{name:'玛卡巴卡',url:'www.baidu.com'}},{multi:true})
db.collection_name.save(
<document>,
{
writeConcern: <document>
}
)
/*db.course.save(
{
"_id" : ObjectId("603209d8e492ab9be9450304"),
"title" : "MongoDB教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"author" : "编程帮",
"url" : "http://www.biancheng.net/mongodb/index.html",
"likes" : 996
}
)*/
# 删除文档
db.collection_name.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
-- db.website.remove({'name':'玛卡巴卡'})
-- 删除其中的第一个文档
-- db.website.remove({'name':'玛卡巴卡'},{justOne:true})
-- 删除集合中的所有文档
-- db.website.remove({})
条件查询
AND条件
“title”=“MongoDB教程”同时“by”=“编程帮”
> db.mycol.find({$and:[{title:"MongoDB教程"}, {by:"编程帮"}]}).pretty() { "_id" : ObjectId("6031c02ae492ab9be9450302"), "title" : "MongoDB教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "编程帮", "url" : "http://www.biancheng.net", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 999 } > db.mycol.find({title:"MongoDB教程", by:"编程帮"}).pretty() { "_id" : ObjectId("6031c02ae492ab9be9450302"), "title" : "MongoDB教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "编程帮", "url" : "http://www.biancheng.net", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 999 }
OR条件
“title”=“MongoDB教程”或者“by”=“编程帮”
> db.mycol.find({$or:[{title:"MongoDB教程"}, {by:"编程帮"}]}).pretty() { "_id" : ObjectId("6031c02ae492ab9be9450302"), "title" : "MongoDB教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "编程帮", "url" : "http://www.biancheng.net", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 999 } { "_id" : ObjectId("6031c02ae492ab9be9450303"), "title" : "NoSQL数据库", "description" : "NoSQL数据库中没有数据表", "by" : "编程帮", "url" : "http://www.biancheng.net", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100, "comments" : [ { "user" : "admin", "message" : "第一个评论", "dateCreated" : ISODate("2021-02-09T18:35:00Z"), "like" : 0 } ] }
“where likes > 100 AND (by = '编程帮' OR title = 'MongoDB教程')”
> db.mycol.find({"likes": {$gt:100}, $or: [{"by": "编程帮"},{"title": "MongoDB教程"}]}).pretty() { "_id" : ObjectId("6031c02ae492ab9be9450302"), "title" : "MongoDB教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "编程帮", "url" : "http://www.biancheng.net", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 999 }
6
安装Memcache
// 安装Memcache
docker pull memcached:1.6.17
docker run \
--name memcache \
--restart=always \
-p 11211:11211 \
-d memcached:1.6.17 memcached \
-m 64
// 安装可视化工具
docker pull fuyong/treenms:1.0.0
docker run \
--restart=always \
--link memcache:memcache \
-p 11210:8080 --name treenms -d \
fuyong/treenms:1.0.0
安装Redis
docker pull redis:7.0.4
docker run \
--name redis \
--restart=always \
-p 16379:6379 \
--network common \
--network-alias redis \
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /home/redis/data:/data \
-d redis:7.0.4 \
redis-server /etc/redis/redis.conf \
--appendonly yes \
--requirepass 654321
安装tomcat
docker run -d -p 8080:8080 \
--restart=always \
--name tomcat \
-v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:7.0.109
docker exec -it tomcat /bin/bash
安装GitLab
vim install_gitlab.sh
#!/bin/bash
docker run -d -p 8443:443 -p 8080:80 -p 8022:22 \
--name gitlab \
--restart always \
-v /data/gitlab/config:/etc/gitlab \
-v /data/gitlab/log:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
安装Nginx
docker pull nginx:1.23.1
docker run -p 80:80 \
--name nginx \
-d nginx:1.23.1
mkdir /usr/local/nginx/conf
cd /usr/local/nginx/conf
docker container cp nginx:/etc/nginx .
docker stop nginx
docker rm nginx
docker run -p 80:80 \
--name nginx \
--restart=always \
--network common \
--network-alias nginx \
-v /home/nginx/www:/usr/share/nginx/html \
-v /home/nginx/file:/file \
-v /home/nginx/logs:/var/log/nginx \
-v /home/nginx/conf:/etc/nginx \
-d nginx:1.23.1
docker exec -it nginx /bin/bash
安装MQTT
Mosquitto
#TCP TLS WS WSS
docker run -it --name=mosquitto --privileged \
-p 1883:1883 -p 1884:1884 -p 9001:9001 -p 9002:9002 \
-v /home/mosquitto/config:/mosquitto/config \
-v /home/mosquitto/data:/mosquitto/data \
-v /home/mosquitto/log:/mosquitto/log \
-d eclipse-mosquitto:latest
用户名密码文件配置
#先创建密码文件并添加一个用户
mosquitto_passwd -c passwd wonde
#再次向密码文件中添加用户
mosquitto_passwd passwd wond 123456
mosquitto.conf 配置
# MQTT协议(tcp)
listener 1883
# 使用tls
#listener 1884
#cafile mosquitto\crt\root.crt #根证书
#certfile mosquitto\crt\public.crt #公共证书
#keyfile mosquitto\crt\cloud.key #密钥文件
# ws协议
listener 9001
protocol websockets
# 使用wss
#listener 9002
#protocol websockets
#cafile mosquitto\crt\root.crt #根证书
#certfile mosquitto\crt\public.crt #公共证书
#keyfile mosquitto\crt\cloud.key #密钥文件
# 配置密码文件
password_file /mosquitto/config/passwd
#allow_anonymous true # 默认开启
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
应用配置
# 应用配置
mosquitto -c mosquitto.conf –v
# 或者直接重启容器
#docker restart mosquitto
发布
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client = mqtt.Client()
client.on_connect = on_connect
client.connect("156.227.6.31", 1883, 60)
# 每间隔 1 秒钟向 raspberry/topic 发送一个消息,连续发送 5 次
for i in range(5):
# 四个参数分别为:主题,发送内容,QoS, 是否保留消息
client.publish('lklbjn/pulish', payload=i, qos=0, retain=False)
print(f"send {i} to raspberry/topic")
time.sleep(1)
client.loop_forever()
订阅
# subscriber.py
import paho.mqtt.client as mqtt
import ssl
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
# 订阅,需要放在 on_connect 里
client.subscribe("lamp", 1)
# 回调函数,当收到消息时,触发该函数
def on_message(client, userdata, msg):
print(f"{msg.topic} {msg.payload}")
client = mqtt.Client(transport="websockets")
# client = mqtt.Client()
client.ws_set_options(path='/mqtt') # 设置WebSocket路径
client.on_connect = on_connect
client.on_message = on_message
# context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# context.check_hostname = False
# client.tls_set_context(context)
# 设置遗嘱消息,当设备断电,或者网络出现异常中断时,发送遗嘱消息给其他客户端
client.will_set('lamp', b'{"status": "close link"}', 1)
# 设置用户名密码(如果有的话)
# client.username_pw_set('wonde', '123456')
# 创建连接,三个参数分别为 broker 地址,broker 端口号,保活时间
# client.connect("156.227.6.31", 1883, 60) # tcp连接
client.connect("156.227.6.31", 8083, 60) # ws连接
# 设置网络循环堵塞,在调用 disconnect() 或程序崩溃前,不会主动结束程序
client.loop_forever()
EMQX
## 企业版-要钱的
docker run -d --name emqx-ee -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx-ee:latest
## 社区版-开源免费
docker run -d \
--restart=always \
--name emqx \
-p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 \
-v /opt/emqx/log:/opt/emqx/log \
emqx/emqx:latest
#控制台:http://localhost:18083/
#默认用户名密码:admin/public