気まぐれな備忘録(仮)

いちようSEしてるので、プログラミングの備忘録的なものを書いてます

VagrantとDockerを使ってRedis, Elasticsearch, MySQLをセットアップする

前回に引き続きVagrantネタを。

Redis + Elasticsearchを利用した開発環境をローカルマシンに構築しようと思い、ググっていたところ以下の記事を見つけた。postd.cc

Redis + Elasticsearchでまさに求めていた内容!ということで試してみたが、docker imageのpullが失敗してうまくできない。。ということで、ちょっと修正してみた。
また、元記事ではUbuntuにてVMを起動しDBにPostgreSQLを利用してるが、CentOSで動かしたいのとDBはMySQLを使いたかったので、こちらも合わせて変更した。

ちなみに動作確認マシンはMacBookProです。

事前準備

まずは、Homebrew, VirtualBox, Vagrantは元記事と同様にインストール。

プロキシVMのVagrantfile

プロキシVMのVagrantfile(ファイル名はVagrantfile.proxy)は以下のように修正

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hfm4/centos-with-docker"
  config.vm.provision "docker"
  config.vm.provision "shell", inline:
    "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"

  config.vm.network :forwarded_port, guest: 6379, host: 6379
  config.vm.network :forwarded_port, guest: 3306, host: 3306
  config.vm.network :forwarded_port, guest: 9200, host: 9200
end

プロキシVM用のイメージはhfm4/centos-with-dockerのCentOS6.5を使用している。このBoxを選んだ理由は、Discover Vagrant Boxes | Atlas by HashiCorpにて
CentOS+dockerのキーワードでヒットしたから。他のBoxでもいいのかも。
なお、Port ForwardingはPostgreSQLの5432をMySQLの3306に変更。

DockerコンテナのVagrantfile

次に、DockerコンテナのVagrantfile(ファイル名はVagrantfile)はコチラ。

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define "redis" do |v|
    v.vm.provider "docker" do |d|
      d.image = "redis"
      d.volumes = ["/var/docker/redis:/data"]
      d.ports = ["6379:6379"]
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end

  config.vm.define "elasticsearch" do |v|
    v.vm.provider "docker" do |d|
      d.image = "elasticsearch"
      d.ports = ["9200:9200"]
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end

  config.vm.define "mysql" do |v|
    v.vm.provider "docker" do |d|
      d.image = "mysql"
      d.volumes = ["/var/docker/mysql:/data"]
      d.ports = ["3306:3306"]
      d.env = {
        MYSQL_DATABASE: "test_db",
        MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      }
      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end
end

元記事からの変更点としては、各コンテナのimageの値を変更。あとはPostgreSQLMySQLに変更。MySQL環境変数(MYSQL_DATABASEなど)はここmysql Repository | Docker Hub Registry - Repositories of Docker ImagesのEnvironment Variablesを参考に設定。上記の設定はパスワード未指定でログイン可能にしているので、流用時はよしなに設定を変更してください。

起動&停止

あとは、元記事と同じくvagrantを起動。

$ vagrant up --provider=docker

vagrant up」だけではプロキシVMが起動しないようなので、providerオプションは必要みたい。
初回実行時はプロキシVMとDockerコンテナのDLに時間がかかるのでしばし待つ。エラーが発生しなければ、下記コマンドで状態を確認できる。

$ vagrant status
Current machine states:

redis                     running (docker)
elasticsearch             running (docker)
mysql                     running (docker)

global-statusを指定するとプロキシVMも確認できる。

$ vagrant global-status

id       name          provider   state    directory
------------------------------------------------------------------------------------------------
29d4e38  default       virtualbox running  /Users/kajitiluna/_Work/vagrant
5c659c2  mysql         docker     running  /Users/kajitiluna/_Work/vagrant
7d841ac  redis         docker     running  /Users/kajitiluna/_Work/vagrant
4f5cab0  elasticsearch docker     running  /Users/kajitiluna/_Work/vagrant

なお、「vagrant halt」で停止するとプロキシVMだけは止まらないので、プロキシVMを止める場合は追加で「vagrant halt <id>」を実行する必要あり。