MacでVagrantを使って仮想マシンを立ち上げる

やはりVagrantは使う時には使う。永久保存版立ち上げメモ。

環境の用意

VirtualBoxのインストールをこちらからする
https://www.virtualbox.org/

Vagrantのインストールをこちらからする
https://www.vagrantup.com/

インストールと起動

何かと便利なFedoraを使います

cd ~/path/to/hoge
vagrant box add fedora20 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_fedora-20_chef-provisionerless.box
vagrant init fedora20
vagrant up
vagrant ssh

メモ

馴染みのあるDockerを立ち上げるテスト(docker-ioであることをよく忘れる)

sudo yum -y install docker-io
sudo systemctl enable docker
sudo systemctl start docker

Dockerを使う時はこんな感じ

sudo docker ps

rootになる場合は以下でいける

sudo su -

ちなみにやることは殆ど無いけどVirtualBoxで直接マシンのコンソールを使うと抜けられなくなるけどalt+commandで抜けられた。久しぶりに触ると分からなくなった。。。

Dockerで立ち上げたCentOSでsystemctlを使うとFailed to get D-Bus connection: Operation not permittedと出る

コンテナの中でsystemctlを使うことは基本ないのだが、検証用にまっさらコンテナを立ち上げて中で色々テストしたい時に使えたらなーと思って実行してみたらこうなりました。

$ systemctl
Failed to get D-Bus connection: Operation not permitted

無理なのではないかと思っていたが--privilegedを付けて、コンテナを立ち上げてから入ることでsystemctlが使えるようになった。

docker run --privileged --name centos -d centos /sbin/init
docker exec -ti centos bash

これでテスト用にVagrantでVMを立ち上げたりしていたシーンでも、Dockerコンテナで代用できるようになりました。

参考
http://qiita.com/yunano/items/9637ee21a71eba197345

Dockerで一時的なまっさらな環境を瞬時に立ち上げる

DockerHubにCentOSのイメージがあるのでこれを以下のようにして立ち上げて入ると、まっさらな環境が瞬時に立ち上がります。

docker run --rm -ti centos bash

実際に実行するとこんな感じでCentOSの中に入ることができ、普通にyumとか使えます。

[setouchi@mac ~]$ docker run --rm -ti centos bash
[root@33841973cc7b /]#

ローカルの依存関係の関係上手元ではビルドできないとか、仕方なくビルドするために依存関係を入れたくないみたいな時に、こういう環境を立ち上げてビルドできます。

(追記) systemctlを使えるようにするなら以下のようにして立ち上げる

docker run --rm --privileged --name centos -d centos /sbin/init
docker exec -ti centos bash

ubuntuイメージでもOK

docker run --rm -ti ubuntu bash

ubuntuの場合はデフォルトで色々インストールできない(例えばcurlをインストールしようしたら E: Unable to locate package curl とか言われる)のでapt-get updateを最初に行う。するとインストールできるようになります。

docker runした時に出るloopback devicesのエラーメッセージを消す

docker runすると下記のエラーが出るようになりました

Usage of loopback devices is strongly discouraged for production use. Either use --storage-opt dm.thinpooldev or use --storage-opt dm.no_warn_on_loop_devices=true to suppress this warning.

/etc/sysconfig/docker-storageに下記を追加します

DOCKER_STORAGE_OPTIONS="--storage-opt dm.no_warn_on_loop_devices=true"

Dockerを再起動するとメッセージが消えます

systemctl restart docker

参考
http://qiita.com/ngyuki/items/a6ef879a285573efd59f

DockerHubのWordPressイメージにプラグインを追加する

DockerHubのWordPressイメージを立ち上げるのは非常に簡単ですが、WordPressの管理画面のGUIを使ったプラグインのインストールをしても再度コンテナを立ち上げ直すと消えるので独自の調整が必要です。

プラグインのインストール方法

方法は2つあって

  1. 事前にダウンロードして展開しておいたプラグインをADDする方法
  2. docker build時にRUNでプラグインファイルをダウンロードして解凍と展開を行う方法

があります。2つめの方がDockerfile上で完結するのでおすすめです。テーマファイルなどにも使えるかと思います。

Dockerfileの作成

以下のDockerfileは

  • Google Analytics for WordPress
  • Revision Control
  • Jetpack Markdown

をインストールする場合のサンプルです。一旦/tmp以下にプラグインのzipファイルをダウンロードしてからプラグインディレクトリに解凍しています。その後掃除をして終了です。

# 公式のWordPressイメージをベースにする
FROM wordpress
# これから使う`wget`と`unzip`を入れる
RUN apt-get update
RUN apt-get -y --force-yes -o Dpkg::Options::="--force-confdef" install wget unzip
# プラグインファイルの一時ダウンロード先
WORKDIR /tmp/wp-plugins
# プラグインファイルをダウンロード
RUN wget https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.5.5.zip
RUN wget https://downloads.wordpress.org/plugin/revision-control.2.3.2.zip
RUN wget https://downloads.wordpress.org/plugin/jetpack-markdown.3.9.6.zip
# プラグインをWordPressのプラグインディレクトリに解凍する
RUN unzip './*.zip' -d /usr/src/wordpress/wp-content/plugins
RUN chown -R www-data:www-data /usr/src/wordpress/wp-content
# 一時ダウンロード先内の全ファイルの削除
RUN rm -rf '/tmp/wp-plugins'
# 戻る
WORKDIR /var/www/html

ビルド

あとはこのようにbuildをして

docker build -t registry.example.com/my/wordpress:latest ./

プライベートレジストリにイメージをpushします

docker push registry.example.com/my/wordpress:latest

そして公式のWordPressイメージと同じように立ち上げるとプラグイン入りのWordPressが立ち上がります

docker run -e WORDPRESS_DB_HOST=db.example.com:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_NAME=hoge -e WORDPRESS_DB_PASSWORD=password --name hoge -d -p 8080:80 registry.example.com/my/wordpress:latest

プラグインの設定は基本的にはDBに残ると思うので、コンテナを立ち上げ直してもプラグインは起動した状態になっていると思います。

メモ

注意点としてベースのWordPressイメージが更新されるたびに自分のイメージをビルドし直す必要があるのと、プラグインが新しくなったら公式から新しいプラグインのURLを持ってきて修正した上で、これまたビルドし直す必要があります。

参考

http://tech-blog.tsukaby.com/archives/989

Redisにテスト用の10万件のキーを速く追加する

単純にforで回して都度コマンドを発行してもいいけどちょっと時間がかかる

for i in {0..100000}
do
key=`printf %11d ${i}`
`redis-cli -n 2 HMSET key-$key a foo b bar c baz`
done

調べてみたらコマンドをファイルに並べてこんな風に実行できるそうだ

for i in {0..100000}
do
key=`printf %11d ${i}`
echo "redis-cli -n 2 HMSET key-$key a foo b bar c baz" >> ~/path/to/redis.commands
done
redis-cli -n 2 < ~/path/to/redis.commands

かなり早かった

参考
http://stackoverflow.com/questions/10822877/executing-batches-of-commands-using-redis-cli

PHPでBoolにキャストする

RedisでBoolが扱えないので数値で受け取った後にBoolにする事があって、深く実際に見てみたことがなかったので、この機会に書いてまとめたものをメモ。

var_dump((bool) 2);       // bool(true)
var_dump((bool) 1);       // bool(true)
var_dump((bool) 0);       // bool(false)
var_dump((bool) '1');     // bool(true)
var_dump((bool) '0');     // bool(false)
var_dump((bool) 'a');     // bool(true)
var_dump((bool) '');      // bool(false)
var_dump((bool) 'true');  // bool(true)
var_dump((bool) 'false'); // bool(true)

PHPでビット演算

ビット和(論理和)

echo decbin(0b11000 | 0b00001); // 11001

ビット積(論理積)

echo decbin(0b11000 & 0b01001); // 1000

左シフト(乗算)

echo decbin(0b111 << 4); // 1110000

右シフト(割算)

echo decbin(0b10100 >> 2); // 101

排他的論理和

echo decbin(0b11111 ^ 0b00101);