KUSANAGI RoDの使い方(7)~高速Dockerの話~

宮﨑悟

この記事では、WordPressの開発方法について、特にDocker Machineを使用したprovisionの方法に注目して解説しています。具体的な手順を示しながら、Docker Machineのインストールから始め、docker-machineコマンドの使い方、環境設定、仮想マシンの作成、そしてKUSANAGI RoDを利用したDocker Machineへのデプロイを理解できる内容となっています。次回は、開発・ステージング・本番環境の切り替え方法について説明予定です。

前回はWordPress以外の、Concrete5、Drupal、LAMP環境のprovision について説明しました。今回からは、KUSANAGI RoDを使用したWordPressの開発方法について説明します。まずは、Docker Machineを使用した provision の方法を説明します。

サポートOSの追加

先日公開された Ubuntu 20.04 LTS ですが、正規のパッケージリポジトリからインストールした docker.io およびdocker-compose で、KUSANAGI RoDが正常に動作することを確認しました。特にRoD自体に変更点はありませんが、ご報告のみさせていただきます。

Docker Machine とは

Docker Machine は、他のDockerホストと接続して自マシンで実行するのと同じように、dockerコマンド、docker-compose コマンドを使用できるコマンドです。

Docker Machine のインストール

Docker Machine をインストールするには、以下のコマンドを実行してdocker-machineコマンドをダウンロードしてください。現在のDocker Machineの最新版は0.16.2です。bashを使用している場合は、以下のようにbash用の補完スクリプトをダウンロードしてお置くと便利です。以下の/etc/bash_complete.d/に配置すると、bash起動時に読み込まれるので便利です。zsh用の補完スクリプトも、最後のコマンドでダウンロードしています。

$ DM_VERS=0.16.2
$ sudo curl -L https://github.com/docker/machine/releases/download/v${DM_VER}/docker-machine-`uname -s`-`uname -m` -o /usr/local/bin/docker-machine
$ sudo chmod a+x /usr/local/bin/docker-machine
$ sudo wget -P /etc/bash_complete.d https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash
$ sudo wget -P /etc/bash_complete.d https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash
$ sudo wget -P /etc/bash_complete.d https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash
$ sudo wget -P /usr/share/zsh/vendor-completions/ https://raw.githubusercontent.com/docker/machine/master/contrib/completion/zsh/_docker-machine

docker-machine コマンドの使い方

docker-machine コマンドを使用するには、対象となるマシンを作成・指定する必要があります。

インストール後にdocker-mashine の登録内容をみると、何も設定されていません。

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

今回は、VirtualBoxで新しくDocker Machine、default を作成してみます。

$ docker-machine create --driver=virtualbox default
Running pre-create checks...
Creating machine...
(default) Copying /home/user/.docker/machine/cache/boot2docker.iso to /home/user/.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) 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
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   -        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5  

これで、default という名前の仮想マシンがdockerを動作する環境として登録されました。一度、自環境でnginxのDockerイメージを動作させます。virtualbox以外にも、クラウド上などいくつかのドライバが存在します。

$ docker run nginx:1.17.10-alpine
Unable to find image 'nginx:1.17.10-alpine' locally
1.17.10-alpine: Pulling from library/nginx
cbdbe7a5bc2a: Already exists 
c554c602ff32: Pull complete 
Digest: sha256:763e7f0188e378fef0c761854552c70bbd817555dc4de029681a2e972e25e30e
Status: Downloaded newer image for nginx:1.17.10-alpine
88b5a5d0ab6bb1b51cd3b29b520b9d8ef0bc021802ce3200db52e0a5076bd875
$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
88b5a5d0ab6b        nginx:1.17.10-alpine   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp              zealous_moore

では、作成したDocker Mashine に接続してみましょう。docker-machine env defaultを実行すると、以下のように表示されます。つまり環境変数をecho するだけです。

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/home/user/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell: 
# eval $(docker-machine env default)

最後のコメントに書いてあるとおり、eval を実行します。

$ eval $(docker-machine env default)
$ printenv | grep DOCKER_
DOCKER_TLS_VERIFY=1
DOCKER_HOST=tcp://192.168.99.102:2376
DOCKER_CERT_PATH=/home/user/.docker/machine/machines/default
DOCKER_MACHINE_NAME=default

上記で、環境変数を設定したことが分かります。この状態で docker psを実行すると、先程起動したDockerのプロセスが表示されません。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ここで再度docker を起動すると、別のContainerIDやNAMEで起動することが分かります。

$ docker run -d nginx:1.17.10-alpine
Unable to find image 'nginx:1.17.10-alpine' locally
1.17.10-alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete 
c554c602ff32: Pull complete 
Digest: sha256:763e7f0188e378fef0c761854552c70bbd817555dc4de029681a2e972e25e30e
Status: Downloaded newer image for nginx:1.17.10-alpine
eabb9f592055d99e92b9528c908a1fa13894f8ef08780c8d8dcf33c39faa9c9a
$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
eabb9f592055        nginx:1.17.10-alpine   "nginx -g 'daemon of…"   13 seconds ago      Up 12 seconds       80/tcp              dazzling_austin

ではDocker プロセスを停止し、docker-machineである default から離脱します。

$ docker stop eabb9f592055
eabb9f592055
$ docker rm eabb9f592055
eabb9f592055
$ eval $(docker-machine env -u)
$ printenv | grep DOCKER_ 

Docker Machine 環境でのprovision 方法

RoDをDocker Machineにデプロイするのは簡単です。docker-machineコマンドでDocker環境を指定マシンに設定した状態で、kusanagi-docker provisionを実行するだけです。

$ eval $(docker-machine env default)
$ kusanagi-docker provision --wplang=ja --wp-title='WordPress in docker-machine' --fqdn wp.local wordpress
Creating network "wordpress_default" with driver "bridge"
Creating volume "wordpress_kusanagi" with default driver
Creating volume "wordpress_database" with default driver
 (中略)
INFO: 完了しました。

選択したDocker MachineのIPアドレスは、docker-machine lsか、docker-machine url コマンドで取得可能です。起動したRoD環境に接続するためには、そのIPアドレスを使用します。

$ docker-machine url
tcp://192.168.99.102:2376
$ curl -H 'Host: wp.local' http://192.168.99.102/ http://192.168.99.102/ 2> /dev/null | head -15
<!DOCTYPE html>

<html class="no-js" lang="ja">

        <head>

                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0" >

                <link rel="profile" href="https://gmpg.org/xfn/11">

                <title>&quot;WordPress in docker-machine&quot; &#8211; Just another WordPress site</title>
<link rel='dns-prefetch' href='//s.w.org' />
<link rel="alternate" type="application/rss+xml" title="&quot;WordPress in docker-machine&quot; &raquo; フィード" href="http://wp.local/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="&quot;WordPress in docker-machine&quot; &raquo; コメントフィード" href="http://wp.local/?feed=comments-rss2" />

確認の為に、curlコマンドで Titleの部分のみを確認しました。

hosts ファイルに上記エントリを記述すれば、ブラウザ上でWordPressの構築を行えます。

終わりに

今回は、Docker Machineを使用した provision の方法を説明しました。次回は、Docker Machineによる開発・ステージング・本番環境の切り替えについて話します。次回をお楽しみに。

<< KUSANAGI RoDの使い方(6)~高速Dockerの話~KUSANAGI RoDの使い方(8)(高速Dockerな話) >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解