$ git clone https://github.com/coreos/coreos-vagrant.git $ cd coreos-vagrant $ vagrant up
※この記事は2017年1月18日に執筆された記事です。現在は仕様が異なる可能性があります。
こんにちは!
突然ですがみなさんDocker使ってますか?
WebNAUTは先日リニューアルをしたのですが、リニューアル後のWebNAUTではDockerという技術を使用してサイトを構築しています。
そこで今回は、「Docker使ってみたいけど何からやっていいかよく分からん……。」という方に向けて、Dockerを使用してWordPressサイトを構築する方法をご紹介したいと思います。
目次
Dockerってなに?
Dockerとは、「シンプルで軽量な、コンテナ型の仮想環境」の一つです。
公式サイトによると
※意訳
Dockerコンテナは、完全なファイルシステム内で個々のソフトウェアをラップしており、その中で、コード、ランタイム、システムツール、システムライブラリなど、サーバにインストール可能なものすべてを実行することができます。これにより、環境にかかわらず常に同じソフトウェアが実行されることになります。
とのこと。
Dockerでは一つのOS上に「コンテナ」という仮想環境を作成し、その仮想環境内でそれぞれのアプリケーションを動作させることができます。
また、従来の仮想マシンに比べより少ないリソースで効率的に稼働したり、コンテナをリポジトリで管理するといったCI(継続的インテグレーション)を実現するために適した機能も備えています。
まずはDockerを使ってみよう
それでは早速Dockerを使ってみましょう。
Dockerを動作させるホストとしては、VPSなどのサーバを使用してもよいですし、Docker for Macのようにローカルマシン内にDocker環境を構築するツールもありますが、今回はVagrantを使用して仮想サーバを立ち上げ、そのサーバ内でDockerを使用してWordPressサイトを立ち上げてみたいと思います。
Vagrantの詳しい使用方法については今回は割愛します。
VagrantでCoreOSサーバを立ち上げる
仮想サーバのOSとしてはCoreOSを使用します。
CoreOSはOSSのLinux Distributionで、もともとDocker専用の軽量Linuxとして開発されました。必要最低限のミニマルな構成となっており最初からDockerを使用することができるのでDockerを試してみるには最適かと思います。
CoreOSの詳しい情報は公式サイトをご確認ください。
まずはCoreOS用のVagrantファイルをダウンロードして、CoreOSの仮想サーバを立ち上げるところまで一気にやってしまいます。
※Vagrant 1.8.6、VirtualBox 5.0.28環境にて動作確認
これであとはしばらく待っていればCoreOSの環境が立ち上がります。簡単ですね!
続いて仮想サーバ内にログインし、Dockerが動作していることを確認します。
$ vagrant ssh Last login: Thu Jan 12 09:08:20 UTC 2017 from 10.0.2.2 on ssh CoreOS alpha (1192.2.0) core@core-01 ~ $ docker -v Docker version 1.12.1, build 7a86f89
$ docker -v
でDockerのバージョンを確認し、正しく表示されれば完了です。
Dockerのしくみ
Dockerはざっくりというと「Dockerfile」「Dockerイメージ」「Dockerコンテナ」の3つから成り立っており、下記のような関係になっています。
まずはDockerfileを作成し、そこからDockerイメージを作ることになるのですが、Docker Hubというサービスを利用することでより簡単に構築することができます。
Docker Hubとは
Docker HubとはDockerのイメージを共有できるサービスで、Docker公式のイメージやユーザの公開しているイメージをプルして使用することができます。
これを使うことでDockerfileの作成等を自分で行わなくとも、いろいろなイメージを組み合わせてアプリケーションを作ることができます。
また、自分の作ったコンテナをDockerイメージ化し、それをDocker Hubで共有することもできます。
今回はDocker Hubを利用して、公式のWordPressイメージとMySQLイメージを使用してみましょう。
WordPressの公式イメージをプル
$ sudo docker pull wordpress
MySQLの公式イメージをプル
$ sudo docker pull mysql
ここまでで$ docker images
コマンドを実行するとダウンロードされたDockerイメージを確認することができます。
core@core-01 ~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 78cdcf394b4e 5 days ago 400.1 MB wordpress latest ed69ee3e546a 3 weeks ago 400.1 MB
WordPressサイトを立ち上げてみる
いよいよWordPressサイトを立ち上げてみましょう。
ダウンロードしたwordpressイメージとmysqlイメージからそれぞれコンテナを作成し、それらを連携させることでWordPressサイトを構築します。
MySQLのコンテナを作成する
ダウンロードしたイメージを使ってMySQLのコンテナを立ち上げます。
$ sudo docker run --name mysite_db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=mysite -d mysql
WordPressのコンテナを作成する
ダウンロードしたイメージを使ってWordPressのコンテナを立ち上げます。
$ sudo docker run --name mysite --link mysite_db:mysql -p 80:80 -e WORDPRESS_DB_PASSWORD=password -d wordpress
ここまでで$ docker ps
コマンドを実行すると稼働中のDockerコンテナを確認することができます。
core@core-01 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9f6310778c9b wordpress "docker-entrypoint.sh" 59 seconds ago Up 58 seconds 0.0.0.0:80->80/tcp mysite 20b9094b33d8 mysql "docker-entrypoint.sh" 2 minutes ago Up 2 minutes 3306/tcp mysite_db
docker run時のコマンドオプションは下記のようになっています。
オプション | 意味 |
---|---|
--name |
立ち上げるコンテナの名前 |
-e |
コンテナの環境変数を設定 |
-d |
コンテナをバックグラウンドで立ち上げる |
--link |
他のコンテナへのリンク |
-p |
コンテナのポートを指定 (ホストのポート:コンテナのポート) |
より詳しくはこちらをご確認ください。
サイトにアクセスしてみる
これでWordPressサイトが立ち上がっていますので、ブラウザからアクセスしてみましょう。
ローカルIPを調べるには仮想サーバ内で$ ifconfig
コマンドを実行します。
core@core-01 ~ $ ifconfig 〜〜省略〜〜 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.8.101 netmask 255.255.255.0 broadcast 172.17.8.255 〜〜省略〜〜
この場合であればinetとかかれた箇所の「172.17.8.101」がローカルIPとなりますのでブラウザでhttp://172.17.8.101/にアクセスしてみましょう。
以下のように表示されていれば成功です!
コンテナの停止と削除
コンテナの停止、削除をしてみます。
コンテナの情報を調べる
core@core-01 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9f6310778c9b wordpress "docker-entrypoint.sh" 59 seconds ago Up 58 seconds 0.0.0.0:80->80/tcp mysite 20b9094b33d8 mysql "docker-entrypoint.sh" 2 minutes ago Up 2 minutes 3306/tcp mysite_db
$ docker ps
コマンドで稼働中のコンテナを表示させ、コンテナの情報を調べます。
コンテナを停止する
$ docker stop <コンテナID or コンテナ名>
でコンテナを停止します。
停止しているコンテナは$ docker ps
では表示されなくなりますが、$ docker ps -a
コマンドで停止中のコンテナも合わせて表示されます。
コンテナを削除する
$ docker rm <コンテナID or コンテナ名>
コマンドでコンテナを削除します。
もっと便利にしてみよう
docker-composeでコンテナ管理を楽にする
ここまででWordPressコンテナとMySQLコンテナを使ってサイトを立ち上げることはできましたが、コンテナの立ち上げはオプションなども多く、コンテナの管理が面倒です。
また、複数人で開発を行う際には誰がどのようなコマンドを使用したのかなどがわからなくなってしまい、開発に支障をきたしてしまいますね。
そこで、docker-composeというツールを使用して、コンテナの管理を簡単にしてみましょう。
docker-composeのインストール
サーバ内で下記コマンドを実行しましょう。
公式サイトにのっている方法だとエラーを吐いてしまったので少々面倒ですが下記のような方法をとりました。
$ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > ~/docker-compose $ sudo mkdir /opt $ sudo mkdir /opt/bin $ sudo mv ~/docker-compose /opt/bin/docker-compose $ sudo chown root:root /opt/bin/docker-compose $ sudo chmod +x /opt/bin/docker-compose
$ docker-compose -v
でバージョンが表示されれば正しくインストールできています。
core@core-01 ~ $ docker-compose -v docker-compose version 1.8.1, build 878cff1
Vagrantfile内に下記のように記述しておけばVagrant up時に合わせてdocker-composeのインストールを行うこともできます。
自動化できることは自動化してしまいましょう!
# Vagrantfile 〜〜省略〜〜 if File.exist?(CLOUD_CONFIG_PATH) config.vm.provision :file, :source => "#{CLOUD_CONFIG_PATH}", :destination => "/tmp/vagrantfile-user-data" config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true end end end # ---------------ここから追記------------- config.vm.provision "shell", inline: <<-SHELL curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > ~/docker-compose sudo mkdir /opt sudo mkdir /opt/bin sudo mv ~/docker-compose /opt/bin/docker-compose sudo chown root:root /opt/bin/docker-compose sudo chmod +x /opt/bin/docker-compose SHELL # ---------------ここまで追記------------- end
docker-compose.ymlファイルを作成する
docker-composeを使用するにはdocker-compose.ymlというファイルを作成する必要があります。
このファイルは、先ほどのコンテナ立ち上げで使用したdocker runコマンドの内容を記述しておくようなものと考えておけばよいかと思います。
こうすることで複数コンテナを一回で全て立ち上げたり、docker-compose.ymlファイルをgit等で共有することで誰もが一目でコンテナの設定等を確認することができます。
# docker-compose.yml version: '2' services: mysite_db: image: mysql environment: MYSQL_ROOT_PASSWORD: password mysite: image: wordpress environment: WORDPRESS_DB_PASSWORD: password WORDPRESS_DB_USER: root WORDPRESS_DB_HOST: mysite_db:3306 WORDPRESS_DB_NAME: mysite ports: - "80:80" links: - mysite_db
これをサーバ内の任意のディレクトリに格納し、そのディレクトリ内で$ docker-compose up -d
コマンドを実行します。
core@core-01 ~ $ docker-compose up -d Creating core_mysite_db_1 Creating core_mysite_1
コンテナを確認します。
core@core-01 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78011cb386bd wordpress "docker-entrypoint.sh" 14 seconds ago Up 12 seconds 0.0.0.0:80->80/tcp core_mysite_1 55b1db5567ee mysql "docker-entrypoint.sh" 14 seconds ago Up 13 seconds 3306/tcp core_mysite_db_1
簡単に複数コンテナが作成できました!
$ docker-compose stop
や$ docker-compose rm
コマンドを実行すればdocker-compose.yml内のコンテナをまとめて停止/削除することもできます。
おわりに
いかがでしたでしょうか?
最初はなかなかイメージが湧きづらく、難しい印象を持ってしまうかもしれませんがやってみると意外と簡単にWordPressサイトが立ち上げられたのではないでしょうか?
今回は試しに使ってみるといった内容でしたので、まだまだDockerの機能や良さはわかりにくいかもしれませんが、今後は本番環境やテスト環境、ローカル開発環境を管理する方法や、CIツールでデプロイする方法などもご紹介していければと思います。
それでは今日はこの辺で!