docker-compose

简介

参考文章

 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
1. docker-compose build
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
构建(重新构建)项目中的服务容器。
选项包括:
–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

2. docker-compose up
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
-d 在后台运行服务容器
–no-color 不使用颜色来区分不同的服务的控制输出
–no-deps 不启动服务所链接的容器
–force-recreate 强制重新创建容器,不能与–no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
–scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
docker-compose up
启动所有服务
docker-compose up -d
在后台所有启动服务
-f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d

3. docker-compose ps
docker-compose ps [options] [SERVICE...]
docker-compose ps
列出某项目目前的所有容器

4. docker-compose start
docker-compose start [SERVICE...]
docker-compose start
启动已经存在的服务容器。

5. docker-compose restart
docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose restart
重启项目中的服务

5. docker-compose logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
docker-compose logs
查看服务容器的输出

6. docker-compose rm
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。
选项包括:
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose rm
删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。

7. docker-compose stop
docker-compose stop [options] [SERVICE...]
显示各个容器运行的进程情况。

8. docker-compose down
删除 docker-compose.yml 定义的所有容器

常见参数

command:这里的书写方式支持多种,是等效的,我就是使用第三个书写方法。

Docker 基础知识

docker 简介

2013年3月20日发布Docker0.1

如何定义Docker?

Docker 是一个承载和驱动容器的。Docker 是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是Docker提出的"Build once,Run anywhere"

黑白灰盒测试简介

黑盒测试

黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

开发者须知

开发过程:SOLID五大设计原则

S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写。

SRP: The Single Responsibility Principle 单一职责原则

Mysql 基础知识一

常用函数

数据库表的时间戳字段设计,建议使用 int64 类型

 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
# 日期 format格式说明%m , 数字(0112)%c , 数字(112)
date_format('2019-12-12 12:22:33', "%Y-%m-%d")  -- 日期格式化
FROM_UNIXTIME('时间戳','%Y-%m-%d %H:%i:%s')   -- 时间戳转换为日期格式
date_add(a.DUE_DAY, INTERVAL 90 day) -- 日期增加90天
UNIX_TIMESTAMP('2015-04-29')  -- 日期转换成时间戳
UNIX_TIMESTAMP()  -- 获取当前时间戳
DATE_SUB(CURDATE(), INTERVAL 15 DAY) -- 最近15天
DATE_SUB(CURDATE(), INTERVAL 1 YEAR) -- 最近1年

# 字符串合并
concat(s1, s2...sn)  --  字符串 s1,s2 等多个字符串合并为一个字符串
concat_ws(x, s1, s2...sn)  -- 同 CONCAT(s1,s2,...) 函数,但是每个字符串直接要加上 x,x 可以是分隔符
group_concat(column)  -- 将某列的所有值合并成一个字符串

# 截取字符串
left(str, length),即:left(被截取字符串, 截取长度)
right(str, length),即:right(被截取字符串, 截取长度)
substring(str, pos, length),即:substring(被截取字符串,从第几位开始截取,截取长度)length非必填
substring_index(str, delim, count),即:substring_index(被截取字符串,关键字,关键字出现的次数)
    SELECT SUBSTRING_INDEX('www.yuanrengu.com', '.', 2); -- 截取第二个“.”之前的所有字符,如果关键字不存在,则返回整个字符串
    SELECT SUBSTRING_INDEX('www.yuanrengu.com', '.', -2); -- 截取倒数第二个“.”之后的所有字符

# 计算字段长度
SELECT LENGTH('www中国人民'); -- 长度15『length(): 一个汉字是算三个字符,一个数字或字母算一个字符』
SELECT CHAR_LENGTH('www中国人民'); -- 长度7 『char_length(): 不管汉字还是数字或者是字母都算是一个字符』

find_in_set(s1, s2)  -- 返回在字符串s2中与s1匹配的字符串的位置(等于 0 表示找不到),  SELECT FIND_IN_SET("c", "a,cb,c,d,e");
locate(s1, s) -- 从字符串 s 中获取 s1 的开始位置,位置初始值为1,找不到则返回0
regexp -- 正则匹配,eg:select * from history where data regexp '帐号的使用存在异常|操作太频繁'

format(number, decimal_places)  -- 浮点数格式化, 会出现千分位的浮点数,使用convert/cast不会出现千分位
convert(value, type)/cast(value as 类型)  -- 数据类型转换,可用来获取一个类型的值,并产生另一个类型的值。
eg: convert(1.2456, decimal(10,2)) 或者 cast(1.2456 as decimal(10,2))  -- 保留小数后两位

IFNULL(expr1,expr2) -- 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。
if(sva=1,"男","女")

# 替换字段内容
UPDATE `goods_file` SET `file` = replace (`file`,'https://xxx.com','https://bbb.com');

常用命令

 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
-- 查询 sql_mode 『sql_mode 会影响 MySQL 支持的 SQL 语法以及它执行的数据验证检查』
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session;
SET sql_mode = '';
SET GLOBAL sql_mode = '';

-- 时区操作
show variables like "%time_zone%"; -- 查看时区
> set global time_zone = '+8:00'; -- 修改mysql全局时区为北京时间,即我们所在的东8区
> set time_zone = '+8:00'; -- 修改当前会话时区
> flush privileges; -- 立即生效

SHOW BINLOG EVENTS LIMIT 0, 25; -- 查看 binlog 日志

ALTER TABLE tableName auto_increment=number; -- 设置表自增值

show full processlist; -- 显示所有用户正在运行的线程
show processlist; -- 显示当前用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。

explain/desc select *  from table; -- 查看查询语句性能,即查看执行计划
desc table_name;  -- 查看 table 等结构
show index from table_name;  -- 查看索引信息
create index on table(id(10));  -- 增加前缀索引

-- 查询表所有字段的名称
select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name';

-- 查询一个表中所有字段的名字和注释
SELECT COLUMN_NAME, COLUMN_COMMENT FROM INFORMATION_SCHEMA.Columns WHERE table_name='provision' AND table_schema='test'

-- 授权root用户新ip可以访问:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.9.76' IDENTIFIED BY 'password' WITH GRANT OPTION;
flush privileges; -- 刷新激活变更操作

-- 导出数据库『不用进入mysql命令界面』
mysqldump -u 用户名 -p 数据库名 > 导出的文件名

-- 创建新用户并授权root用户所有权限且所有ip可以访问:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

-- 创建新用户并授权root用户新ip可以访问某个数据库:
GRANT ALL PRIVILEGES ON database_name.* TO 'root'@'192.168.9.76' IDENTIFIED BY 'password' WITH GRANT OPTION;

-- 创建只读用户:
GRANT SELECT ON *.* TO 'db_read'@'%' IDENTIFIED BY 'A1ta939a@Qn*iTls'

json类型的字段查询

查询JSON中的数据用 column->path的形式,其中对象类型path的表示方式 $.path,数组类型的表示方式 $[index];

Memcached

Memcached 是一个自由开源的,高性能,分布式内存对象缓存系统。

Memcached 是一种基于内存的 key-value 存储,用来存储小块的任意数据(字符串、对象)。

Memcached 官方网站:http://memcached.org/

Redis

缓存分类

众所周知,不同的缓存速度是不同的,本地内存缓存 > redis/memcache > 磁盘缓存。

PHP 可以使用静态变量(如 array)实现本地内存缓存,Golang 可以使用变量(如 map)实现本地内存缓存。

加密算法

对称加密算法

AES

高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(因为DES不安全了),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

常用算法

常见算法

快速排序,二分法查找,深度优先搜索,广度优先搜索

区间重合算法

时间重合判断逻辑:

  • 开始时间s1、s2
  • 结束时间e1、e2
  • 只要满足s1 <= e2 && e1 >= s2,则区间会出现重合。
 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
<?php
/**
 * 时间段重合判断
 * @param array $data 日期数组
 * @param string $fieldStart 开始日期字段名
 * @param string $fieldEnd 结束日期字段名
 * @return bool true为重合,false为不重合
 */
function is_time_cross(array $data, string $fieldStart = 'start_day', string $fieldEnd = 'end_day')
{
    // 按开始日期排序
    array_multisort(
        array_column($data, $fieldStart),
        SORT_ASC,
        $data
    );

    // 冒泡判断是否满足时间段重合的条件
    $num = count($data);
    for ($i = 1; $i < $num; $i++) {
        $pre = $data[$i-1];
        $current = $data[$i];
        if (strtotime($pre[$fieldStart]) <= strtotime($current[$fieldEnd]) && strtotime($current[$fieldStart]) <= strtotime($pre[$fieldEnd])) {
            return true;
        }
    }

    return false;
}

// 测试例子
$data = [
    ['start_day' => '2019-01-01', 'end_day' => '2019-01-31'],
    ['start_day' => '2018-01-01', 'end_day' => '2018-01-31'],
    ['start_day' => '2019-03-01', 'end_day' => '2019-05-31'],
    ['start_day' => '2019-10-01', 'end_day' => '2019-10-31'],
    ['start_day' => '2019-04-01', 'end_day' => '2019-04-10'],
];
var_dump(is_time_cross($data));

Web 安全攻防总结

XSS(跨站攻击)

XSS 种类

  • Reflected XSS: 非持久型 XSS 漏洞,也叫反射型 XSS 漏洞,一般是通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。
  • Stored XSS: 持久型 XSS 漏洞,也被称为存储型 XSS 漏洞,一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

XSS防范方法