博客Docker迁移记

已经一年多没写过博客了,关注过的同学应该知道,这个博客之前挂了小半年的时间。
归结其原因,是本人把服务器密钥的密码给忘掉了(虽然忘了密码跟写博客没啥关系),然后根据蝴蝶效应……

用了两天时间,恶补了一下Docker的知识,经过本地的若干次测试后,终于在Docker上成功部署了本博客,服务器也不会再杂乱无章了~

简单的记录了一下配置过程:

首先是安装docker,根据官方手册

Step 1:
tee /etc/yum.repos.d/docker.repo <<-'EOF'\
[dockerrepo]\
name=Docker Repository\
baseurl=https://yum.dockerproject.org/repo/main/centos/7/\
enabled=1\
gpgcheck=1\
gpgkey=https://yum.dockerproject.org/gpg\
EOF

Step 2:
yum install docker

Step 3:
systemctl enable docker.service
systemctl start docker
systemctl enable docker

然后pull对应的镜像

docker pull nginx
docker pull php
docker pull mariadb

文件及数据目录结构如下

websites
├── dbBackup     # 存放数据库备份文件
├── httpsKey     # 存放https密钥
├── jackgxcCom   # 存放网站数据
├── mysqlData    # 挂载到MySQL的'/var/lib/mysql'路径下
├── nginxData    # Nginx的配置文件
└── phpData      # 存放php.ini等文件
    └── conf.d

接下来便是通过docker run命令配置并启动若干个容器,这个过程中参考了micooz/docker-lnmp,有兴趣的同学可以看一下(由于本人比较懒,也许是最近一段比较忙,没有写成dockerfile形式,之后有时间会进一步优化)

首先是数据库:

docker run -it \
    --name mariadb \
    -v /root/websites/mysqlData:/var/lib/mysql \
    -v /root/websites/dbBackup:/dbBackup \    # 便于建立后导入数据
    -e MYSQL_ROOT_PASSWORD=ROOT_PASSWORD \
    -e MYSQL_DATABASE=DATABASENAME \
    -e MYSQL_USER=USERNAME \
    -e MYSQL_PASSWORD=USERPASSWORD \
    -d mariadb

运行之后,通过docker exec -it mariadb bash命令进入容器,将之前导出的mysql备份文件导入数据库即可。

接下来是php:

docker run -it \
    --name php \
    -v /root/websites/jackgxcCom:/web \
    -v /root/websites/phpData:/usr/local/etc/php \
    --link mariadb:mariadb \   # 与mariadb容器进行链接
    -d php:5.6-fpm

因为需要安装MySQL、iconv、curl等拓展,所以安装完后需要进入容器,安装对应的拓展,感谢Docker提供的docker-php-ext-install命令,如果需要安装的拓展需要进一步配置,还可以使用docker-php-ext-configure命令,如需要查看详细使用方法,可以参考这里

安装后,需要在php.ini配置文件中手动添加mysql拓展的路径extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/mysql.so

最后是Nginx:

docker run 
    --name nginx 
    -v /root/websites/jackgxcCom:/web 
    -v /root/websites/nginxData:/etc/nginx/conf.d 
    -v /root/websites/httpsKey:/httpsKey 
    -p 80:80 
    -p 443:443 
    --link php:php 
    -d nginx

由于nginx和php在两个容器中,所以在配置站点的时候,cgi的主机名要填写php容器的主机名,因为已经通过link命令将nginx与php两个容器链接了(Docker会在hosts文件中增加对应容器的ip),所以直接填写php:9000即可。

全部配置流程大致就是这样,Docker作为应用层虚拟化的一个代表,提供了网站运维的新思路,希望能有更多的同学使用Docker提高自己的开发效率~

centos7(阿里云)安装docker小记

首先要贴出来的当然是官方指南,还没读过官方指南的同学还是先去看一看吧……

用两种方法都能顺利安装,BUT 执行service docker start的时候就开始报错了,那一大片红字看的心疼啊……

执行systemctl status docker.service -l看一下具体的错误原因,btw -l参数的意思是把省略掉的部分都显示出来

原来是无法桥接,真是个“棘手”的问题,去阿里云论坛搜一搜吧,感谢这位叫“美味的小鱼”的朋友提供的解决方案

  1. 编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,最后加上BRIDGE='docker0'
  2. 把这个文件复制一份,新的名称为docker0,cp ifcfg-eth0 docker0
  3. 编辑docker0文件,第一行DEVICE=docker0,删掉原来的BRIDGE那行,加上TYPE='Bridge'

大功告成,service docker start,看见绿色的OK瞬间心情舒畅

顺便执行下 docker search nginx ,F**K 又报错了,不过这次的问题简单,找不到docker.io域名,dns的问题,修改dns去,vi /etc/resolv.conf最上面加一行nameserver 8.8.8.8

顺便重启了下network服务,也不知道是不是必须的,但是强迫症,改完配置文件总是习惯重启一下服务

手欠docker pull nginx执行了一下,那速度简直酸爽,但是我国人民是聪明哒,在这里推荐一下DaoCloud(无尾巴,请放心点击 //找了半天都没有推荐链接…… )改完配置项之后,再下载简直神速

over~

CentOS7安装MariaDB笔记

阿里云到期了,于是为了换可用区,就重新买了一台,也顺便换成了centos7(这可是阿里云官方推荐的系统~)
但是在安装的过程中,遇到了一些小问题,还好是可以百度解决的,于是就记录下来,供以后参考。

yum install mysql //安装服务
systemctl start mariadb.service //启动服务
systemctl enable mariadb.service //设置自动启动

这三条执行完,MariaDB就算装完了,下面是安全性配置

mysql_secure_installation

执行这条命令后,会有一步一步的引导,按照要求输入Y或者N就好了。

最后,执行你熟悉的

mysql -u USER_NAME -p

进入命令行尽情玩耍吧~


这次安装的时候,遇到了一个陌生的命令systemctl,简单的百度了一下,然后做个记录

systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl --failed #显示启动失败的服务

MariaDB必知必会

MariaDB是基于MySQL的,大部分MySQL的知识在MariaDB上也相同。

本篇文章主要罗列基本的SQL语法及MariaDB的一些特性。
注:所有的SQL语句均以英文的半角分号结尾,所有以$(美元符号)开头的字段均为相关用户字段(例如数据库名称,表名称)

列出数据库:
-
SHOW DATABASES;

选择数据库:
-
USE $DATABASE_NAME;

列出数据库的表:
-
SHOW TABLES;

列出表的详细信息:
-
DESCRIBE $TABLE_NAME;

基础检索语句:
-
SELECT * / ($TABLE_NAME.)$COLUMN_NAME FROM ($DATABASE_NAME.)$TABLE_NAME WHERE $CLAUSE LIMIT $AMOUNT / $START,$AMOUNT ORDER BY $COLUMN_NAME ASC / DESC

WHERE子句:
-
可以使用AND OR IN NOT操作符进行高级操作
IN用逗号隔开括号中列出的所有合法值 例如 WHERE id IN (1002,1003)
注:MariaDB支持对IN BETWEEN EXISTS语句使用NOT

通配符:
-
在WHERE语句中,可以使用LIKE配合通配符进行条件过滤
%表示零个、一个或多个字符
_表示一个字符

正则表达式:
-
WHERE语句中可以使用REGEXP配合正则表达式过滤数据

计算字段:
-

  • 拼接字段
    使用Concat( )函数

例如Concat(name,'(',country,')')

  • 删除空格
    RTrim( )删掉右面所有的空格

LTrim( )删掉左面所有的空格
Trim( )同时裁剪左右两边

  • 别名
    使用AS操作符

例如title AS new_title

  • 算术运算
    SELECT语句中直接使用+ - * /符号即可进行计算

数据汇总
-
可以使用AVG( ) COUNT( ) MAX( ) MIN( ) SUM( )计算平均值、数量、最大值、最小值、总量
可以在函数中使用DISTINCT关键字,只计算不同的值

数据分组
-
使用GROUP BY子句创建分组
使用HAVING分句过滤分组(在分组中使用WHERE是无效的)

子查询
-

  • 可以使用嵌套进行子查询

多表连接
-

  • WHERE语句中可以判断外键
  • 内连接-join
    FROM $TABLE_NAME JOIN $TABLE_NAME ON $TABLE_NAME.$COLUMN_NAME = $TABLE_NAME.$COLUMN_NAME
  • 外连接
    INNER JOIN返回两表所有行

LEFT OUTER JOIN返回左边所有行
RIGHT OUTER JOIN返回右边所有行

表别名
-

  • 不仅可以给字段添加别名,也可以给表添加别名,使得在后面的WHERE语句中更加简便,例如FROM $TABLE_NAME AS $ALIAS_NAME WHERE $ALIAS_NAME.$COLUMN_NAME = ……

联合查询
-
使用UNION操作符可以讲若干个查询语句结果组合为一个。

适用条件:

  • 每个SELECT语句之间均需要使用UNION连接
  • 每一个查询都需要包含相同的列、表达式、聚合函数
  • 列数据类型必须兼容(MariaDB可以相互转换)

返回相同行:
UNION对于相同行默认只显示一行,如果需要显示多行,可以使用UNION ALL操作符。

ORDER BY能且只能出现在最后一个SELECT语句后面,不允许使用多个ORDER BY语句。

全文本搜索
-
针对需要搜索的字段,需要在创建数据表的时候指定FULLTEXT($FIELD_NAME),全文搜索默认不区分大小写,如果需要区分,请使用BINARY模式

语法:
SELECT * / ($TABLE_NAME.)$COLUMN_NAME FROM ($DATABASE_NAME.)$TABLE_NAME WHERE Match($COLUMN_NAME) Against($EXPRESSION)

返回结果会按照相关度降序排列

拓展搜索:
Against($EXPRESSION WITH QUERY EXPANSION)

布尔全文搜索:
可以使用全文本布尔操作符对文本进行更加详细的过滤,此处略。

插入语句基本语法
-
INSERT INTO $TABLE_NAME($COLUMN_NAMES) VALUES($VALUES);

更新语句基本语法
-
UPDATE $TABLE_NAME SET $FIELD_NAME = '$VALUE' WHERE $CLAUSE;

删除语句基本语法
-
DELETE FROM $TABLE_NAME WHERE $CLAUSE;

创建数据表基本语法
-

CREATE TABLE $TABLE_NAME
{
    $COLUMN_NAME    $TYPE    NOT NULL/NULL AUTO_INCREMENT,
    $COLUMN_NAME    $TYPE    NOT NULL/NULL DEFAULT $DEFAULT_VALUE,
    PRIMARY KEY ($COLUMN_NAME)
} ENGINE = $ENGINE_NAME;
  • 不允许使用函数作为默认值,只支持常量

更新表
-
增加列:
ALTER TABLE $TABLE_NAME ADD $COLUMN_NAME $TYPE;

删除列:
ALTER TABLE $TABLE_NAME DROP $COLUMN_NAME;

删除表:
-
DROP TABLE $TABLE_NAME;

重命名表:
-
RENAME TABLE $TABLE_NAME TO $TABLE_NAME;

视图:
-
创建视图:
CREATE VIEW $VIEW_NAME AS $CLAUSE

使用视图:
SELECT …… FROM $VIEW_NAME WHERE $CLAUSE

触发器:
-

CREATE TRIGGER $TRIGGER_NAME AFTER/BEFORE INSERT/DELETE/UPDATE ON $TABLE_NAME
FOR EACH ROW
BEGIN
    $CLAUSE;
END;

事务管理:
-
事务开始:
START TRANSACTION;

添加保存点:
SAVEPOINT $SAVEPOINT_NAME;

回滚:
ROLLBACK;
ROLLBACK TO $SAVEPOINT_NAME;

提交:
COMMIT;

用户管理
-
列出用户:
USE mysql;
SELECT user FROM user;

添加用户:
CREATE USER $USER_NAME IDENTIFIED BY $PASSWORD;

修改用户名:
RENAME USER $USER_NAME TO $USER_NAME;

修改密码:
SET PASSWORD FOR $USERNAME = Password('$PASSWORD');
SET PASSWORD = Password('$PASSWORD'); 设置当前登录用户的密码

删除用户:
DROP USER $USER_NAME;

列出权限:
SHOW GRANTS FOR $USER_NAME;

授予权限:
GRANT $GRANTS ON $DATABASE_NAME.$TABLENAME TO $USER_NAME;

撤销权限
REVOKE $GRANTS ON $DATABASE_NAME.$TABLENAME FROM $USER_NAME;

存储过程(PROCEDURE)、游标(CURSOR)

待补充