$ sudo fugu run -e VERY=nice
sudo: unable to resolve host ubuntu
docker run --detach --env="VERY=nice" --name="hello-world-nginx" --publish="8080:80" mattes/hello-world-nginx
Unable to find image 'mattes/hello-world-nginx' locally
Pulling repository mattes/hello-world-nginx
:
7513295db096: Download complete
65139809b1dbc597bf38d365a693c05ebcf2ef6f79c7739ea90f552f8e888a8e
これでnginxが起動しているDockerコンテナが起動しています。
$ docker ps
sudo: unable to resolve host ubuntu
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65139809b1db mattes/hello-world-nginx:latest nginx 42 seconds ago Up 41 seconds 0.0.0.0:8080->80/tcp hello-world-nginx
$ fugu
Usage: fugu COMMAND [LABEL] [arg...]
Swiss Army knife for Docker.
Commands:
build Build an image from a Dockerfile
run Run a command in a new container
exec Run a command in a running container
shell Open a shell in a running container
destroy Kil a running container and remove it
push Push an image or a repository to the registry
pull Pull an image or a repository from the registry
images List images (from remote registry)
show-data Show aggregated data for label
show-labels Show all labels
help Show help
Run 'fugu help COMMAND' for more information on a command.
$ sudo docker run --name deployd -p 2403:2403 -i -t sesteva/deployd
to start your app:
$ cd test
$ dpd
starting deployd v0.7.0...
listening on port 2403
type help for a list of commands
dpd >
Web UIはpublicフォルダ以下になりますので、ここをGitで管理するようにすればWebアプリケーション開発がスムーズになることでしょう。ちょっとしたWebアプリケーションであれば、Deploydを使うことですぐに開発できるようになります。フロントエンドエンジニアの方はもちろん、Webエンジニアの方におすすめのソフトウェアです。
# cd docker/quickstartapp
# pio template get PredictionIO/template-scala-parallel-ecommercerecommendation MyRecommendation
# cd MyRecommendation
# pio app new MyApp2
[INFO] [HBLEvents] The table pio_event:events_2 doesn't exist yet. Creating now...
[INFO] [App$] Initialized Event Store for this app ID: 2.
[INFO] [App$] Created new app:
[INFO] [App$] Name: MyApp2
[INFO] [App$] ID: 2
[INFO] [App$] Access Key: vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf
# curl https://raw.githubusercontent.com/apache/spark/master/data/mllib/sample_movielens_data.txt --create-dirs -o data/sample_movielens_data.txt
python data/import_eventserver.py --access_key vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf
Namespace(access_key='vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf', url='http://localhost:7070')
{u'status': u'alive'}
Importing data...
Set user u1
Set user u2
:
User u10 views item i40
User u10 buys item i40
204 events are imported.
# pio build
[INFO] [Console$] Using existing engine manifest JSON at /docker/quickstartapp/MyRecommendation/manifest.json
:
# pio train
# pio deploy --ip 0.0.0.0"
近年普及が進んでいるコンテナ技術「Docker」。しかしDockerはLinux固有の技術を利用しているため、Mac OS XやWindowsといった環境ではそのままでは利用できない。今回紹介する「Docker Machine」は、このような非Linux環境でDockerを利用するための支援ツールだ。
Dockerの実行環境を簡単に構築できる「Docker Machine」
Linux向けのコンテナ技術「Docker」は、仮想マシンなどを利用するよりも少ないオーバーヘッドで隔離されたコンテナ環境を作成できるのが特徴だ。そのため近年では急激に利用者が増加している。いっぽうで運用環境にはLinuxを使っていても、開発環境としてはWindowsやMac OS Xを使っているというケースも少なくない。そういった環境でDockerを利用したい場合、Linuxマシンにリモートログインして操作するか、もしくは仮想化ソフトウェアを使ってLinux環境を用意するケースが多かった。その場合、サーバーや仮想マシンにLinuxをインストールし、さらにDockerなどの設定を行う必要となる。このインストールや設定作業を自動化する仕組みが、今回紹介する「Docker Machine」だ。
Amazon Web Services
Microsoft Azure
Digital Ocean
Exoscale
Google Compute Engine
Generic
Microsoft Hyper-V
OpenStack
Rackspace
IBM Softlayer
Oracle VirtualBox
VMware vCloud Air
VMware Fusion
VMware vSphere
VirtualBoxやVMware、Hyper-Vといった主要な仮想化ソフトウェアや、Amazon Web Services(AWS)、Microsoft Azure、Google Compute Engine(GCE)といった主要なクラウドサービスは標準でサポートされている。また、「Generic」ドライバはSSHでリモートログインできるLinuxサーバーをDockerホストとして使用するものだ。これにより、専用サーバーやVPSなどをDockerホストとして利用することが可能になる。
Docker MachineはDockerと同様にオープンソースで開発されており、ソースコードはGitHubで公開されている。ただし、コンパイル型の言語であるGo言語で実装されているため、利用するためにはソースコードのコンパイルが必要だ。GitHub上のリリースページではソースコードだけでなくLinuxやMac OS X、Windows向けのコンパイル済みバイナリも提供されているので、通常はこちらを利用すると良いだろう。ここで配布されているのはインストーラではなく実行ファイル本体そのものなので、ダウンロード後に手動で適当なディレクトリに「docker-machine」というファイル名でコピーし、パーミッション設定などを行う必要がある。
なお、DockerやDocker Machine、VirtualBoxなどをまとめてインストールできるWindowsおよびMac OS X向けインストーラ「Docker Toolbox」も提供されている。このインストーラではDockerクライアントおよびDocker Machine、コンテナ管理ツール「Docker Compose」、GUIフロントエンド「Kitematic」、Git(Git for Windows)、VirtualBoxをまとめてインストールできる。ややファイルサイズが大きいためダウンロードには時間がかかるが、DockerやVirtualBoxが導入されていない環境でDocker Machineをインストールしたい場合はこちらが便利だろう(図2、3)。
図2 Docker関連ツールをまとめてインストールできる「Docker Toolbox」 図3 Docker ToolboxではVirtualBoxやGit for Windowsもまとめてインストールできる
$ docker-machine create --driver virtualbox vbox
Creating CA: /Users/hylom/.docker/machine/certs/ca.pem
Creating client certificate: /Users/hylom/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(vbox) Image cache does not exist, creating it at /Users/hylom/.docker/machine/cache...
(vbox) No default boot2docker iso found locally, downloading the latest release...
(vbox) Latest release for github.com/boot2docker/boot2docker is v1.9.1
(vbox) Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso to /Users/hylom/.docker/machine/cache/boot2docker.iso...
(vbox) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
(vbox) Creating VirtualBox VM...
(vbox) Creating SSH key...
(vbox) Starting VM...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
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 Docker to this machine, run: docker-machine env vbox
$ docker-machine create --driver generic --generic-ip-address 192.168.1.10 --generic-ssh-user hylom sakuravps
Running pre-create checks...
Creating machine...
(sakuravps) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with ubuntu(upstart)...
Installing Docker...
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 Docker to this machine, run: docker-machine env sakuravps
$ docker-machine create --driver sakuracloud --sakuracloud-access-token <アクセストークン> --sakuracloud-access-token-secret <アクセストークンシークレット> sakuracloud
Running pre-create checks...
Creating machine...
(sakuracloud) Build host spec &sakuracloud.Server{Name:"sakuracloud", Description:"", ServerPlan:sakuracloud.Resource{ID
:"1001"}, Tags:[]string(nil), ConnectedSwitches:[]map[string]string{map[string]string{"Scope":"shared"}}}
(sakuracloud) Creating SSH key...
(sakuracloud) password is not set, generated password:xlzvnqsc1fwl
(sakuracloud) Created Server ID: 112701066850
(sakuracloud) Build disk spec &sakuracloud.Disk{Name:"disk001", Plan:sakuracloud.Resource{ID:"4"}, SizeMB:20480, Connect
ion:"virtio", SourceArchive:sakuracloud.Resource{ID:"112700954421"}}
(sakuracloud) Created Disk ID: 112701066853
(sakuracloud) Waiting for disk to become available
(sakuracloud) Build disk edit spec &sakuracloud.DiskEditValue{Password:"************", SSHKey:sakuracloud.SSHKey{PublicKey:"ssh-rsa *******************"}, Notes:[]sakuracloud.Resource{sakuracloud.Resource{ID:"112701066852"}}}
(sakuracloud) Editted Disk Id: 112701066853
(sakuracloud) Waiting for disk to become available
(sakuracloud) Waiting for server to become Running
(sakuracloud) Waiting for server to become Stopped
(sakuracloud) Waiting for server to become Running
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with ubuntu(upstart)...
Installing Docker...
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 Docker to this machine, run: docker-machine env sakuracloud
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos test b8b6e3abbed6 39 seconds ago 300.6 MB
centos 6.4 539c0211cd76 11 months ago 300.6 MB
centos latest 539c0211cd76 11 months ago 300.6 MB
$ sudo docker build -t centos:lamp .
~略~
Successfully built c94a7828a3a9
$ sudo docker images
[sudo] password for tanaka:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos lamp c94a7828a3a9 About a minute ago 1.156 GB
DockerはLXCで不足しているコンテナの管理機能を実装したもので、当初はLXCと組み合わせて利用するツールだったが、徐々にLXCへの依存関係を減らし、最新バージョンではLXCなしでも動作する、独立したコンテナ管理ソフトウェアとなっている。さらに、WindowsやMac OS Xで仮想化ソフトウェア「VirtualBox」経由でDockerを利用するための「Boot2Docker」というツール(厳密にはLinuxディストリビューション)も提供され、マルチプラットフォームで動作するソフトウェアとなっている。
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos nodejs 7ca04c054d89 About a minute ago 328.7 MB
centos latest 0c752394b855 4 weeks ago 124.1 MB
# chroot debian-wheezy /bin/bash
# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
# cat /etc/debian_version
7.6
# exit
# mkdir ubuntu-trusty
# debootstrap trusty ./ubuntu-trusty http://ftp.jaist.ac.jp/pub/Linux/ubuntu/
# cd ubuntu-trusty
# tar -c . | docker import - ubuntu-trusty
Red Hat Linux系のBase Imageを作成する
Red Hat Enterprise Linux(RHEL)やその互換ディストリビューションであるCentOS、FedoraといったRed Hat Linux系のディストリビューションの場合、debootstrapのような最低限のOS環境に必要なファイルを簡単にインストールするツールは用意されていない。ただし、代わりにyumコマンドを使って似たような作業を行うことは可能だ。具体的には、インストール先のディレクトリを指定するための「–installroot」オプションを使ってインストール先ディレクトリを指定し、また指定したグループに含まれるパッケージをまとめてインストールする「groupinstall」コマンドを使用して「Core」グループのパッケージをインストールすることで、debootstrapと似たような作業を実行できる。
Red Hat Linux系のディストリビューションであればyumコマンドはほぼ標準で含まれているが、Debianなどのディストリビューションの場合は別途インストールしておく必要がある。apt-getコマンドでインストールが可能なので、インストールしておこう。
# apt-get install yum
また、yumコマンドを使ってパッケージのダウンロード元を指定するための設定ファイルも必要だ。Red Hat Linux系ディストリビューションを作業するホストとし、ホストと同一の環境を持つコンテナを作成する場合はホスト側の設定ファイルを流用できるが、ホストとは異なる環境のコンテナを作成したい場合や、Debian系ディストリビューション上で作業する場合などは、作成する環境を明示的に指定するためにも設定ファイルが必要となる。
$ docker logs wordpress
ssh user password: hogehoge // <- ここ
140731 07:47:57 mysqld_safe Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect.
140731 07:47:57 mysqld_safe Logging to '/var/log/mysql/error.log'.
140731 07:47:57 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
mysql root password: hugahuga // <- ここ
wordpress password: testtest // <- ここ
140731 07:48:08 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
wp test 9dfde4e6f5c7 34 seconds ago 499.4 MB
moongift/wordpress latest 4f14d0b090bd 39 minutes ago 474.7 MB
ubuntu latest ba5877dc9bec 9 days ago 192.7 MB
Packer公式Webサイトのダウンロードページでは、Mac OS XおよびLinux、Windows、FreeBSD、OpenBSD向けのバイナリが配布されている。また、ソースコードはGitHubで公開されているが、コンパイルにはGo言語環境が必要であるため、通常はバイナリをダウンロードして使用するほうが良いだろう。
$ mysql -uroot -p
> CREATE USER 'redmine'@'%.%.%.%' IDENTIFIED BY 'password';
> CREATE DATABASE IF NOT EXISTS `redmine_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `redmine_production`.* TO 'redmine'@'%.%.%.%';
$ ls output-virtualbox-iso/
packer-centos7-vbox-disk1.vmdk packer-centos7-vbox.ovf
kickstartを使ったインストール作業の自動化
さて、Packerを使ってVirtualBox用のディスクイメージを作成することはできたが、この例ではOSのインストール作業自体は手動で行っており、イメージを作り直すたびに同様の作業を行わなければならない。そこで、続いてはCentOSなどRed Hat Linux系ディストリビューションで利用できる自動インストール機能「kickstart」を使ってインストール作業を自動化してみよう。
kickstartは、インストール内容を記述した設定ファイルを指定してインストーラを起動することで、自動的にインストール作業を進める機能だ。Red Hat Linux系ディストリビューションでは、OSのインストール後にkickstart用の設定ファイル(kickstartファイル)を「/root/anaconda-ks.cfg」という名前で保存する。このファイルを利用することで、それと同じ環境を自動インストールできるようになる。また、このファイルを編集することで、インストール内容をカスタマイズすることも可能だ。
続いては、QEMU用のディスクイメージファイルを作成してみよう。QEMUはオープンソースの仮想化ソフトウェアだが、KVMやXenと組み合わせて利用する例が多い。たとえばRed Hat Enterprise LinuxやFedora、CentOSなどで採用されている仮想環境管理ツールであるlibvirtではKVMを利用する場合、QEMUと組み合わせて利用するようになっている。Dockerでは、「qemu」builderを利用することでKVMおよびXen用の仮想マシンイメージを作成できる。
$ sudo vi /etc/puppet/manifests/site.pp
node default {
include 'docker'
docker::run { 'helloworld':
image => 'ubuntu',
command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"',
}
}
これは
$ sudo docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
を実行したのと同じことになります。
Puppet経由で実行する場合は次のようにコマンドを打ちます。
$ sudo puppet apply /etc/puppet/manifests/site.pp
きちんと立ち上がっていれば、dockerコマンドで確認できます。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f91e086ad82 ubuntu:14.04 "/bin/sh -c 'while t 17 minutes ago Up 17 minutes jolly_ptolemy
$ docker version
Client version: 1.1.1
Client API version: 1.13
Go version (client): go1.2
Git commit (client): dc62f3c
Server version: 1.1.1
Server API version: 1.13
Go version (server): go1.2
Git commit (server): dc62f3c
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b2a03b2df71 ubuntu:latest echo 'Hello World' 9 seconds ago Exited (0) 9 seconds ago prickly_ritchie