TIPS
Vagrant
Vagrantというものを聞いたことはありますか?
まぁ簡単にいえば仮想マシンをもっと簡潔に構築することができるツールです. 例えば仮想マシン環境を構築したい場合, 各OS毎に毎回インストールをして, ... という作業は面倒くさいものです.そこでそこら辺の作業を全部コマンド経由で勝手にやってくれたらいいよね.というようなツールです.
各自以下のページでダウンロードしてインストールしてみましょう.
次にシェルを開き, vagrant -hとか打ってみます.これでコマンドが出てくればOKです.
では使ってみます.
適当にホームディレクトリ上にvagrantというようなディレクトリを作成し, 更にubuntu1604と言った名前のディレクトリを作ります.
そうしたら,
$ vagrant init ubuntu/xenial64; vagrant up --provider virtualbox
$ vagrant ssh
で仮想マシン上にログインできます.
どうでしょうか? ダウンロードも含めると10分もしないでUbuntuの仮想マシンができました.
また, /vagrant にホストマシンの先ほど作成したディレクトリがマウントされるのでホスト, 仮想間のファイルやり取りも簡単にできます.
またデフォルトではネットワーク構成はNATでメモリ量も決まっていますがVagrantfileをいじればそのへんの設定も変えることができます.
また以下のように多くのディストリビューションが公開されていて, すぐに仮想マシンを作れます
これで楽々仮想マシンライフを楽しんでみてはw
Docker

Dockerは仮想化技術の1つでコンテナと呼ばれるものを扱うソフトウェアらしいw
正直使ってみると楽な感じがわかると思うので, 以下実演してみる. (実演 2分程度?)
Dockerと仮想マシンの違い
Dockerと仮想マシンについての違い, 特徴については,
に詳しく書かれています.
(画像はDocker公式のページより)
左のVMではゲストOSを用意し,アプリケーションをデプロイするため,多くの容量を必要としましたが, コンテナはハイレベルから見ればプロセスが隔離され,メモリも食わず,ネットワークも独自に振られていて, root権限も扱える軽量なVMに見えます. 低いレベルから見れば,1つのコンテナで1プロセスであり, カーネルをホストと共有し,エミュレーションがないためオーバーヘッドが少なく,cgroupsを用いればリソース制限もできるというものになります.
さらにDockerfileというものを書くことでインフラをコード化することができ,楽だね.ということです.
Dockerのインストール
Dockerをインストールしましょう.以下の方法はMacを前提に書いています.その他のOSを利用している方は
の各ディストリビューション毎の設定を見てください. Windowsにおいてはバイナリファイルが配布されているのでそれを利用すれば使うことができます.
さて, Macにおいては前提となるLinuxカーネルが存在しません.そこでboot2dockerと呼ばれる簡易なLinuxをVirtualBoxにインストールします.
まず, HomebrewでDockerをまとめてインストールしましょう.
$ brew install docker docker-machine docker-compose
そうしたら先ほど行ったようにVMを作成します.
$ docker-machine create -d virtualbox default
(仮想マシンが生まれる)
$ docker-machine ls # docker-machineの一覧
さて, ここまで来たらDocker環境が整いました.よくやるhello, worldを動かしてみましょう.
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
a9d36faac0fe: Pull complete
Digest: sha256:e52be8ffeeb1f374f440893189cd32f44cb166650e7ab185fa7735b7dc48d619
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
ついでにUbuntuも動かしてみましょうか.
$ docker run -it ubuntu:14.04
root@0c4640ba971c:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty
実演したようにここでWordpressのDockerコンテナをデプロイして実行してみましょう.
$ docker run --name wordpress-mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.6
7ed3b40cc734827f251f8ad66ac8676fb5444f429aa4ea3b5e222a7abf96cb67
$ docker run -d --name wordpress --link wordpress-mysql:mysql -p 8080:80 wordpress
b205f06d5d75b91834f626473d50d1038eadda350586eb4506ceee948a75be65
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b205f06d5d75 wordpress "/entrypoint.sh apach" 37 seconds ago Up 35 seconds 0.0.0.0:8080->80/tcp wordpress
297cc134f17d mysql:5.6 "docker-entrypoint.sh" About a minute ago Up About a minute 3306/tcp wordpress-mysql
こんな感じで簡単に少量のメモリやリソースで各環境を作ることができるため, 非常に便利ですね.
Dockerコマンドリファレンス
まず, コンテナイメージを入手します.これは
$ docker pull ubuntu:14.04 # Ubuntuのtag 14.04を落としてくる
でできます.次にコンテナを起動してみます.
$ docker run ubuntu:14.04 lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty
Dockerの面白いことにプロセスの実行が終わったらすぐにコンテナが終了します. そこでコンテナの一覧を見てみましょう.
$ docker ps -a # すべてを表示
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33445bfd9cda ubuntu:14.04 "lsb_release -a" About a minute ago Exited (0) About a minute ago cranky_euclid
またコンテナを起動したいときは,
$ docker start 33445 # 起動したいコンテナのIDを入力する
33445
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33445bfd9cda ubuntu:14.04 "lsb_release -a" 2 minutes ago Exited (0) 2 seconds ago cranky_euclid
こんな感じで実行したらすぐさまコンテナが終了します. コンテナを消したい場合はrmコマンドで消せます.
$ docker rm 33445
33445
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
例えばNginxといったWebサーバーなどを使いたいときは後ろでデーモン化させずっと起動させておくことでコンテナを維持できます.(あとrun時に-dオプションを付けます)
実際にやってみましょう.
$ docker run --name nginx -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
51f5c6a04d83: Already exists
a3ed95caeb02: Pull complete
51d229e136d0: Pull complete
bcd41daec8cc: Pull complete
Digest: sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
Status: Downloaded newer image for nginx:latest
620a8758db606e2900803c185142b416ee3612fd1b9da25f4cdc08c8707fd11c
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
620a8758db60 nginx "nginx -g 'daemon off" 27 seconds ago Up 26 seconds 443/tcp, 0.0.0.0:8080->80/tcp nginx
コマンドの意味としては-dでデーモン化, -pでポートフォワーディング, --nameで名前をつけることによってこの名前でコンテナにアクセスできます.
私の環境ではhttp://localhost:8080でお馴染みのWelcome to nginxが表示されましたがdocker-machineを使っている場合はdocker-machine ipに表示されたIPアドレスを使ってアクセスしてください.
またコンテナが起動している時にコンテナ内に入ってシェルを起動したいというようなときがあります.こんなときはdocker attachやdocker startなどをしても無駄で以下のコマンドで行うことができます.
$ docker exec nginx /bin/bash
root@620a8758db60:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 31688 4808 ? Ss 15:49 0:00 nginx: master process nginx -g daemon off;
nginx 6 0.0 0.1 32080 2940 ? S 15:49 0:00 nginx: worker process
root 7 0.2 0.1 20040 2716 ? Ss 15:53 0:00 /bin/bash
root 19 0.5 0.1 20224 3036 ? Ss 15:53 0:00 /bin/bash
root 24 0.0 0.1 17500 2056 ? R+ 15:54 0:00 ps aux
またexecはそれで実行したプロセスを終了させても元のコンテナが終了することはありません.
上記の様に永久的に動いているコンテナを止めるためにはstopを用います.
$ docker stop nginx
nginx
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
620a8758db60 nginx "nginx -g 'daemon off" 5 minutes ago Exited (0) 3 seconds ago nginx
ダウンロードしたコンテナイメージの一覧はdocker imagesで見ることができ, それらの削除はdocker rmiコマンドで行います.先ほどダウンロードしてきたnginxのイメージを消してみます.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0d409d33b27e 8 days ago 182.8 MB
$ docker rmi nginx
Untagged: nginx:latest
Deleted: sha256:0d409d33b27e47423b049f7f863faa08655a8c901749c2b25b93ca67d01a470d
Deleted: sha256:894e1c82ec1396d0d30c0f710d0df5ae5f8dc543e53cca3f92d305fe09370282
Deleted: sha256:26fdf3d8f16c52bcf3c6b363739bda3c9531e394427d09d7118446914eedae02
Deleted: sha256:2254f56d1c260b47ea426e484164f7ef161310ef7d8a089d3a2f86a31fcd575f
Deleted: sha256:f75463f4fa42454f52336dcab2c98ed51c3466db347c2bc4e210d708645e77f2
Deleted: sha256:8a12ca546a1bd35ad5d1521645c95bf731bf86ccec2131f5499d1fcdfd5f8d43
Deleted: sha256:0c01e4298c8c6e3d7452f2a3e61addc98ac96242b0d679ae22ec02dc6961e0d7
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
最後に自分でコンテナイメージを作成したい場合があると思います.
そんなときはDockerfileというものを書き, docker buildをすることで自分だけのイメージを手に入れることができます.
Dockerfileの書き方については以下を参考にしてみると良いでしょう.
docker-machine コマンドリファレンス
WindowsやMacがホストマシンのユーザーは基本的にdocker-machineを使います.
最初に述べたようにdocker-machineで使う仮想マシンを作成します.
$ docker-machine create -d virtualbox default
Running pre-create checks...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v1.11.2
(default) Downloading /Users/jtwp470/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.11.2/boot2docker.iso...
(default) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(default) Copying /Users/jtwp470/.docker/machine/cache/boot2docker.iso to /Users/jtwp470/.docker/machine/machines/default/boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Found a new host-only adapter: "vboxnet0"
(default) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default
ちなみにですが-d以下ではVirtualBox以外にもAWSやAzure, GCPや自前のLinuxサーバーなどを指定することもできます.
うまいことできたら, docker-machine env defaultとうち,
$ eval $(docker-machine env default)
で環境変数を認識させます.
docker-machineの一覧はlsコマンドで, docker-machineを止めるにはdocker-machine stopでできます.
こんな感じで一度docker-machineを作成したらdocker-machine start defaultで仮想マシンを起動し, eval ~で環境変数を認識させ使い終わったら, docker-machine stop defaultで仮想マシンを停止させるようにしましょう.
その他のドキュメントに関しては公式ドキュメントを読みましょう.
docker-composeで複数のDockerコンテナを組み合わせる
docker-composeを使うと複数のコンテナを束ねて使うことができます.
なので, Wordpressを使いたいときは, 普通PHPインストール済みのWordpressとApache, そしてMySQLのコンテナを組み合わせたりします.
まず, docker-compose.ymlを書く.
wordpress:
image: wordpress
links:
- db:mysql
ports:
- 8080:80
db:
image: mysql:5.6
environment:
MYSQL_ROOT_PASSWORD: password
そうしてdocker-compose.ymlのあるディレクトリに行き,
$ docker-compose up
...
あとは適当なブラウザでhttp://localhost:8080などを開けばWordPressが動いていることを確認できます.
なので簡単に複数のコンテナを組み合わせながら環境を構築することが可能です.
Ansible
(書きたかったw)
