继开 | 博客

热爱生活,努力学习,实现自己的价值


  • 短诗的序

  • 迷途自渡

  • 寒星三两

  • 林深见鹿

  • 记昨日书

  • 顾探往昔

Linux分卷和挂载

发表于 2022-10-17
字数统计: 464 字 | 阅读时长 ≈ 2 min

这些命令都是创建LVM所需要的(很重要)

添加一块硬盘

1
[root@centos ~]# fdisk /dev/sdc (创建4个主分区,每个分区2G)

p 查看分区
n 创建分区
t 改分区类型(8e为LVM)
m 显示帮助
w 保存退出

进入创建完分区,需要再将分区类型给为8e也就是lvm

1
2
3
4
[root@centos ~]# partx -a /dev/sdc(添加调整后的磁盘分区信息)
[root@centos ~]# lsblk (列举出系统块设备信息,也就是硬盘)
[root@centos ~]# pvcreate /dev/sdc{1,2,3,4} (创建物理卷)
[root@centos ~]# pvdisplay (查看物理卷信息,如果想要单一查看指信息,在后边加上该卷地址)

步骤2、创建卷组(vg)

1
2
[root@centos ~]# vgcreate vg03 /dev/sdb1(将sdb1放入vg03卷组中)
[root@centos ~]# vgs(返回卷组信息,查看是否创建成功)

步骤3、创建逻辑卷(lv)

1
2
[root@centos ~]# lvcreate -n lv01 -L 16M vg03(-n 指定 新逻辑卷的名称 -L 指定逻辑卷的大小 最后的vg03是将新创建的逻辑卷放到vg03的卷组中)
[root@centos ~]# lvs(查看已创建的逻辑卷)

步骤4、格式化

1
2
3
[root@centos ~]# mkdir /data(创建一个空目录用来挂载)
[root@centos ~]# ls /dev/vg03(查看逻辑卷)
[root@centos ~]# mkfs.ext4 /dev/vg03/lv02 (将逻辑卷lv02格式化成ext4格式)

步骤5、挂载

1
2
[root@centos ~]# mount /dev/vg03/lv02 /data(将逻辑卷挂载到刚刚创建的空目录下)
[root@centos ~]# vi /etc/fstab

在文档中添加

1
/dev/vg03/lv02 /data ext4 defaults 0 0

保存退出
完成永久挂载

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Linux远程免密登录

发表于 2022-10-16
字数统计: 556 字 | 阅读时长 ≈ 2 min

两台linux 服务器,实现linux11 免密登录linux12

预设环境说明
假设 linux11 地址:10.10.10.11 用户为 root

假设 linux12 地址:10.10.10.12 用户为 root

Linux 环境为 centos 7

在linux11 上执行
生成 SSH 密钥对
如果本地机器已经生成过 SSH 密钥对,可跳过此步骤。

使用 ssh-keygen 命令生成密钥

1
2
3
4
5
# 使用 ED25519 加密算法生成
ssh-keygen -t ED25519 -C "some comments"

# 也可以使用默认的 RSA 加密算法
ssh-keygen -t RSA -C "some

ssh-keygen 参数用法可参考网络。

根据后续命令(文件名称、密码等)提示生成密钥对。

假如使用的是 ED25519 算法,使用默认配置生成密钥对,不设置密码,那么应该可以在用户根目录找到:

私钥文件 \root.ssh\id_ed25519
公钥文件 \root.ssh\id_ed25519.pub
后边步骤我们将用到公钥文件 id_ed25519.pub
注意,.ssh 为隐藏文件夹

在 Linux 上添加公钥
检查 sshd 服务状态,并查看服务端口(默认端口 22,如果不是 22 则使用 ssh 命令时需要使用 ssh -P {端口号} 指定端口号)。

1
systemctl status sshd

如果服务已启动,则可以看到服务状态,查看服务端口

如果 SSH 服务端没有安装/启动,则应该先安装/启动 SSH 服务。

查看 SSH 服务配置 /etc/ssh/sshd_config,添加 PubkeyAuthentication yes,允许使用公钥免密认证 SSH 登陆。

1
/etc/ssh/sshd_config

也可以查看到认证公钥文件配置

一般默认为 AuthorizedKeyFile .ssh/authorized_keys

将linux11 公钥 id_ed25519.pub 中的内容复制到 linux12 /root/.ssh/authorized_keys 文件夹中。

如果 /root/.ssh/authorized_keys 文件不存在,直接创建文件即可。

添加完之后,重启 linux12 的 SSH 服务,

1
systemctl restart sshd

即可使用 linux11免密登陆 linux12

1
ssh root@10.10.10.12 -P 22

注意第一次免密,要填写yes 同意协议

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

中年油腻男

发表于 2022-08-12
字数统计: 914 字 | 阅读时长 ≈ 3 min
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
中年油腻男

做为一个中年油腻大叔,如何清脂,降低油腻,对自己时时告诚,最重要一条,大街上,即使遇到一个天女下凡,也別一个劲瞅着不放,至多停留五秒,应该保持一个男人的矜持与尊严!

本人做为一个中年资深油腻大叔,十分注意社会的目光,生怕为别人添麻烦,引他人侧目,为严格自律,避免给社会大煞风景,为自己制定几条守则。


一、工作生活中,尽量非必要,少与年轻美女接触,如果必须打交道,做到不苟言笑,有礼有节,办完事情,少啰嗦,立马走人。

二、人群中,特别是注意有女性在场,杜绝讲黄段子及开低俗玩笑,大丈夫应该为人矜持,不苟言笑,没事干,多看书学习。

三、在公交,地铁,火车等公共场合,不与任何美女搭讪,更不能目不转睛盯着看,不主动帮助任何美女,不大献殷勤,从而招至白眼。如不主动开门,不主动为其拿行李箱,不主动介绍方向线路等,当然,七十岁上的美女,可以例外。

四、穿衣打扮一定要注意个人形象,不穿所谓的唐装,不戴各种莫名其妙的珠子及大金链子,不戴手串,不穿任何带有L0G0标志的衣服,不去装嫩,与年轻人抢风头,衣着简单大方,舒适即可。

五、公交车,地铁,动车,电梯里,影剧院等公共场合,尽量不与年轻美女同座位或挨擦,如果人群拥挤,周围美女如云,应该学习唐三藏,最好紧闭双目,收腹挺胸,目不邪视,以免让人误解乘机揩油。

六、注意个人卫生,勤洗澡理发,减少老人味,以免熏着各位美女帅哥,如果脑袋已经呈地中海,应该剃光头,干净凉爽,六根清净。多剪指甲,勤剪鼻毛,不当众吐痰,不当众剔牙,不当众抠鼻屎或打喷嚏,用完公共卫生间,冲洗干净。

七、不去跳广场舞,不去高峰期挤公交,不参加超市的任何活动,不去领免费的鸡蛋或大米,不参加任何讲座,公共场合,不大声喧哗,不旁若无人的哈哈大笑。

八、不参加年轻人的举办的活动,不吹牛逼,不倚老卖老,不吹嘘自己的过去的辉煌,不好人为师,不去说教年轻人,年轻人犯的错误,由他自己承担,前面有悬崖,年轻人愿意跨过,那是年轻人的选择自由,不要旁边大呼小叫。

九、闲暇之余,可自斟自饮,一壶老酒,一壶香茗,几味小菜,摇晃着安乐椅,回味盘点人生,岂不美哉?下午,上郊外荒无人至,踏青赏花,戏水观虫,岂不快哉?夜深人静,睡不着觉,可读书,当然拒绝网络文章,选择经典,古人云”书中自有黄金屋,书中自有颜如玉。“,又说”雪夜闭门读禁书 ,不亦快哉!“。

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Docker-Compose搭建nginx

发表于 2022-08-11
字数统计: 451 字 | 阅读时长 ≈ 2 min

test-nginx.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#mkdir -p /data/test-nginx/{html,conf,conf.d,logs}
#启动前将nginx.conf 放到 /data/test-nginx/conf 目录下
#启动前将test-nginx.conf 放到 /data/test-nginx/conf.d 目录下
#docker-compose -f test-nginx.yml up -d
#docker-compose.yml 配置文件如下
version: "3"
services:
test-nginx:
image: nginx
ports:
- "80:80"
volumes:
- /data/test-nginx/html:/usr/share/nginx/html
- /data/test-nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /data/test-nginx/conf.d:/etc/nginx/conf.d
- /data/test-nginx/logs:/var/log/nginx
restart: always
container_name: test-nginx
networks:
test-net:
ipv4_address: 173.100.0.3
networks:
test-net:
external: true

nginx.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

test-nginx.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 80;
server_name localhost;

# rewrite ^(.*)$ https://www.vhxsl.com permanent;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

#若需要转发
location /zhuanfa/ {
proxy_pass http://192.168.1.139:80/zhuanfa/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
}

.将一个 index.html 放到 /data/test-nginx/html
index.html随便写都可以

在外部浏览器可以访问 http://ip:80/

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Docker 常用命令

发表于 2022-08-10
字数统计: 3,115 字 | 阅读时长 ≈ 16 min

Docker常用的实用命令

官网命令

网址:https://docs.docker.com/engine/reference/run/

可以看到里面有所有的关于docker命令行的操作命令

帮助命令

语法:

1
docker 命令 --help

功能:帮助命令,好用的帮助查询命令。

比如我们现在想知道 docker run 里面的各项参数的含义是什么的话,那么我们可以输入以下命令:

1
docker run --help

出现以下界面则表示将所有可选项参数都给我们展示出来了,对我们后续的查询及提供帮助文档非常实用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
[root@localhost data]# docker run --help

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
--cgroupns string Cgroup namespace to use (host|private)
'host': Run the container in the Docker host's cgroup namespace
'private': Run the container in its own private cgroup namespace
'': Use the cgroup namespace as configured by the
default-cgroupns-mode option on the daemon (default)
--cidfile string Write the container ID to the file
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-d, --detach Run container in background and print container ID
--detach-keys string Override the key sequence for detaching a container
--device list Add a host device to the container
--device-cgroup-rule list Add a rule to the cgroup allowed devices list
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-read-iops list Limit read rate (IO per second) from a device (default [])
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
--device-write-iops list Limit write rate (IO per second) to a device (default [])
--disable-content-trust Skip image verification (default true)
--dns list Set custom DNS servers
--dns-option list Set DNS options
--dns-search list Set custom DNS search domains
--domainname string Container NIS domain name
--entrypoint string Overwrite the default ENTRYPOINT of the image
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
--expose list Expose a port or a range of ports
--gpus gpu-request GPU devices to add to the container ('all' to pass all GPUs)
--group-add list Add additional groups to join
--health-cmd string Command to run to check health
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
--health-retries int Consecutive failures needed to report unhealthy
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
--help Print usage
-h, --hostname string Container host name
--init Run an init inside the container that forwards signals and reaps processes
-i, --interactive Keep STDIN open even if not attached
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--ipc string IPC mode to use
--isolation string Container isolation technology
--kernel-memory bytes Kernel memory limit
-l, --label list Set meta data on a container
--label-file list Read in a line delimited file of labels
--link list Add link to another container
--link-local-ip list Container IPv4/IPv6 link-local addresses
--log-driver string Logging driver for the container
--log-opt list Log driver options
--mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
--mount mount Attach a filesystem mount to the container
--name string Assign a name to the container
--network network Connect a container to a network
--network-alias list Add network-scoped alias for the container
--no-healthcheck Disable any container-specified HEALTHCHECK
--oom-kill-disable Disable OOM Killer
--oom-score-adj int Tune host's OOM preferences (-1000 to 1000)
--pid string PID namespace to use
--pids-limit int Tune container pids limit (set -1 for unlimited)
--platform string Set platform if server is multi-platform capable
--privileged Give extended privileges to this container
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
--pull string Pull image before running ("always"|"missing"|"never") (default "missing")
--read-only Mount the container's root filesystem as read only
--restart string Restart policy to apply when a container exits (default "no")
--rm Automatically remove the container when it exits
--runtime string Runtime to use for this container
--security-opt list Security Options
--shm-size bytes Size of /dev/shm
--sig-proxy Proxy received signals to the process (default true)
--stop-signal string Signal to stop a container (default "SIGTERM")
--stop-timeout int Timeout (in seconds) to stop a container
--storage-opt list Storage driver options for the container
--sysctl map Sysctl options (default map[])
--tmpfs list Mount a tmpfs directory
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
--userns string User namespace to use
--uts string UTS namespace to use
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
-w, --workdir string Working directory inside the container

docker images

功能:列出所有镜像
命令:

1
docker images
1
2
3
4
5
6
7
8
9
[root@localhost data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5.0 071510791e92 8 months ago 110MB
nginx latest ea335eea17ab 8 months ago 141MB
mysql 5.7 8b43c6af2ad0 8 months ago 448MB
minio/minio RELEASE.2021-06-17T00-10-46Z a1f05d5aad90 14 months ago 296MB
titpetric/netdata latest b1110f52439e 2 years ago 299MB
java 8-alpine 3fd9dd82815c 5 years ago 145MB
java 8 d23bdf5b1b1b 5 years ago 643MB

名词解释:

表头 说明
REPOSITORY 镜像仓库源
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像的大小

可选项参数:

1
2
3
-a	 显示所有的镜像
-q 只显示镜像的id
-aq 显示所有镜像的Id

docker search

功能:搜索镜像

命令:

1
docker search mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost data]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12999 [OK]
mariadb MariaDB Server is a high performing open sou… 4982 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 597 [OK]
percona Percona Server is a fork of the MySQL relati… 583 [OK]
bitnami/mysql Bitnami MySQL Docker Image 72 [OK]
linuxserver/mysql-workbench 41
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 37
ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
circleci/mysql MySQL is a widely used, open-source relation… 26
google/mysql MySQL server for Google Compute Engine 21 [OK]
rapidfort/mysql RapidFort optimized, hardened image for MySQL 13
bitnami/mysqld-exporter 3
ibmcom/mysql-s390x Docker image for mysql-s390x 2
newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK]
vitess/mysqlctld vitess/mysqlctld 1 [OK]
hashicorp/mysql-portworx-demo 0
docksal/mysql MySQL service images for Docksal - https://d… 0
mirantis/mysql 0
cimg/mysql 0
drud/mysql 0
silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK]
corpusops/mysql https://github.com/corpusops/docker-images/ 0
drud/mysql-local-57 ddev mysql local container 0
drud/mysql-docker-local-57 This repo has been deprecated, new tags are … 0
drud/mysql-docker-local docker containers for local womysql rk 0 [OK]

docker pull

功能:下载镜像,它采用的是分层下载

下载最新版本
命令:

1
docker pull mysql

下载指定版本
命令:

1
docker pull mysql:5.7

docker rmi -f [镜像id]

功能:删除指定镜像
图片

删除指定镜像
命令:

1
docker rmi -f 7b94cda7ffc7

删除所有镜像
命令:

1
docker rmi -f $(docker images -aq)

docker run

功能:创建并启动一个容器

下载指定镜像
命令:

1
docker pull centos

创建并启动容器
命令:

1
docker run -it centos /bin/bash

docker ps

功能:列出所有正在运行的容器

列出所有正在运行的容器
命令:

1
docker ps

列出所有的容器(正在运行的容器和历史运行过的容器)
命令:

1
docker ps -a

docker rm -f [容器id]

功能:删除指定容器

删除指定容器
命令:

1
docker rm -f 9bc74608b76e

删除所有容器
命令:

1
docker rm -f $(docker ps -aq)

docker start [容器id]

功能:启动容器
命令:

1
docker start [容器id]

docker restart [容器id]

功能:重启容器
命令:

1
docker restart [容器id]

docker stop [容器id]

功能:停止当前正在运行的容器
命令:

1
docker stop [容器id]

docker kill [容器id]

功能:强制停止当前正在运行的容器

命令:

1
docker kill [容器id]

docker logs

功能:查看容器日志

查看指定时间后的日志,只显示最后100行:

1
docker logs -f -t --since="2022-08-08" --tail=100 CONTAINER_ID

查看最近30分钟的日志:

1
docker logs --since 30m CONTAINER_ID

查看某时间之后的日志:

1
docker logs -t --since="2022-08-18T11:46:37" CONTAINER_ID

查看某时间之后最新的100条日志:

1
docker logs -t --since="2022-08-08T11:46:37" --tail=100 CONTAINER_ID

查看某时间段日志:

1
docker logs -t --since="2022-08-18T11:46:37" --until "2022-08-18T11:47:37" CONTAINER_ID

打印匹配行的前后10行

1
docker logs CONTAINER_ID | grep -C 10 'error'

把日志写入文件:

1
docker logs -t CONTAINER_ID | grep 'error' >> logs_error.txt

进入容器

功能:进入容器

进入当前容器后开启一个新的终端,可以在里面操作。(常用)

1
docker exec -it 容器id /bin/bash

进入容器正在执行某个命令的终端,不能在里面操作

1
docker attach 容器id

容器数据卷

功能:挂载数据卷

查看所有卷的情况

1
docker volume ls

查看具体的卷信息

1
docker volume inspect 容器id

-v 容器内路径 匿名挂载(只写了内部的挂载路径)

1
docker run -d -P --name nginx01 -v /etc/nginx:rw nginx

-v 卷名:容器内路径 具名挂载

1
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
1
2
3
4
5
6
7
-v /宿主机路径:容器内路径  指定路径挂载



ro: 只读,只能通过宿主机改变

rw :可读可写(默认的)

所有容器内的卷,如果没有指定目录的情况下都是在/var/lib/dockervolumes/xxxx/_data

拷贝

功能:容器、宿主机文件互相拷贝

容器到宿主机

1
2
3
docker cp 容器id:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

docker cp 容器id:/opt/ansible/ansible/tox.ini /root

宿主机到容器

1
2
3
docker cp 要拷贝的文件路径 容器id:要拷贝到容器里面对应的路径

docker cp rabbitmq_delayed_message_exchange-3.8.0.ez 容器id:/opt/rabbitmq/plugins

更改容器时间

功能:修改容器的时间,有的时候,我们因为一些操作导致容器内的时间和宿主机时间不一致,这个时候我们可能需要进行修改。

1、以root身份进入容器

1
docker exec -it -u root 24795ac94ae7 /bin/sh

可以使用date -R 查看时间

2、在容器中创建文件

1
mkdir -p /usr/share/zoneinfo/Asia

3、回到宿主机,复制宿主机里的文件到容器中

1
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia

4、进入容器

1
docker exec -it -u root 容器Id或容器名 bash

执行命令

1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

图片

5、执行date -R 查看时区显示时间是否正确

docker内安装vim

功能:我们的docker容器内是一个小的虚拟机环境,它没有一些类似vim的命令,那我们在容器内使用这些命令的话就需要单独进行安装

第一步 配置国内镜像源
进入某个容器,例如进入mysql

1
docker exec -it mysql /bin/bash

1
2
3
4
5
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list

第二步:更新源

1
apt update

第三步安装vim

1
apt-get install vim

docker打包及导出

功能:将docker镜像打包进行导入导出

1、保存正在运行的容器为镜像commit(基本不使用)

1
docker commit 容器id/容器名称

2、保存正在运行的容器为镜像压缩包import/export

1
2
docker export 容器id > redis.tar
docker import 压缩包名称 自定义镜像名称

3、保存镜像为压缩包save/load

1
2
3
docker save 镜像id/镜像名称 > 包名称
docker save -o xxx.tar 镜像id
docker load < xxx.tar

一些区别:
export导出的镜像体积要小于save(save保存更完全,export会丢掉一些不必要的数据)
save可以将多个镜像打包到同一个文件中

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

ERROR:Error:java:java.lang.OutOfMemoryError:WrappedJavaFileObject

发表于 2022-07-24
字数统计: 389 字 | 阅读时长 ≈ 2 min

报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Error:java: java.lang.OutOfMemoryError: 
WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12128: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12178: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12288: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12325: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12768: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12822: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12873: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12912: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12973: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12976: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos13027: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos13003: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12996: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12994: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/workspace/test/system/service/impl/TaskServiceImpl.java]]
@pos12985: GC overhead limit exceeded

原因

编译时出现的ERROR,存在内存溢出的风险

解决办法

修改idea的编译空间

Settings —>Build,Execution,Deployment—> Complier

将Build process heap size(Mbytes) 调大,根据项目情况调整

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

阿里云Dataq发布的api 调用的工具类

发表于 2022-07-21
字数统计: 1,778 字 | 阅读时长 ≈ 9 min

说明

dataq 上有调用的示例,但是实际,自己新建的调用不通原因有以下几点需要注意

  1. akId,akSecret 这个是用户下面生成的,建议新生成一个,用原来老的有时会调用不通
  2. 租户信息TenantCode,这个一定要注意,没告诉你在哪,实际上是用户下面的 Tenant Code,在用户id的上面,非常不显眼,注意要用自己的
  3. 示例中没有说明需要跳过ssl证书,调用的时候会告诉你证书不可信,下面工具类已经自动跳过证书
  4. 使用main 方法直接跑调用,会报错,401 ,实际上是接口有限流,很多时候,多调用几次,就成功了
  5. 建议加报错重新调用的方法

工具类DataqUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
package com.example.utils;

import com.alibaba.fastjson.JSON;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import sun.misc.BASE64Encoder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public class DataqUtil {

//日志
protected final Log logger = LogFactory.getLog(getClass());

// ak信息
public final static String akId = "akId";//用户信息中生成
public final static String akSecret = "akSecret";// 用户信息中生成
// 租户信息
public final static String TenantCode= "TenantCode"; //租户信息需要在dataq 中查找tenant_一串数字

public final static String reqmethod = "POST";


/**
* 调用阿里dataQ
* @param url
* @param params
* @return
*/
public Map<String,Object> getDataQApi(String url,Map<String,String> params){
Map<String,Object> mapResult = new HashMap<String,Object>();

//参数
Map<String,Object> bodyMap = new HashMap<>();
bodyMap.put("params",params);
String body = JSON.toJSONString(bodyMap);
logger.trace("body---------------->"+body);

try {
// 生成签名,签名需要放在header里 重要 !!!!!
String signature = generateSignature(reqmethod, akId, akSecret, url, body);

// 创建http连接
URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setUseCaches(false);
// 设置信息校验的头部,重要 !!!!
conn.setRequestMethod(reqmethod);
// 设置租户信息 必填
conn.setRequestProperty("X-Access-TenantCode", TenantCode);

// accept 必填
conn.setRequestProperty("Accept", "json");
// contentType 必填
conn.setRequestProperty("Content-type", "application/json");
// 日期 必填
conn.setRequestProperty("date", toGMTString(new Date()));
// 签名 必填
conn.setRequestProperty("Authorization", signature);
// body体 md5 post/put必填( get请求不用填 )
conn.setRequestProperty("Content-MD5", MD5Base64(body));
conn.setDoOutput(true);
conn.setDoInput(true);
// 获得返回结果
String result = getResult(body, reqmethod, conn);

mapResult.put("data",result);
mapResult.put("code",conn.getResponseCode());

mapResult.put("success", true);
mapResult.put("msg", "查询成功!");
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (ProtocolException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
mapResult.put("data","");
mapResult.put("code","500");
mapResult.put("success", false);
mapResult.put("msg", "查询失败!");
}
return mapResult;

}

public static void main(String[] args) {
DataqUtil dataqUtil = new DataqUtil();
String url = "https://analysis.dataq.res.sgmc.sgcc.com.cn/analysis/api/service/ads_grid_sbbqk_byqgzzd_mf_update?workspaceCode=dataQ_sd";
Map<String,String> params = new HashMap<String,String>();
params.put("page","0");
params.put("rows","1000");
Map<String, Object> dataq = dataqUtil.getDataQApi(url,params);
System.out.print(dataq.toString());
}


//*************调用该类直接跳过ssl证书 start **********************
//*************调用该类直接跳过ssl证书 start **********************
//*************调用该类直接跳过ssl证书 start **********************

//调用该类直接跳过ssl证书
static {
try {
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier
(
(urlHostName, session) -> true
);
} catch (Exception e) {
}
}


/**
* 跳过ssl证书
*
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
private static void trustAllHttpsCertificates() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCerts = new TrustManager[1];
trustAllCerts[0] = (TrustManager) new TrustAllManager();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}

private static class TrustAllManager implements X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
}

//*************调用该类直接跳过ssl证书 end **********************
//*************调用该类直接跳过ssl证书 end **********************
//*************调用该类直接跳过ssl证书 end **********************




//*************dataq Api 调用的公共方法 start **********************
//*************dataq Api 调用的公共方法 start **********************
//*************dataq Api 调用的公共方法 start **********************

private static String getResult(String body, String method, HttpURLConnection conn) throws IOException {
PrintWriter out = new PrintWriter(conn.getOutputStream());
BufferedReader in = null;
String result = "";
try {
out.print(body);
out.flush();
System.out.println(conn.getResponseCode());
if (conn.getResponseCode() != 200) {
in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
} else {
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
}
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println(" " + method + " " + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}

private static String generateSignature(String method, String ak_id, String ak_secret, String url, String body) throws MalformedURLException {
URL realUrl = new URL(url);
String accept = "json";
String content_type = "application/json";
String path = realUrl.getFile();
String date = toGMTString(new Date());
String bodyMd5 = MD5Base64(body);
String stringToSign = "";
if (method.equals("GET")) {
stringToSign = method + "\n" + accept + "\n" + content_type + "\n" + date + "\n" + path;
} else {
stringToSign = method + "\n" + accept + "\n" + bodyMd5 + "\n" + content_type + "\n" + date + "\n" + path;
}
String signature = HMACSha1(stringToSign, ak_secret);
return "dtboost-proxy " + ak_id + ":" + signature;
}

public static String MD5Base64(String s) {
if (s == null)
return null;
String encodeStr = "";
byte[] utfBytes = s.getBytes();
MessageDigest mdTemp;
try {
mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(utfBytes);
byte[] md5Bytes = mdTemp.digest();
BASE64Encoder b64Encoder = new BASE64Encoder();
encodeStr = b64Encoder.encode(md5Bytes);
} catch (Exception e) {
throw new Error("Failed to generate MD5 : " + e.getMessage());
}
return encodeStr;
}

public static String HMACSha1(String data, String key) {
String result;
try {
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = (new BASE64Encoder()).encode(rawHmac);
} catch (Exception e) {
throw new Error("Failed to generate HMAC : " + e.getMessage());
}
return result;
}

public static String toGMTString(Date date) {
SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));
return df.format(date);
}

//*************dataq Api 调用的公共方法 end **********************
//*************dataq Api 调用的公共方法 end **********************
//*************dataq Api 调用的公共方法 end **********************

}

调用dataq

调用机制,失败重连机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 请求,增加报错,重连机制,
* 默认请求3次,失败之后,停 10秒,然后在进行重试
* @param url
* @param params
* @return
*/
public Map<String,Object> dataqReqAgein2(String url,Map<String,String> params) throws InterruptedException {
Map<String,Object> mapResult= new HashMap<>();
Boolean reqAgein = false;
// 最大重连次数;
int ageinNumMax = 2;
int ageinNum = 0;
do{
ageinNum ++;

DataqUtil dataqUtil = new DataqUtil();
Map<String, Object> data = dataqUtil.getDataQApi(url,params);
String code = String.valueOf(data.get("code"));

//成功获取到数据之后,返回
if(code.equals("200")){
reqAgein = false;
mapResult = data;
break;
}else{
reqAgein = true;
}
//失败重连三次之后也返回
if(ageinNum > ageinNumMax){
reqAgein = false;
mapResult = data;
break;
}else{
Thread.sleep(1000*10);
}

}while (reqAgein);
return mapResult;
}

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Css 控制选中文字背景以及颜色

发表于 2022-07-08
字数统计: 131 字 | 阅读时长 ≈ 1 min

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html>
<head>
<title>Field selection demo</title>
<style>
p::selection {
background:pink;
color:white;
}
::-moz-selection {
background:#ccc;
color:#ff645d;
}
::-webkit-selection {
background:#ccc;
color:#ff645d;
}
</style>
</head>
<body>
<p>
1234567890
</p>
</body>
</html>

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

1…101112…38

继开

一辈子很短,努力的做好两件事就好:第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

303 日志
171 标签
RSS
gitee E-Mail
0%
鲁ICP备18007712号
© 2025 继开 | 站点字数统计: 262.2k
博客使用 Hexo 搭建
|
主题 — NexT.Mist v5.1.4
人访问 次查看