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