각각 VM을 직접 만드는 형태 (예전 방식)

기존에 내가 하던 방식은, 아래와 같이 elasticsearch 게스트OS 를 각각 VM을 만들어 띄웠다. 단점은. 하드웨어 VM이라 무겁다.

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.define :main, primary: true do |main|
        main.vm.box = "precise64"
        main.vm.hostname = "main"
        main.vm.box_url = "http://files.vagrantup.com/precise64.box"
    end

    config.vm.define :es1, primary: false do |main|
        main.vm.box = "precise64"
        main.vm.box_url = "http://files.vagrantup.com/precise64.box"
        main.vm.hostname = "es1"
        main.vm.provision :shell, :path => "vagrant-provision-elasticsearch.sh"
    end

    config.vm.define :es2, primary: false do |main|
        main.vm.box = "precise64"
        main.vm.box_url = "http://files.vagrantup.com/precise64.box"
        main.vm.hostname = "es2"
        main.vm.provision :shell, :path => "vagrant-provision-elasticsearch.sh"
    end
end

Docker 컨테이너를 올리는 방식으로 전환

우선 docker 이미지 중에 elasticsearch 이미지가 있는지 찾는다

vagrant@main:~$ docker search elasticsearch
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
dockerfile/elasticsearch Trusted ElasticSearch (http://www.elastics... 37 [OK]
pblittle/docker-logstash Logstash (1.3.3) flat jar image. Configure... 5 [OK]
barnybug/elasticsearch Latest Elasticsearch 1.2.1 and all previou... 2 [OK]
...

docker 로 elasticsearch 를 클러스터 구성을 한 번 테스트 해본다. (사실 dockerfile/elasticsearch 가 해주는건 별로 없다. 자바 설치하고 elasticsearch를 설치할 뿐이다.)

vagrant@main:~$ docker run -d --name es1 -v /work/dotfiles/docker-data-es1:/data -p 9201:9200 -p 9301:9300 dockerfile/elasticsearch
758232a67d81c32067baa010c6a29a4ac77fa9167bf326712114ab962f414bcf
vagrant@main:~$ docker run -d --name es2 -v /work/dotfiles/docker-data-es2:/data -p 9202:9200 -p 9302:9300 dockerfile/elasticsearch
16ca988a94a3cbbd8c306302f1ad134e16dcb7fb4633732df08462dc1436741d
vagrant@main:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16ca988a94a3 dockerfile/elasticsearch:latest /elasticsearch/bin/e 3 seconds ago Up 3 seconds 0.0.0.0:9202->9200/tcp, 0.0.0.0:9302->9300/tcp es2
758232a67d81 dockerfile/elasticsearch:latest /elasticsearch/bin/e 6 seconds ago Up 5 seconds 0.0.0.0:9201->9200/tcp, 0.0.0.0:9301->9300/tcp es1

vagrant@main:~$ curl localhost:9201
{
  "status" : 200,
  "name" : "Orbit",
  "version" : {
    "number" : "1.2.1",
    "build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
    "build_timestamp" : "2014-06-03T15:02:52Z",
    "build_snapshot" : false,
    "lucene_version" : "4.8"
  },
  "tagline" : "You Know, for Search"
}
vagrant@main:~$ curl localhost:9202
{
  "status" : 200,
  "name" : "Taskmaster",
  "version" : {
    "number" : "1.2.1",
    "build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
    "build_timestamp" : "2014-06-03T15:02:52Z",
    "build_snapshot" : false,
    "lucene_version" : "4.8"
  },
  "tagline" : "You Know, for Search"
}

docker provision 을 이용해서 추가하도록 Vagrantfile 을 수정한다.

main.vm.provision "docker" do |d|
    data_dir = "/work/dotfiles/docker-data-es1"
    d.run "es1",
        image: "dockerfile/elasticsearch",
        args: "--name es1 -v #{data_dir}:/data -p 9201:9200 -p 9301:9300"

    data_dir = "/work/dotfiles/docker-data-es2"
    d.run "es2",
        image: "dockerfile/elasticsearch",
        args: "--name es2 -v #{data_dir}:/data -p 9202:9200 -p 9302:9300"
end

잘 작동하는지 확인한다.

vagrant@main:~$ curl localhost:9201/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign
1402390226 08:50:26 sangwookescluster green 2 2 0 0 0 0 0
  • 덧1, 점심 먹고 같은 팀의 안건님께 Docker에 대한 설명을 들은게 큰 도움이 되었다.
  • 덧2, 위 방식이 올바른 건지 모르겠다.
  • 덧3, 참고로 위의 예제에서 /work/dotfiles/docker-data-es1/elasticsearch.yml 이렇게 설정파일이 위치한다.