Vagrant+CoreOS+Docker로 호스트 OS와 독립적인 로컬 개발 환경 만들기

최근 가상 개발 환경 경계에서는 Docker가 유행하고 있습니다만, 아무래도 Mac이라고 움직이지만 Windows라면 움직이지 않는다…
이제 호스트 OS에 의존하는 개발 환경은 싫다!
그렇다고 해서, 커맨드 일발로 가상 개발 환경을 할 수 있는 구조를 VirtualBox+Vagrant+CoreOS+Docker로 실현해 보았습니다.

구성



호스트 OS(Win or Mac)에 VirtualBox를 두고, 그 안에 CoreOS의 머신을 세우고, 그 안에 Docker의 컨테이너가 늘어서 있는 것 같은 구성을 만듭니다.


폴더 구성


app/var/public_html 안에 제품의 소스 코드가 들어가는 이미지입니다.
이번에는 여러 하위 도메인에서 액세스하는 서비스였기 때문에 프록시 서버도 세웠습니다.


Vagrant 구축



Vagrantfile에서 docker-compose를 설치하고 docker를 시작하고 공유 폴더를 마운트합니다.

Vagrantfile
# -*- mode: ruby -*-
# # vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.ssh.insert_key = false
  config.vm.box = "coreos-alpha"
  config.vm.box_url = "https://storage.googleapis.com/alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json"

  config.vm.provider :virtualbox do |v|
    v.check_guest_additions = false
    v.functional_vboxsf     = false
    v.memory = 2048
    v.cpus = 2
  end

  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end

  config.vm.network :private_network, :ip => "192.168.33.10"

  # docker-composeのインストール
  config.vm.provision :shell, inline: <<-SHELL
    mkdir -p /opt/bin
    curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
    chmod +x /opt/bin/docker-compose
  SHELL

  # coreosの自動アップデートを無効にする
  config.vm.provision :shell, inline: <<-SHELL
    sudo systemctl stop update-engine 
  SHELL

  # 共有フォルダの作成
  config.vm.synced_folder "./share", "/home/core/share", :nfs => true, :mount_options => ["nolock,vers=3,udp"] 

  config.vm.provision :shell, privileged: false, inline: <<-SHELL
    cd ~/share/proxy && docker-compose build
    cd ~/share/app && docker-compose build
  SHELL

  # docker起動
  config.vm.provision "shell", run: 'always',privileged: false, inline: <<-SHELL
    cd ~ && docker network create --driver bridge proxy
    cd ~/share/proxy && docker-compose up -d 1>&2
    cd ~/share/app && docker-compose up -d 1>&2
  SHELL

  config.ssh.forward_agent = true

  # プロジェクトのClone 
  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    echo -e "Host gitlab.com" > ~/.ssh/config
    echo -e "    StrictHostKeyChecking no" >> ~/.ssh/config
    sudo mkdir -p ~/share/app/var/public_html
    cd ~/share/app/var/public_html && git clone [email protected]:hogehoge
  SHELL

end

애플리케이션 기반 Docker 구축



웹 서버와 DB 서버, memcached 컨테이너를 만듭니다. 이번에는 phpMyAdmin도 넣어 보았습니다.

app/docker-compose.yml
version: '2'

services:
  mysqldata:
    image: busybox
    container_name: my_db_data
    volumes:
      - /var/lib/mysql
  # mysql
  mydb:
    image: mysql:5.6
    container_name: my_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./files/mysql_conf:/etc/mysql/conf.d
      - ./var/public_html/sql:/docker-entrypoint-initdb.d
    volumes_from:
      - mysqldata
  # web
  myweb:
    build: ./web
    image: web:24
    container_name: my_web
    environment:
      VIRTUAL_HOST: hoge.dev
      VIRTUAL_PORT: 80
    links:
      - mydb:mydb
      - memcached
    volumes:
      - ./var/public_html:/var/www/public_html
      - ./var/logs:/var/log/httpd
      - ./files/apache_conf/vhosts.conf:/etc/httpd/conf.d/vhosts.conf
      - ./files/php_conf/php.ini:/etc/php.ini
  # memcacheの構築
  memcached:
    image: memcached
  # phpMyAdminの構築
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mydb
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mydb
    ports:
      - 8080:80
networks:
  default:
    external:
      name: proxy

Apache의 설정 파일이나 php.ini도 git 관리하고 거기에서 Docker에 전달하도록 해 버립니다.
데이터베이스 덤프 데이터도 DB 컨테이너의 /docker-entrypoint-initdb.d 아래에 놓아 컨테이너 빌드 시 자동으로 가져옵니다.

프록시 Docker 구축



Nginx에서 프록시 서버를 빌드합니다.

proxy/docker-compose.yml
version: "2"
services:
  proxy:
    image: jwilder/nginx-proxy
    container_name: proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - ./conf.d:/etc/nginx/conf.d
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "10"

networks:
  default:
    external:
      name: proxy

여기까지 할 수 있으면, 나머지는 hosts에 192.168.33.10 hoge.dev 를 기재해 Vagrant up 하면, ㅡㅇㅇㅇㅇ 에서 v 로 개발 환경을 볼 수 있게 됩니다.

요약



CoreOS는 컨테이너 이용에 특화된 OS이므로 Docker와 매우 궁합이 좋습니다.
그리고, 이번은 Docker측에서 본 호스트 머신은 CoreOS이므로, 자주 흔한 Windows에서 움직이지 않는 문제가 일어나지 않고, 모두 해피가 될 수 있네요.

좋은 웹페이지 즐겨찾기