windows平台下的PHP的线程安全版本与非线程安全版本的区别

Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分(Linux/Unit平台没有这个概念的东西的),这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。

PHP有2中运行方式:ISAPIFastCGI

ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;

而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。

对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。

Continue reading

利用 Dockerfile 来创建镜像

使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。

新建一个目录和一个 Dockerfile

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

Dockerfile 中每一条指令都创建镜像的一层,例如:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

Dockerfile 基本的语法是 Continue reading

docker安装入门篇

一、下载镜像 image

可以使用 docker pull 命令来从仓库获取所需要的镜像。

下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。

$ sudo docker pull ubuntu:12.04
Pulling repository ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete

下载过程中,会输出获取镜像的每一层信息。

该命令实际上相当于

$ sudo docker pull registry.hub.docker.com/ubuntu:12.04

命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。例如

$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
Pulling dl.dockerpool.com:5000/ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: Download complete

二、利用镜像image 创建容器

完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。

$ sudo docker run -t -i ubuntu:12.04 /bin/bash
root@fe7fc4bd8fc9:/#

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

上面命令默认会生成一个随机的 CONTAINER-ID,我们可以使用docker attach  "容器ID|容器名" 命令来进行指定的容器。但由于容器ID和容器名为随机字母,不利于我们记忆 ,这里我们可以使用 --name 参数批量一个命名,这样我们直接使用 "docker attach 容器名" 就可以进入容器内(可通过 docker ps -a查看)

$sudo docker run -it --name server ubuntu /bin/bash

我们通过 ”docker ps -a" 可以看到容器的最后一列names的值为server,以后想进行这个容器直接使用命令 "docker attach server“ 即可,不用再去先查找容器ID,再输入容器ID,省事了很多。

有时候我们为了编码方面,一般是在宿主机器上进行开发,调试在容器里进行,这时候,我们只需要将一个本机目录挂载到容器里即可。

$sudo docker run -it -v /sites/www:/wwwroot/htodcs ubuntu /bin/bash

上面的/sites/www 为本机目录,/wwwroot/htdocs 为容器中挂载的目录,这点像vagrant。

docker常用命令见:http://blog.haohtml.com/archives/16555

docker常用命令

1. 查看docker信息(version、info)

# 查看docker版本
$docker version

# 显示docker系统的信息
$docker info

2. 对image的操作(search、pull、images、rmi、history)

# 检索image(sudo docker pull ubuntu:12.04,该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。)
$docker search image_name[:tag]

# 下载image
$docker pull image_name

# 列出镜像列表; -a, --all=false Show all images; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs
$docker images

# 删除一个或者多个镜像; -f, --force=false Force; --no-prune=false Do not delete untagged parents (注意这里是 rmi 命令,不是 rm)
$docker rmi image_name

# 显示一个镜像的历史; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs
$docker history image_name

3. 启动容器(run)

docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

Continue reading

docker与vm之间的最基本的区别

5分钟弄懂Docker!http://www.csdn.net/article/2014-07-02/2820497-what%27s-docker

Docker入门与实践:https://www.gitbook.com/book/yeasy/docker_practice

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Virtual Machines是由虚拟机管理程序来实现对虚拟机的管理,而docker是用docker Engine来实现对应用的管理。可以理解为一个套硬件的管理,一个是软件的管理。

virtualization

docker

 对比传统虚拟机总结

docker-vs-vm

基本概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期。 Continue reading

windows下使用docker login命令提示403错误的解决办法

windows平台下使用docker,在对image打包上传(https://hub.docker.com/)时 (https://docs.docker.com/windows/step_six/),发现登录docker的时候一直提示403错误

docker login --username=youruser --password=yourpassword --email=youremail

网友分析 是windows和unix仓库提交网址不一致,引起的问题

docker login --username=youruser --password=yourpassword --email=youremail https://index.docker.io/v1/

官方给出的提交url,不过这里用windows的url还是登录失败,一样的错误信息,用unix的url可以登录成功,但在push 的时候,却又提示未认证,暂时未找到解决办法。

具体可以看上面柳月给的网址或者:

https://github.com/docker/hub-feedback/issues/473
https://github.com/docker/docker/issues/18019

http://stackoverflow.com/questions/33748919/why-does-docker-login-fail-in-docker-quickstart-terminal-but-work-from-within

brew常用命令

由于国内一环境,速度非常的慢,推荐使用HomeBrew的中国镜像http://blog.haohtml.com/archives/16915

  1. 安装(需要 Ruby):
    ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
  2. 搜索:brew search mysql
  3. 查询:brew info mysql 主要看具体的信息,比如目前的版本,依赖,安装后注意事项等
  4. 更新:brew update 这会更新 Homebrew 自己,并且使得接下来的两个操作有意义
  5. 检查新版本:brew outdated 这回列出所有安装的软件里可以升级的那些
  6. 升级:brew upgrade 升级所有可以升级的软件们
  7. 清理:brew cleanup 清理不需要的版本以及安装包缓存

常用的就这些。

一般在软件前,需要先更新Homebrew,然后再升级所有软件或者指定软件。

brew update          # 更新 Homebrew 的信息
brew outdated        # 看一下哪些软件可以升级
brew upgrade <package>    # 升级指定的软件
brew upgrade    #升级所有安装过的软件
brew cleanup    # 清理掉升级后无用的老版本软件,以腾出磁盘空间

另外记得定时执行 brew cleanup命令,清查过旧的软件包。

linux中 kill USR1和USR2 的区别

USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个

USR1信号将导致以下步骤的发生:
停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

以上摘自wiki:

http://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2

呃,近日发现还有USR2,貌似这个USR1和2都可以用户自定义的,同样摘自上面的wiki:

在POSIX兼容的平台上,SIGUSR1SIGUSR2是发送给一个进程的信号,它表示了用户定义的情况。它们的符号常量在头文件signal.h中定义。在不同的平台上,信号的编号可能发生变化,因此需要使用符号名称。 Continue reading

brew安装mysql为系统服务

默认情况下,使用brew install mysql 安装完mysql以后,需要手动启动mysql。为了方便以后使用,这里将mysql安装成系统服务。

brew info mysql 已经给了.plist文件,只需要load一下就可以,plist文件名不一定是com.mysql.mysqld.plist, 可以先到 `brew --prefix mysql` 目录看下。具体如下:

mkdir -p ~/Library/LaunchAgents
cp `brew --prefix mysql`/com.mysql.mysqld.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist

其实http://stackoverflow.com/questions/8014500/autostart-mysql-on-boot-from-terminal这里有说。

mkdir -p ~/Library/LaunchAgents
cp `brew --prefix mysql`/*mysql*.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/*mysql*.plist