https://vagrantcloud.com/
$ su
# Vagrant 需要用到 virtualbox
$ apt-get install virtualbox
$ apt-get install vagrant
# 开个文件夹, 进入..
$ mkdir demo
$ cd demo
# 下载
$ vagrant box add ubuntu/trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant init ubuntu/trusty64 # 初始化, 会准备 Vagrantfile
$ vagrant up # 启动虚拟机, 如果没有运行 vagrant box add, 会自动去找与下载
# SSH 连接至虚拟机
$ vagrant ssh
$ lsb_release -a
$ exit
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant status # 查看虚拟机状态
$ vagrant destroy # 销毁当前虚拟机
广告
本站里的文章大部分经过自行整理与测试
2016年5月30日星期一
2016年5月26日星期四
VirtualBox - Mac OS X 10.11 启动设置
VirtualBox 安装 OS X 虚拟机
什么都不设置的话,会出现 FATAL: No bootable medium found! System halted.
1. 先弄个虚拟机名为 ElCapitan, 设置
Settings... - General - Basic
Name: ElCapitan
Type: Mac OS X
Version: Mac OS X 10.11 El Capitan (64-bit)
- Enable EFI (Special OSes only)
* 不启动 EFI, 会出现错误 Configuration error: Querying "UUID" failed (VERR_CFGM_VALUE_NOT_FOUND)
2. 通过命令, 修改 ElCapitan.vbox 文件
开启 command prompt, 输入以下
> cd "C:\Program Files\Oracle\VirtualBox"
# VirtualBox 4.X.X
> VBoxManage modifyvm "ElCapitan" --cpuidset 00000001 000306a9 04100800 7fbae3ff bfebfbff
# VirtualBox 5.0.X
> VBoxManage modifyvm "ElCapitan" --cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff
# EFI
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "MacBookPro11,3"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
# SMC
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1
# 0:640x480, 1:800x600, 2:1024x768, 3:1280x1024, 4:1440x900, 5:1920x1200
> VBoxManage setextradata "ElCapitan" "VBoxInternal2/EfiGopMode" 4
3. 启动虚拟机
启动虚拟机成功后,
如果不能输入, 关闭虚拟机设置以下驱动, 后再启动..
Settings... - USB - USB Device Filters
a) USB OPTICAL MOUSE
b) SIGMACHIP USB Keyboard
什么都不设置的话,会出现 FATAL: No bootable medium found! System halted.
1. 先弄个虚拟机名为 ElCapitan, 设置
Settings... - General - Basic
Name: ElCapitan
Type: Mac OS X
Version: Mac OS X 10.11 El Capitan (64-bit)
- Enable EFI (Special OSes only)
* 不启动 EFI, 会出现错误 Configuration error: Querying "UUID" failed (VERR_CFGM_VALUE_NOT_FOUND)
2. 通过命令, 修改 ElCapitan.vbox 文件
开启 command prompt, 输入以下
> cd "C:\Program Files\Oracle\VirtualBox"
# VirtualBox 4.X.X
> VBoxManage modifyvm "ElCapitan" --cpuidset 00000001 000306a9 04100800 7fbae3ff bfebfbff
# VirtualBox 5.0.X
> VBoxManage modifyvm "ElCapitan" --cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff
# EFI
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "MacBookPro11,3"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
# SMC
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
> VBoxManage setextradata "ElCapitan" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1
# 0:640x480, 1:800x600, 2:1024x768, 3:1280x1024, 4:1440x900, 5:1920x1200
> VBoxManage setextradata "ElCapitan" "VBoxInternal2/EfiGopMode" 4
3. 启动虚拟机
启动虚拟机成功后,
如果不能输入, 关闭虚拟机设置以下驱动, 后再启动..
Settings... - USB - USB Device Filters
a) USB OPTICAL MOUSE
b) SIGMACHIP USB Keyboard
2016年5月25日星期三
Vmware / VirtualBox 相互转换
Vmware 转 VirtualBox
1. 在 Vmware 转换 vmx 去 ovf 文件
File - Export to OVF - 选个地方放 ubuntu_1604_x64.ovf 文件
2. 等待转换完成..
3. 在 VirtualBox 开始导入 ubuntu_1604_x64.ovf 文件
File - Import Appliance... - Import Virtual Appliance
- 选 ubuntu_1604_x64.ovf 文件的位置
4. 第 1 次导入 VirtualBox, 会出现错误
Error reading "/Appliance.ovf":
Host resource of type "Other Storage Device (20)" is supported
with SATA AHCI controllers only, line 47.
用 Text Editor 打开 ubuntu_1604_x64.ovf 文件改字
- 将所有 "ElementName" 改为 "Caption"
- "vmware.sata.ahci" 改为 "AHCI"
5. 第 2 次导入 VirtualBox, 会出现错误
The SHA digest of 'ubuntu_1604_x64.ovf' does not match the one in 'ubuntu_1604_x64.mf' (VERR_MANIFEST_DIGEST_MISMATCH).
- 撤掉 ubuntu_1604_x64.mf 文件
6. 第 3 次导入 VirtualBox... 成功了..
VirtualBox 转 Vmware
File - Export Appliance... - 选放 ubuntu_1604_x64.ova 位置
之后就可以在 Vmware 打开 ova 文件
1. 在 Vmware 转换 vmx 去 ovf 文件
File - Export to OVF - 选个地方放 ubuntu_1604_x64.ovf 文件
2. 等待转换完成..
3. 在 VirtualBox 开始导入 ubuntu_1604_x64.ovf 文件
File - Import Appliance... - Import Virtual Appliance
- 选 ubuntu_1604_x64.ovf 文件的位置
4. 第 1 次导入 VirtualBox, 会出现错误
Error reading "/Appliance.ovf":
Host resource of type "Other Storage Device (20)" is supported
with SATA AHCI controllers only, line 47.
用 Text Editor 打开 ubuntu_1604_x64.ovf 文件改字
- 将所有 "ElementName" 改为 "Caption"
- "vmware.sata.ahci" 改为 "AHCI"
5. 第 2 次导入 VirtualBox, 会出现错误
The SHA digest of 'ubuntu_1604_x64.ovf' does not match the one in 'ubuntu_1604_x64.mf' (VERR_MANIFEST_DIGEST_MISMATCH).
- 撤掉 ubuntu_1604_x64.mf 文件
6. 第 3 次导入 VirtualBox... 成功了..
VirtualBox 转 Vmware
File - Export Appliance... - 选放 ubuntu_1604_x64.ova 位置
之后就可以在 Vmware 打开 ova 文件
2016年5月24日星期二
Docker - Tomcat
https://registry.hub.docker.com/_/tomcat/
$ docker run --name tomcat_server -d -p 8080:8080 tomcat:8.5.2-jre8
# 复制这个文件
$ docker cp tomcat_server:/usr/local/tomcat/conf/tomcat-users.xml /home/用户名
$ gedit /home/用户名/tomcat-users.xml
# 在里面添加
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui"/>
$ cd /home/用户名
$ mkdir docker_tomcat
$ mv tomcat-users.xml docker_tomcat
$ cd docker_tomcat
$ gedit Dockerfile
FROM tomcat:8.5.2-jre8
COPY tomcat-users.xml /usr/local/tomcat/conf/
# 编译成镜像 tomcat_conf
$ docker build -t tomcat_conf .
# 撤除容器
$ docker stop tomcat_server
$ docker rm tomcat_server
# 运行容器
$ docker run --name tomcat_server -d -p 8080:8080 tomcat_conf
http://127.0.0.1:8080
$ docker run --name tomcat_server -d -p 8080:8080 tomcat:8.5.2-jre8
# 复制这个文件
$ docker cp tomcat_server:/usr/local/tomcat/conf/tomcat-users.xml /home/用户名
$ gedit /home/用户名/tomcat-users.xml
# 在里面添加
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui"/>
$ cd /home/用户名
$ mkdir docker_tomcat
$ mv tomcat-users.xml docker_tomcat
$ cd docker_tomcat
$ gedit Dockerfile
FROM tomcat:8.5.2-jre8
COPY tomcat-users.xml /usr/local/tomcat/conf/
# 编译成镜像 tomcat_conf
$ docker build -t tomcat_conf .
# 撤除容器
$ docker stop tomcat_server
$ docker rm tomcat_server
# 运行容器
$ docker run --name tomcat_server -d -p 8080:8080 tomcat_conf
http://127.0.0.1:8080
2016年5月22日星期日
Linux - 在 context menu 增加程序链接
Nautilus-actions
1. 安装
$ su
$ apt-get install nautilus-actions # ubuntu / debian
$ zypper install nautilus-actions # OpenSUSE
http://www.rpmfind.net/linux/rpm2html/search.php?query=nautilus-actions
$ dnf install *.rpm # fedora
2. 打开设置页
$ nautilus-actions-config-tool
3. 添加与设置
a) Action - Nautilus Item
- Display item in selection context menu
- Display item in location context menu
- Display item in the toolbar
- Context label 显示的名字
- Icon 图标
b) Command 命令
- Path + Parameters
c) Mimetypes 文件类型
可以参考 /usr/share/applications/*.desktop
4. Save 记录操作 (也就是按添加图标的右边)
5. 退出, logout 或重启电脑就可看到效果了
Nemo
$ sudo apt-get install nemo # ubuntu / Linux Mint
$ sudo pacman -S nemo # Arch Linux
例子:
$ gedit /home/用户名/.local/share/nemo/actions/banshee.nemo_action
[Nemo Action]
Name=Enqueue in Banshee
Comment=Enqueue in Banshee
Quote=double
Exec=banshee --play-enqueued %F
Selection = any
Extensions=mp3;flac;ogg;
1. 安装
$ su
$ apt-get install nautilus-actions # ubuntu / debian
$ zypper install nautilus-actions # OpenSUSE
http://www.rpmfind.net/linux/rpm2html/search.php?query=nautilus-actions
$ dnf install *.rpm # fedora
2. 打开设置页
$ nautilus-actions-config-tool
3. 添加与设置
a) Action - Nautilus Item
- Display item in selection context menu
- Display item in location context menu
- Display item in the toolbar
- Context label 显示的名字
- Icon 图标
b) Command 命令
- Path + Parameters
c) Mimetypes 文件类型
可以参考 /usr/share/applications/*.desktop
4. Save 记录操作 (也就是按添加图标的右边)
5. 退出, logout 或重启电脑就可看到效果了
Nemo
$ sudo apt-get install nemo # ubuntu / Linux Mint
$ sudo pacman -S nemo # Arch Linux
例子:
$ gedit /home/用户名/.local/share/nemo/actions/banshee.nemo_action
[Nemo Action]
Name=Enqueue in Banshee
Comment=Enqueue in Banshee
Quote=double
Exec=banshee --play-enqueued %F
Selection = any
Extensions=mp3;flac;ogg;
Linux - Python - pip 安装
Arch Linux
$ sudo pacman -S python-pip
Ubuntu / Debian
$ sudo apt-get install python-pip
Fedora
$ su
$ dnf install python-setuptools
$ dnf upgrade python-setuptools
$ dnf install python-pip python-wheel
OpenSUSE
$ sudo zypper install python3-pip python3-setuptools python3-wheel
CentOS / RHEL
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python get-pip.py
或
$ su
$ yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ yum -y update
$ yum -y install python-pip
$ pip -V
$ pip install --upgrade pip
$ sudo pacman -S python-pip
Ubuntu / Debian
$ sudo apt-get install python-pip
Fedora
$ su
$ dnf install python-setuptools
$ dnf upgrade python-setuptools
$ dnf install python-pip python-wheel
OpenSUSE
$ sudo zypper install python3-pip python3-setuptools python3-wheel
CentOS / RHEL
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python get-pip.py
或
$ su
$ yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ yum -y update
$ yum -y install python-pip
$ pip -V
$ pip install --upgrade pip
memcached 安装
Windows
http://downloads.northscale.com/memcached-win32-1.4.4-14.zip
http://downloads.northscale.com/memcached-win64-1.4.4-14.zip
http://downloads.northscale.com/memcached-1.4.5-x86.zip
http://downloads.northscale.com/memcached-1.4.5-amd64.zip
memcached-1.4.5 以下的安装
c:\memcached\memcached.exe -d install
c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop
"c:\memcached\memcached.exe" -d runservice -m 512
c:\memcached\memcached.exe -d uninstall
memcached-1.4.5 或以上的安装
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
schtasks /delete /tn memcached
php.ini 需要添加
extension=php_memcache.dll
Linux
# 去 http://pecl.php.net 下载最新的包, 现在的是memcached-2.2.7.tgz
$ wget http://pecl.php.net/get/memcached-2.2.7.tgz
$ tar zxvf memcached-2.2.7.tgz
$ cd memcached-2.2.7
$ sudo apt-get install php7.0-dev # 如果已安装 PHP 的话, 就跳过
$ phpize
$ ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config -with-zlib-dir
如果 libmemcached 是自己选定位置安装的,
那还要加上-with-libmemcached-dir=<DIR>
$ make && make install
PHP + memcached 整合
$ whereis php # 找出 php.ini 的位置
$ gedit php.ini
extension=/usr/local/php/lib/php/extensions/xxx/memcached.so
$ php -m # 会多出 memcached 模块
Python + memcached 整合
pip install python-memcached
pip install python3-memcached
python 代码
import memcache
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
mc.set("some_key", "Some value")
value = mc.get("some_key")
mc.set("another_key", 3)
mc.delete("another_key")
mc.set("key", "1") # note that the key used for incr/decr must be a string.
mc.incr("key")
mc.decr("key")
http://downloads.northscale.com/memcached-win32-1.4.4-14.zip
http://downloads.northscale.com/memcached-win64-1.4.4-14.zip
http://downloads.northscale.com/memcached-1.4.5-x86.zip
http://downloads.northscale.com/memcached-1.4.5-amd64.zip
memcached-1.4.5 以下的安装
c:\memcached\memcached.exe -d install
c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop
"c:\memcached\memcached.exe" -d runservice -m 512
c:\memcached\memcached.exe -d uninstall
memcached-1.4.5 或以上的安装
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
schtasks /delete /tn memcached
php.ini 需要添加
extension=php_memcache.dll
Linux
# 去 http://pecl.php.net 下载最新的包, 现在的是memcached-2.2.7.tgz
$ wget http://pecl.php.net/get/memcached-2.2.7.tgz
$ tar zxvf memcached-2.2.7.tgz
$ cd memcached-2.2.7
$ sudo apt-get install php7.0-dev # 如果已安装 PHP 的话, 就跳过
$ phpize
$ ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config -with-zlib-dir
如果 libmemcached 是自己选定位置安装的,
那还要加上-with-libmemcached-dir=<DIR>
$ make && make install
PHP + memcached 整合
$ whereis php # 找出 php.ini 的位置
$ gedit php.ini
extension=/usr/local/php/lib/php/extensions/xxx/memcached.so
$ php -m # 会多出 memcached 模块
Python + memcached 整合
pip install python-memcached
pip install python3-memcached
python 代码
import memcache
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
mc.set("some_key", "Some value")
value = mc.get("some_key")
mc.set("another_key", 3)
mc.delete("another_key")
mc.set("key", "1") # note that the key used for incr/decr must be a string.
mc.incr("key")
mc.decr("key")
2016年5月21日星期六
Windows - Docker 安装
Windows 版的 Docker
https://www.docker.com/products/docker-toolbox
https://github.com/docker/toolbox/releases/download/v1.11.1b/DockerToolbox-1.11.1b.exe
https://training.docker.com/self-paced-training
Windows 版会用 VirtualBox 运行 Linux, Docker 才能运行 (毕竟 Docker 出自 Linux),
之后你可以选择用有界面的 (Kitematic) 或直接用 docker 指令输入 (Terminal),
但发觉 Kitematic 并没有提示镜像是可以自己编译的,
所以, 我觉得花点时间学 docker 指令是必要的
https://www.docker.com/products/docker-toolbox
https://github.com/docker/toolbox/releases/download/v1.11.1b/DockerToolbox-1.11.1b.exe
https://training.docker.com/self-paced-training
Windows 版会用 VirtualBox 运行 Linux, Docker 才能运行 (毕竟 Docker 出自 Linux),
之后你可以选择用有界面的 (Kitematic) 或直接用 docker 指令输入 (Terminal),
但发觉 Kitematic 并没有提示镜像是可以自己编译的,
所以, 我觉得花点时间学 docker 指令是必要的
Linux - Docker 安装
Ubuntu
$ su
$ apt-get install curl
$ apt-get install docker.io
Linux Mint 18
$ su
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ gedit /etc/apt/sources.list.d/docker.list
# Ubuntu Xenial (16.04)
deb https://apt.dockerproject.org/repo ubuntu-xenial main
$ apt-get update
$ apt-get purge lxc-docker
# apt-get install linux-image-extra-$(uname -r)
$ apt-get install docker-engine
Fedora 23
$ su
$ dnf update -y
$ dnf -y install docker-io
CentOS 7
$ su
$ yum install docker
或
# 安装较新版的 docker
$ gedit /etc/yum.repos.d/docker.repo
[virt7-docker-common-candidate]
name=virt7-docker-common-candidate
baseurl=http://cbs.centos.org/repos/virt7-docker-common-candidate/x86_64/os/
enabled=1
gpgcheck=0
$ yum install docker --disablerepo=extras
安装后..
# 将 username 加入, 让这个 ID 可以运行 docker
$ usermod -aG docker username
或
$ groupadd docker
$ gpasswd -a ${USER} docker
$ service docker restart
$ systemctl start docker
$ systemctl enable docker
# 查看 docker 状况
$ systemctl status docker
# 关闭 docker
$ systemctl disable docker
$ systemctl stop docker
$ su
$ apt-get install curl
$ apt-get install docker.io
Linux Mint 18
$ su
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ gedit /etc/apt/sources.list.d/docker.list
# Ubuntu Xenial (16.04)
deb https://apt.dockerproject.org/repo ubuntu-xenial main
$ apt-get update
$ apt-get purge lxc-docker
# apt-get install linux-image-extra-$(uname -r)
$ apt-get install docker-engine
Fedora 23
$ su
$ dnf update -y
$ dnf -y install docker-io
CentOS 7
$ su
$ yum install docker
或
# 安装较新版的 docker
$ gedit /etc/yum.repos.d/docker.repo
[virt7-docker-common-candidate]
name=virt7-docker-common-candidate
baseurl=http://cbs.centos.org/repos/virt7-docker-common-candidate/x86_64/os/
enabled=1
gpgcheck=0
$ yum install docker --disablerepo=extras
安装后..
# 将 username 加入, 让这个 ID 可以运行 docker
$ usermod -aG docker username
或
$ groupadd docker
$ gpasswd -a ${USER} docker
$ service docker restart
$ systemctl start docker
$ systemctl enable docker
# 查看 docker 状况
$ systemctl status docker
# 关闭 docker
$ systemctl disable docker
$ systemctl stop docker
Docker - PHP + memcached
Ubuntu - Docker - Nginx / PHP / MySql
http://jasonmun.blogspot.my/2016/05/ubuntu-docker-nginx-php-mysql.html
在弄 php-fpm-mysql 镜像的时候,
Dockerfile 文件中添加安装 memcached 模块
\
&& apt-get install -y libmemcached-dev \
&& pecl install memcached \
&& docker-php-ext-enable memcached
https://hub.docker.com/_/memcached
# 启动容器
$ docker run --name memcached-ct -d -p 11211:11211 memcached:1.4.25
# 如果是之后添加的, php-fpm-mod 和 nginx_server 都要撤除与重启
$ docker stop php-fpm-mod
$ docker rm php-fpm-mod
$ docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql
$ docker stop nginx_server
$ docker rm nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix
# 进入容器 php-fpm-mod 中
$ docker exec -it php-fpm-mod bash
$ php -m # 可以找到 memcached 模块
# 测试
$ telnet 192.168.247.128 11211
Trying 192.168.247.128...
Connected to 192.168.247.128.
Escape character is '^]'.
set id 0 0 4
1234
STORED
get id
VALUE id 0 4
1234
END
quit
PHP 代码
<?php
$memcache = new Memcache;
$memcache->connect("192.168.247.128",11211);
echo "Server's version: " . $memcache->getVersion() . "<br />\n";
$testArray = array('horse', 'cow', 'pig');
$tmp = serialize($testArray);
$memcache->add("key", $tmp, 30);
echo "Data from the cache:<br />\n";
print_r(unserialize($memcache->get("key")));
?>
http://jasonmun.blogspot.my/2016/05/ubuntu-docker-nginx-php-mysql.html
在弄 php-fpm-mysql 镜像的时候,
Dockerfile 文件中添加安装 memcached 模块
\
&& apt-get install -y libmemcached-dev \
&& pecl install memcached \
&& docker-php-ext-enable memcached
https://hub.docker.com/_/memcached
# 启动容器
$ docker run --name memcached-ct -d -p 11211:11211 memcached:1.4.25
# 如果是之后添加的, php-fpm-mod 和 nginx_server 都要撤除与重启
$ docker stop php-fpm-mod
$ docker rm php-fpm-mod
$ docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql
$ docker stop nginx_server
$ docker rm nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix
# 进入容器 php-fpm-mod 中
$ docker exec -it php-fpm-mod bash
$ php -m # 可以找到 memcached 模块
# 测试
$ telnet 192.168.247.128 11211
Trying 192.168.247.128...
Connected to 192.168.247.128.
Escape character is '^]'.
set id 0 0 4
1234
STORED
get id
VALUE id 0 4
1234
END
quit
PHP 代码
<?php
$memcache = new Memcache;
$memcache->connect("192.168.247.128",11211);
echo "Server's version: " . $memcache->getVersion() . "<br />\n";
$testArray = array('horse', 'cow', 'pig');
$tmp = serialize($testArray);
$memcache->add("key", $tmp, 30);
echo "Data from the cache:<br />\n";
print_r(unserialize($memcache->get("key")));
?>
2016年5月20日星期五
Ubuntu - Docker - Nginx / PHP / MySql + phpmyadmin
1. mysql_data 和 wwwroot
(用这可以避免当 mysql 更换时, 需再输入资料)
https://hub.docker.com/_/busybox/
$ docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data
$ cd /home/用户名
$ mkdir www
$ docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot
* 这 2 个容器不需要开启, 因它们只是用作挂载主机的文件夹到容器中而已
2. Mysql Server 5.5 (3306/tcp)
https://hub.docker.com/_/mysql/
# mysql - 设置密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5
# mysql - 设置空密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -d mysql:5.5
# 进入容器 mysql
$ docker exec -it mysql_server bash
$ mysql -uroot -p123456
mysql> create database test_db;
mysql> create table student (name VARCHAR(20), age INT(10));
mysql> insert into student (name, age) values ("Andrew", "40");
mysql> quit
$ exit # 退出回主机
# 检查容器 mysql_server 有没有 up
$ docker ps -a
$ docker start mysql_server
3. php-fpm-mod - 从 php-fpm 5.6.19 加入一些 mysql 等模块,
制作成 php-fpm-mysql 镜像 (9000/tcp)
https://hub.docker.com/_/php/
$ cd /home/用户名
$ mkdir dockerfile_php
$ cd dockerfile_php
$ gedit Dockerfile
# 应可以改去 php:5.6.21-fpm, 但 php:7-fpm 会有些模块不能安装
FROM php:5.6.19-fpm
# Install modules
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-configure mysqli --with-mysqli=mysqlnd \
&& docker-php-ext-install mysqli \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-configure mysql --with-mysql=mysqlnd \
&& docker-php-ext-install mysql
CMD ["php-fpm"]
# 编译镜像 php-fpm-mysql
$ docker build -t php-fpm-mysql /home/用户名/dockerfile_php
$ docker images
# 运行容器 php-fpm-mod
$ docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql
$ docker exec -it php-fpm-mod cat /etc/hosts
172.17.0.2 mysql ad0d03214936 mysql_server # 从这里知道 mysql_server 的 IP
172.17.0.3 f20cb9377b85
# 在 php-fpm-mod 测试 mysql
$ docker exec -it php-fpm-mod ping -c 3 mysql
# 检查容器 php-fpm-mod 有没有 up
$ docker ps -a
$ docker start php-fpm-mod
4. 准备3个测试文件
$ gedit /home/用户名/www/index.html
<html>
<head>
<title>Testing</title>
</head>
<body>
Testing
</body>
</html>
$ gedit /home/用户名/www/index.php
<?php
phpinfo();
?>
$ gedit /home/用户名/www/mysql.php
<?php
$con = mysql_connect("172.17.0.2","root","123456");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db("test_db", $con);
$result = mysql_query("SELECT * FROM student");
while($row = mysql_fetch_array($result)) {
echo $row['name'] . " " . $row['age'];
echo "<br />";
}
mysql_close($con);
?>
5. Nginx Server (因要改设置文件, 所以要制作 nginx-fix 镜像)
https://hub.docker.com/_/nginx/
# 可以先运行容器 nginx_server, 备份里面的 /etc/nginx/conf.d/default.conf
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx
$ docker cp nginx_server:/etc/nginx/conf.d/default.conf /home/用户名/default-ori.conf
$ docker stop nginx_server
$ docker rm nginx_server # 撤容器 nginx_server
# 准备编译 nginx-fix-0 镜像
$ cd /home/用户名
$ mkdir dockerfile_nginx
# 准备 nginx 设置文件
$ gedit /home/用户名/dockerfile_nginx/default.conf
server {
listen 80;
root /var/www/html;
index index.html index.htm index.php;
server_name localhost;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
# 准备 Dockerfile 编译镜像
$ gedit /home/用户名/dockerfile_nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/
# 编译镜像 nginx-fix-0
$ docker build -t nginx-fix-0 /home/用户名/dockerfile_nginx
$ docker images
# 运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix-0
如果现在去浏览 http://127.0.0.1/index.php # 可用 ifconfig 找 IP
会发现空白一片
以下开始 Fix 问题..
# $ docker exec -it nginx_server cat /etc/nginx/fastcgi_params
# 容器 nginx_server 中复制 fastcgi_params 出来
$ docker cp nginx_server:/etc/nginx/fastcgi_params /home/用户名/dockerfile_nginx
$ docker stop nginx_server
$ docker rm nginx_server # 撤容器 nginx_server
$ docker rmi nginx-fix-0 # 撤镜像 nginx-fix-0
# 在 fastcgi_params 中添加一行
$ gedit /home/用户名/dockerfile_nginx/fastcgi_params
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
# 添加这行以解决空白页的问题
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 修改 Dockerfile, 添加 fastcgi_params 文件
$ gedit /home/用户名/dockerfile_nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/
COPY fastcgi_params /etc/nginx/
# 重新编译镜像 nginx-fix
$ docker build -t nginx-fix /home/用户名/dockerfile_nginx
$ docker images
# 再运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix
# 检查容器 nginx_server 有没有 up
$ docker ps -a
$ docker start nginx_server
6. phpmyadmin (8080/tcp)
$ docker run --name phpmyadmin --link mysql_server -e PMA_HOST=mysql_server -p 8080:80 -d phpmyadmin/phpmyadmin
这个要用 http://127.0.0.1:8080
7. 开关容器程序 (不一定要用 docker-compose)
$ gedit control.sh
if [ `docker ps -a | grep -c "mysql_data"` -eq 0 ]
then
var1=`docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data`
fi
if [ `docker ps -a | grep -c "wwwroot"` -eq 0 ]
then
var1=`docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot`
fi
if [ `docker ps -a | grep -c "mysql_server"` -eq 0 ]
then
var1=`docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5`
fi
if [ `docker ps -a | grep -c "php-fpm-mod"` -eq 0 ]
then
var1=`docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql`
fi
if [ `docker ps -a | grep -c "nginx_server"` -eq 0 ]
then
var1=`docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix`
var1=`docker stop nginx_server`
fi
var=`docker ps`
if [ `echo $var | grep -c "80/tcp" ` -gt 0 ]
then
var1=`docker stop nginx_server`
var1=`docker rm nginx_server`
if [ `echo $var | grep -c "9000/tcp" ` -gt 0 ]
then
var1=`docker stop php-fpm-mod`
var1=`docker rm php-fpm-mod`
fi
if [ `echo $var | grep -c "3306/tcp" ` -gt 0 ]
then
var1=`docker stop mysql_server`
var1=`docker rm mysql_server`
fi
else
var1=`docker start mysql_server`
if [ `echo $var | grep -c "9000/tcp" ` -eq 0 ]
then
var1=`docker start php-fpm-mod`
fi
if [ `echo $var | grep -c "80/tcp" ` -eq 0 ]
then
var1=`docker start nginx_server`
fi
fi
var=`docker ps`
echo "$var"
$ ./control.sh
(用这可以避免当 mysql 更换时, 需再输入资料)
https://hub.docker.com/_/busybox/
$ docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data
$ cd /home/用户名
$ mkdir www
$ docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot
* 这 2 个容器不需要开启, 因它们只是用作挂载主机的文件夹到容器中而已
2. Mysql Server 5.5 (3306/tcp)
https://hub.docker.com/_/mysql/
# mysql - 设置密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5
# mysql - 设置空密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -d mysql:5.5
# 进入容器 mysql
$ docker exec -it mysql_server bash
$ mysql -uroot -p123456
mysql> create database test_db;
mysql> create table student (name VARCHAR(20), age INT(10));
mysql> insert into student (name, age) values ("Andrew", "40");
mysql> quit
$ exit # 退出回主机
# 检查容器 mysql_server 有没有 up
$ docker ps -a
$ docker start mysql_server
3. php-fpm-mod - 从 php-fpm 5.6.19 加入一些 mysql 等模块,
制作成 php-fpm-mysql 镜像 (9000/tcp)
https://hub.docker.com/_/php/
$ cd /home/用户名
$ mkdir dockerfile_php
$ cd dockerfile_php
$ gedit Dockerfile
# 应可以改去 php:5.6.21-fpm, 但 php:7-fpm 会有些模块不能安装
FROM php:5.6.19-fpm
# Install modules
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-configure mysqli --with-mysqli=mysqlnd \
&& docker-php-ext-install mysqli \
&& docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-configure mysql --with-mysql=mysqlnd \
&& docker-php-ext-install mysql
CMD ["php-fpm"]
# 编译镜像 php-fpm-mysql
$ docker build -t php-fpm-mysql /home/用户名/dockerfile_php
$ docker images
# 运行容器 php-fpm-mod
$ docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql
$ docker exec -it php-fpm-mod cat /etc/hosts
172.17.0.2 mysql ad0d03214936 mysql_server # 从这里知道 mysql_server 的 IP
172.17.0.3 f20cb9377b85
# 在 php-fpm-mod 测试 mysql
$ docker exec -it php-fpm-mod ping -c 3 mysql
# 检查容器 php-fpm-mod 有没有 up
$ docker ps -a
$ docker start php-fpm-mod
4. 准备3个测试文件
$ gedit /home/用户名/www/index.html
<html>
<head>
<title>Testing</title>
</head>
<body>
Testing
</body>
</html>
$ gedit /home/用户名/www/index.php
<?php
phpinfo();
?>
$ gedit /home/用户名/www/mysql.php
<?php
$con = mysql_connect("172.17.0.2","root","123456");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db("test_db", $con);
$result = mysql_query("SELECT * FROM student");
while($row = mysql_fetch_array($result)) {
echo $row['name'] . " " . $row['age'];
echo "<br />";
}
mysql_close($con);
?>
5. Nginx Server (因要改设置文件, 所以要制作 nginx-fix 镜像)
https://hub.docker.com/_/nginx/
# 可以先运行容器 nginx_server, 备份里面的 /etc/nginx/conf.d/default.conf
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx
$ docker cp nginx_server:/etc/nginx/conf.d/default.conf /home/用户名/default-ori.conf
$ docker stop nginx_server
$ docker rm nginx_server # 撤容器 nginx_server
# 准备编译 nginx-fix-0 镜像
$ cd /home/用户名
$ mkdir dockerfile_nginx
# 准备 nginx 设置文件
$ gedit /home/用户名/dockerfile_nginx/default.conf
server {
listen 80;
root /var/www/html;
index index.html index.htm index.php;
server_name localhost;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
# 准备 Dockerfile 编译镜像
$ gedit /home/用户名/dockerfile_nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/
# 编译镜像 nginx-fix-0
$ docker build -t nginx-fix-0 /home/用户名/dockerfile_nginx
$ docker images
# 运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix-0
如果现在去浏览 http://127.0.0.1/index.php # 可用 ifconfig 找 IP
会发现空白一片
以下开始 Fix 问题..
# $ docker exec -it nginx_server cat /etc/nginx/fastcgi_params
# 容器 nginx_server 中复制 fastcgi_params 出来
$ docker cp nginx_server:/etc/nginx/fastcgi_params /home/用户名/dockerfile_nginx
$ docker stop nginx_server
$ docker rm nginx_server # 撤容器 nginx_server
$ docker rmi nginx-fix-0 # 撤镜像 nginx-fix-0
# 在 fastcgi_params 中添加一行
$ gedit /home/用户名/dockerfile_nginx/fastcgi_params
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
# 添加这行以解决空白页的问题
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 修改 Dockerfile, 添加 fastcgi_params 文件
$ gedit /home/用户名/dockerfile_nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/
COPY fastcgi_params /etc/nginx/
# 重新编译镜像 nginx-fix
$ docker build -t nginx-fix /home/用户名/dockerfile_nginx
$ docker images
# 再运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix
# 检查容器 nginx_server 有没有 up
$ docker ps -a
$ docker start nginx_server
6. phpmyadmin (8080/tcp)
$ docker run --name phpmyadmin --link mysql_server -e PMA_HOST=mysql_server -p 8080:80 -d phpmyadmin/phpmyadmin
这个要用 http://127.0.0.1:8080
7. 开关容器程序 (不一定要用 docker-compose)
$ gedit control.sh
if [ `docker ps -a | grep -c "mysql_data"` -eq 0 ]
then
var1=`docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data`
fi
if [ `docker ps -a | grep -c "wwwroot"` -eq 0 ]
then
var1=`docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot`
fi
if [ `docker ps -a | grep -c "mysql_server"` -eq 0 ]
then
var1=`docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5`
fi
if [ `docker ps -a | grep -c "php-fpm-mod"` -eq 0 ]
then
var1=`docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql`
fi
if [ `docker ps -a | grep -c "nginx_server"` -eq 0 ]
then
var1=`docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix`
var1=`docker stop nginx_server`
fi
var=`docker ps`
if [ `echo $var | grep -c "80/tcp" ` -gt 0 ]
then
var1=`docker stop nginx_server`
var1=`docker rm nginx_server`
if [ `echo $var | grep -c "9000/tcp" ` -gt 0 ]
then
var1=`docker stop php-fpm-mod`
var1=`docker rm php-fpm-mod`
fi
if [ `echo $var | grep -c "3306/tcp" ` -gt 0 ]
then
var1=`docker stop mysql_server`
var1=`docker rm mysql_server`
fi
else
var1=`docker start mysql_server`
if [ `echo $var | grep -c "9000/tcp" ` -eq 0 ]
then
var1=`docker start php-fpm-mod`
fi
if [ `echo $var | grep -c "80/tcp" ` -eq 0 ]
then
var1=`docker start nginx_server`
fi
fi
var=`docker ps`
echo "$var"
$ ./control.sh
订阅:
博文 (Atom)