WNT-Technology-20170118
Technology

はじめてのDocker 〜公式イメージで簡単にWordPressサイトをつくる方法〜

thumbnail_technology_170117

こんにちは!

突然ですがみなさんDocker使ってますか?
WebNAUTは先日リニューアルをしたのですが、リニューアル後のWebNAUTではDockerという技術を使用してサイトを構築しています。
そこで今回は、「Docker使ってみたいけど何からやっていいかよく分からん……。」という方に向けて、Dockerを使用してWordPressサイトを構築する方法をご紹介したいと思います。

目次


Dockerってなに?

Dockerとは、「シンプルで軽量な、コンテナ型の仮想環境」の一つです。

公式サイトによると

Docker containers wrap a piece of software in a complete filesystem that contains everything needed to run: code, runtime, system tools, system libraries – anything that can be installed on a server. This guarantees that the software will always run the same, regardless of its environment.

※意訳
Dockerコンテナは、完全なファイルシステム内で個々のソフトウェアをラップしており、その中で、コード、ランタイム、システムツール、システムライブラリなど、サーバにインストール可能なものすべてを実行することができます。これにより、環境にかかわらず常に同じソフトウェアが実行されることになります。

とのこと。
Dockerでは一つのOS上に「コンテナ」という仮想環境を作成し、その仮想環境内でそれぞれのアプリケーションを動作させることができます。
また、従来の仮想マシンに比べより少ないリソースで効率的に稼働したり、コンテナをリポジトリで管理するといったCI(継続的インテグレーション)を実現するために適した機能も備えています。

image01

What is Docker?より引用

まずは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環境にて動作確認

$ git clone https://github.com/coreos/coreos-vagrant.git
$ cd coreos-vagrant
$ vagrant up

これであとはしばらく待っていれば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つから成り立っており、下記のような関係になっています。

img01

まずはDockerfileを作成し、そこからDockerイメージを作ることになるのですが、Docker Hubというサービスを利用することでより簡単に構築することができます。

Docker Hubとは

Docker HubとはDockerのイメージを共有できるサービスで、Docker公式のイメージやユーザの公開しているイメージをプルして使用することができます。
これを使うことでDockerfileの作成等を自分で行わなくとも、いろいろなイメージを組み合わせてアプリケーションを作ることができます。

img02

また、自分の作ったコンテナを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/にアクセスしてみましょう。
以下のように表示されていれば成功です!

image04

コンテナの停止と削除

コンテナの停止、削除をしてみます。

コンテナの情報を調べる

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ツールでデプロイする方法などもご紹介していければと思います。

それでは今日はこの辺で!

thumbnail_technology_170117

記事が気に入ったらシェアしよう

この記事を書いたメンバー

丸山 佳郎 エンジニア/ディレクター

山と技術を愛するアウトドア系エンジニア。
フロントエンドをメインにしつつ、バックエンドもインフラも対応します。
好きな食べ物はライチと白米。

成果につながるWeb制作を

成果につながるWeb制作を
ビーワークスのミッションは「デザインで世の中を動かすこと」。
出版物、販促ツール、WEBサイト、ゲームアプリなど、多用な領域でクライアントのビジネス拡大に貢献するデザインを提供する制作会社です。

記事の更新をお知らせします!

  • 採用情報

    採用情報

    記事を読んで興味を持った方、
    ビーワークスの考え方に共感した方、
    一緒に新しいデザイン、創りませんか?

  • 制作実績

    制作実績

    日々、制作実績を更新中!
    ビーワークスの多様な実績をぜひご覧ください。

  • 水瓶座
  • 魚座
  • 牡羊座