RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのエンジニアブログ

VagrantとDockerで「環境に縛られない」開発環境を構築しよう

f:id:rs_tukki:20180509170211p:plain

はじめに

こんにちは。@rs_tukkiです。

先日、このエンジニアブログでY-KanohさんがDockerでの開発環境構築について説明されていましたね。
tech-blog.rakus.co.jp
また、mickey-STRANGEさんはHerokuを使った開発環境の構築を行っていました。
tech-blog.rakus.co.jp

恥ずかしながら、一エンジニアとしてもう1年以上が経過している私ですが、業務以外でガッツリ開発することがあまりありません... 環境の構築についても色々手法があるなー程度で見ていたのですが、
先日Vagrantというツールを使って、「どの」、「誰の」、「どんな」環境でも手軽に開発環境を構築できる手順を学びましたので、今回はそちらについて簡単に記事にしたいと思います。

Vagrant?Docker?

f:id:rs_tukki:20180615103526p:plain

まず初めにVagrantとDockerで開発環境を構築するにあたっては、当然ですがVagrantとDockerがどのようなツールなのか、ということを理解しなければなりません。
正直自分も違いがよくわからないまま触っていたのですが...調べていると面白い例えを見つけました。

Vagrant : 家の内装、全体的な設計 - どんな室内構造か、部屋は何があるのか~その他
Docker : 部屋or(キッチンも可) - 様々な種類がある、場合によってば独特な空間を持ち合わせている

Vagrantは、設計図を基に自分のPCに仮想環境という「家」を作成するためのツールです。
普通に環境を作ろうとした場合は、どういう階層構造にするか、どんなOSを使うのか…等々、都度細かく設定しなければなりませんが、それらの設定をVagrantfileとしてテキスト形式で保存しておけば、それを元にどんなPCからでも同じような仮想環境を作成できるのです。

Dockerに関してはこのブログでも何度か説明されていますが、今回の場合では、Vagrantから作成された「家」の中に作られた部屋*1というイメージで説明します。
それぞれ作られたコンテナの中にはそれぞれ単独で機能する仕組みがあり、例えばそれがWebサーバならWebにアクセスできる仕組みがありますし、DBであればデータを保存する仕組みがあります。また、それぞれのコンテナの間にネットワークという通路を作っておけば、複数のサーバを用いるようなWebアプリケーションも簡単に作成できるというわけです。
そして最も便利なのは、このコンテナ自体もVagrantと同じくDockerfileを作成しておくことによって、細かい設定なしにいきなりコンテナを配置することが出来るという点です。

VagrantとDockerで誰でも使える開発環境を構築してみる

では、VargrantとDockerを用いて、実際に開発環境を作成してみましょう。

必要なツールのインストール

まずは必要なソフトとしてVagrantと、仮想環境を作成する際に必要となるVirtualBoxをインストールします。
Dockerは? となるかもしれませんが、DockerをインストールするのはあくまでVagrantで作った仮想環境に対してなので、現時点でのインストールは不要です。

Vagrant by HashiCorp f:id:rs_tukki:20180615104032p:plain

Oracle VM VirtualBox f:id:rs_tukki:20180615104051p:plain

特にこだわりがなければ、最新版でOKです。
画面の指示に従ってインストールしてください。

Vagrantfileの作成、VMの起動

インストールが完了したら、早速仮想環境の元となるVagrantfileを作ってみましょう。
ちなみに今回の手順は、windowsでの操作を前提にしています。予めご了承くださいm(__)m。

まずはコマンドプロンプトを開き、 適当な作業用フォルダを作成します。

mkdir vm\test
cd vm\test

作成したこのフォルダの中にVagratfileを作成していきます。
本来であればvagrant initコマンドでテンプレートをダウンロードするのですが、今回は手軽に環境構築をお試しするためのVagrantfileをサクッと作っておきました。

Vagrant.configure("2") do |config|
 config.vm.box = "CentOS/7"
 config.vm.network :private_network, ip: "192.168.33.10"
 config.vm.provision "docker"
end

Vagrant.configure("2") do |config|...endで囲まれた範囲が、細かい設定を記述する箇所になります。

  • config.vm.box は仮想環境のOSを表します。今回はCentOSを使用します。
  • config.vm.networkは仮想環境のIPアドレスの指定に使用します。実はこれがかなり重要で、これが設定されていないと仮に仮想環境上でWebサーバを立ち上げても、IPアドレスがないのでPC上からアクセスできません。考えてみれば当然のことなのですが…こんな単純なことに3,4日も気づかずつまづいてしまいました…
  • config.vm.provisionで、環境の作成時にインストールするソフトを指定します。今回は前述の通りdockerを使用するので、今のうちに記述しておきます。

これだけ書いて保存したら、あとは仮想環境を作成して接続するだけです。

vagrant up
vagrant ssh

vagrant upでVagratfileを元に仮想環境を起動し、その環境にvagrant sshで接続します。初回はdockerのインストール等もあるので多少時間がかかりますが、気長に待ちましょう。
しかし、気長といってもここに第二のつまづきポイントがあり、何故かVagrantfileは問題なく作成できているはずなのですが、10分経っても20分経っても起動が完了せず、タイムアウトしてしまうことがあります。
調べたところ、どうやらBIOSの設定が邪魔をしているらしく、この設定をこちょこちょして何とか解決。

Dockerイメージの取得

接続が完了すると、ごく一般的なCentOS上でLinuxコマンドを叩けるようになります。
この環境上に、Dockerを使ってコンテナを作っていくわけですが、それには主に2つの方法があります。

  1. Vagrantfileを作成したのと同じフォルダ内に「Dockerfile」を作成してビルドする
  2. dockerHubという、公式で提供されるコンテナの「カタログ」からDockerfileを借りてくる

細かく設定を行いたい場合は1.で行うのもいいですが、今回はとっかかりなので2.の方法で行きましょう。
プロジェクト管理OSSである「redmine」と、そのデータを格納するための「MySQL」を作成してみます。

docker pull sameersbn/redmine:3.3.1
docker pull sameersbn/mysql:latest

dockerHubからイメージを借りてくる際は、docker pullコマンドを使用します。特に細かい設定は必要なく、dockerHubで提供されているイメージ名とバージョンを指定するだけで落とせるので便利。
こちらも時間がかかるので、気長に待ちましょう。

mkdir -p /srv/docker/redmine/mysql
mkdir -p /srv/docker/redmine/redmine

続いて、MySQLredmineのデータを格納するフォルダを作ります。
本来データはコンテナの中に格納されていますが、このフォルダと紐づけを行う(後述)ことで両者を共有することが出来ます。四次元ポケット

これで、コンテナを動かす準備が完了しました。

実行

少し長いですが、以下2つのコマンドを実行してみてください。

docker run --name=mysql-redmine -d --env='DB_NAME=redmine_production' --env='DB_USER=redmine' --env='DB_PASS=redpass' -v /srv/docker/redmine/mysql:/var/lib/mysql sameersbn/mysql:latest  
docker run --name=redmine -d -p 8080:80 --link=mysql-redmine:mysql -v /srv/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:3.3.1

docker runコマンドでコンテナを動かしています。以下、コマンドのオプションについて解説。

  • --name : 起動するコンテナの名前を定義しています。
  • -d : バックグラウンドで動かします。これがないと、一つ動かしている間は何も操作できなくなってしまいます。
  • --env : コンテナで扱う環境変数を設定します。
  • -v : コンテナの中にあるデータ配置のためのフォルダを、仮想環境の特定のフォルダと紐づけます。
  • -p : 起動したコンテナのポート番号と、自分のPC上で操作する時に指定するポート番号を紐づけます。
  • --link : 他のコンテナを指定することで、そのコンテナと連携することが出来ます。

これでPC側からアクセスができるはずなので、http://192.168.33.10:8080にアクセスします。

f:id:rs_tukki:20180615132038p:plain

Redmine使用者には見慣れたTOPページが表示されました!

おわりに

VagrantとDockerを使って環境を構築するやり方を説明いたしました。
正直なところ、結構噛み砕いて説明したつもりでしたがそれでも大分難しいと思います。なんとたったこれだけのことを調べ始めてから記事にするまで約一ヶ月
ただ、当然若手エンジニアにとっては勉強になりますし、何よりどんな環境でも、同じように環境を構築できるのはとても便利だと思います。ぜひ皆さんも試してみてはいかがでしょうか。

参考

acchi-muite-hoi.hatenablog.com

qiita.com

weblabo.oscasierra.net

qiita.com

www.risewill.co.jp

*1:以下、これを「コンテナ」と呼びます

Copyright © RAKUS Co., Ltd. All rights reserved.