Docker-basic-1

Docker 中的三个概念:镜像,容器,仓库

镜像(image):

Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。

容器( Container):

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

仓库:

仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

查询镜像

docker search ubuntu
docker search alpine

拉取镜像

docker pull ubuntu
docker pull alpine
docker pull alpine:latest
docker pull alpine:3.14

容器使用 container

使用 docker stop 命令来停止容器

运行交互式的容器

docker run -i -t alpine:latest /bin/sh

docker run -i -t ubuntu:15.10 /bin/bash

清理掉所有处于终止状态的容器
docker container prune

查看容器内部的标准输出
docker logs -f bf08b7f2cd89

查看容器内部运行的进程
docker top 08bccf3d7177

镜像删除使用 docker rmi 命令
docker rmi hello-world

docker pull httpd

构建镜像

使用命令 docker build , 从零开始来创建一个新的镜像。
需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建镜像。

1
2
3
4
5
FROM    alpine:3.14 
MAINTAINER WYT “1007525761@qq.com"
RUN apk --update add nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

批量删除容器

docker rm $(docker ps -a -q)

批量删除镜像

docker rmi $(docker images -a -q)

按条件删除镜像

没有打标签
docker rmi docker images -q | awk '/^<none>/ { print $3 }'

镜像名包含关键字
docker rmi –force docker images | grep keywords | awk '{print $3}' //其中keywords为关键字

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。
Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗。
Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。
Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5.6 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。

Alpine 镜像源配置
这里推荐使用阿里云镜像源,由于公司应用都是部署在阿里云上,使用阿里云镜像源会快很多
$ vi /etc/apk/repositories

将这两行插入到repositories文件开头

http://mirrors.aliyun.com/alpine/v3.9/main
http://mirrors.aliyun.com/alpine/v3.9/community

后面是原有的默认配置

http://dl-cdn.alpinelinux.org/alpine/v3.8/main
http://dl-cdn.alpinelinux.org/alpine/v3.8/community

MySQL的UPDATE操作如何只更新一行数据?

MySQL的UPDATE操作如何只更新一行数据?

比如文本数据表里的数据,根据 post_id 能查处多条记录,但只更新最新的一条:

UPDATE texts SET views=views+1 WHERE post_id=’123456’;

解决办法:

UPDATE texts SET views=views+1 WHERE post_id=’123456’ ORDER BY text_id DESC LIMIT 1;

更新数据最好明确条件,在 WHERE 条件里限制好。

PHP 检测图片是否损坏,PHP检测图片是否正常

关键词:PHP检测图片是否损坏,PHP检测图片是否正常

(一)、如果存在GD库,可以使用imagecreatefromstring ()函数:

格式:resource imagecreatefromstring ( string $image )
imagecreatefromstring() 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。

返回值:成功则返回图像资源,如果图像格式不支持,数据不是认可的格式,或者图像已损坏则返回 FALSE。

代码示例:
<?php代码开始

$imgUrl = “http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif“;
$data = file_get_contents($imgUrl);
//echo ($data);
$im = imagecreatefromstring($data);
if($im != false){
echo ‘

图片正常…

‘;
}else{
echo ‘

图片已损坏…

‘;
}
代码结束?>

(二)、如果没有GD库可以使用下边的方法:
正常的JPG文件都是以FFD8开头,FFD9结尾的,如果丢失了文件尾部,JPG仍然可以被识别,但是就会丢失部分图像数据。
代码如下:
function check_img_by_source($source) {

   switch(bin2hex(substr($source,0,2))){
       case 'ffd8' : return 'ffd9' === bin2hex(substr($source,-2));
       case '8950' : return '6082' === bin2hex(substr($source,-2));
       case '4749' : return '003b' === bin2hex(substr($source,-2));
       default : return false;
   }
}

var_dump(check_img_by_source(file_get_contents(‘11.gif’));

大概是这个样子的吧,只针对了jpg,png,gif做了判断。。想加其他的按照以上规则增加即可。不过上边这个判断不够严谨,别人可以根据以上判断规则构造一个假数据。

(三)、getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。

函数拓展:

imagecreatefromjpeg() - 从 JPEG 文件或 URL 新建一图像
imagecreatefrompng() - 从 PNG 文件或 URL 新建一图像
imagecreatefromgif() - 从 GIF 文件或 URL 新建一图像
imagecreatetruecolor() - 新建一个真彩色图像
exif_read_data() — 从 JPEG 或 TIFF 文件中读取 EXIF 头信息(别名:read_exif_data )
file_get_contents() — 将整个文件读入一个字符串
base64_decode() — 对使用 MIME base64 编码的数据进行解码
bin2hex() — 将二进制数据转换成十六进制表示

参考链接:

德问:http://www.dewen.org/q/2643
https://my.oschina.net/cart/blog/300207

PHP 格式化输出-添加或去除字符串的前导零

[PHP]添加或者去除字符串的前导零


需求:字符串每个部分至少是六位,不够六位补零,并用逗号隔开。


代码:

//方法一:使用sprintf()函数 printf()

$str = “1,22,333,4444,55555,666666,1234567890”;
var_dump($str);
$arr = explode(“,”,$str);
foreach($arr as $val){
$new_arr[] = sprintf(“s”,$val);
}
var_dump($new_arr);
$new_str = implode(“,”,$new_arr);
var_dump($new_str);

//方法二是用str_pad()函数
$str = “1,22,333,4444,55555,666666,1234567890”;
var_dump($str);
$arr = explode(‘,’,$str);
var_dump($arr);
foreach($arr as $val){
var_dump($val);
$new_arr2[] = str_pad(trim($val), 6, ‘0’, STR_PAD_LEFT);
}
var_dump($new_arr2);
$new_str = implode(“,”,$new_arr);
var_dump($new_str);

经 @IT不倒翁 提醒,知道新浪博客会过滤一些特殊字符,现将程序截图贴在下面:

(请以截图中的程序为准)

[PHP]格式化输出:添加或者去除字符串的前导零


补充:

//去除前导零
$arr = explode(‘,’,$new_str);
foreach($arr as $val) {
$narr[] = intval($val);
}
var_dump($narr);


函数:

explode — 使用一个字符串分割另一个字符串

implode — Join array elements with a string

intval — 获取变量的整数值

str_pad — 使用另一个字符串填充字符串为指定长度

sprintf — Return a formatted string

格式:sprintf(format,arg1,arg2,arg++)
参数 format 是转换的格式,以百分比符号 (“%”) 开始到转换字符结束。下面的可能的 format 值:

%% - 返回百分比符号
%b - 二进制数
%c - 依照 ASCII 值的字符
%d - 带符号十进制数
%e - 可续计数法(比如 1.5e+3)
%u - 无符号十进制数
%f - 浮点数(local settings aware)
%F - 浮点数(not local settings aware)
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
arg1, arg2, ++ 等参数将插入到主字符串中的百分号 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。

格式化数字:

string number_format ( float $number [, int $decimals = 0 ] )

参考资料:

http://www.php.net/manual/zh/
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/12/16/2290585.html

PHP-有关CodeIgniter3中函数名不能与控制器名相同的问题

在CodeIgniter3开发中遇到一个问题:

控制器名与方法名同名时,报”404 Page Not Found”错误。

比如有个控制器“Controllers/Login.php”:

1
2
3
4
5
class Login extends CI_Controller{
function login(){
echo 'login';
}
}

预期结果是: 可以使用“index.php/login/login”访问此login()函数,输出”login”字符串

实际结果是: 页面报出”404 Page Not Found”错误

查看CodeIgniter3框架代码,在CodeIgniter.php中有这样一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php');
if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)){
$e404 = TRUE;
}
elseif (method_exists($class, '_remap')){
$params = array($method, array_slice($URI->rsegments, 2));
$method = '_remap';
}
elseif ( ! is_callable(array($class, $method))){
////问题在这里:
////is_callable(array($class, $method)) 返回 false.
////$class的值为 'Login', $method的值为'login', 方法login()被当成了控制器Login的构造函数(PHP4风格)
$e404 = TRUE;
}

问题就出在函数 is_callable() 上面, 从PHP5.3起,构造函数调用is_callable()检查会返回不可被调用。

$class 的值为 ‘Login’, $method的值为’login’, 方法login()被当成了控制器Login的构造函数(PHP4风格)

查看CodeIgniter2中的CodeIgniter.php代码,没有发现有使用is_callable函数,所以CodeIgniter2不会有这个问题。

好吧,看来目前CodeIgniter3不能再使用控制器和方法名相同的命名了。

PHP手册上有这样一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Example #2 is_callable() and constructors
As of PHP 5.3.0 is_callable() reports constructors as not being callable.
This affects PHP 5 style constructors (__construct) as well as PHP 4 stlye constructors (i.e. methods with the same name as the class).
Formerly, both cases have been considered callable.

<?php
class Foo{
public function __construct() {}
public function foo() {}
}
var_dump(
is_callable(array('Foo', '__construct')),
is_callable(array('Foo', 'foo'))
);

上边这段代码将会输出:
The above example will output:
bool(false)
bool(false)

参考资料:

http://codeigniter.org.cn/user_guide/general/controllers.html
http://php.net/manual/en/function.is-callable.php

[完]