tpai
4/24/2016 - 10:52 AM

Docker and Vagrant

Docker and Vagrant

Vagrant

使用情境:多人共同維護同一產品,在虛擬機啟動後可立即進行開發。

預期結果:使用 Vagrantfile 執行 shell 腳本,將所需套件及服務裝載完成後並啟動,同時將資料匯入現有資料庫,讓使用者下完 vagrant up 之後便可透過連結特定位址使用該產品,此外亦可透過 NFS 掛載至本機的資料夾進行開發維護。

vagrant box add ubuntu <box-file-name>.box

在第一次下 vagrant up 的時候會自動下載 box file,但可能會碰到下載速度很慢的情況,此時可以透過 browser 其他較快的方式將檔案下載下來之後,只需透過上述指令即可安裝至本機。(此處以 ubuntu 為例)

Ref:

Forward SSH Key

By forwarding ssh public key throught ssh agent,that will allow user access private repo inside VM.

eval `ssh-agent`
ssh-add ~/.ssh/id_rsa
ssh-add -l

Rancher + Docker

使用情境:需要快速且大量部署產品,並可實作各服務的負載平衡。

預期結果:使用 Dockerfile 製作客製化映像並推至 registry,再利用 rancher 連結所有服務,最後透過 load balancer 將外部訪問導引至正確的服務上。

F2E Dockerfile

FROM nginx
ENV NGINX_PORT=80
ADD index.html /usr/share/nginx/html
ADD dist/ /usr/share/nginx/html

API Dockerfile

FROM node:4.4
EXPOSE 8888
ADD server.js /root
CMD ["node", "/root/server.js"]

Diagram

*.domain.name:80 -> f2e:80

                +-----+
       +--------> F2E |
       |        +--+--+
       |           |    service link
       |           |    alias: api
    +--+--+     +--+--+
    | L B |-----> API |
    +-----+     +--+--+
                   |    service link
                   |    alias: db
                +--+--+
                | D B |
                +-----+

*.domain.name:27177 -> db:27017

Vagrant.configure(2) do |config|
  config.vm.box = 'ubuntu/xenial64'
  config.vm.network 'forwarded_port', guest: 3000, host: 3000
  config.vm.network 'private_network', ip: '10.10.10.10'
  config.vm.provider 'virtualbox' do |vb|
    vb.name = 'repo_name'
    vb.auto_nat_dns_proxy = false
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off" ]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off" ]
    vb.memory = '4096'
  end
  config.vm.provision 'shell', path: 'install.sh', privileged: false
  config.vm.provision 'shell', inline: "\
    sudo service redis-server restart
    sudo service postgresql restart
    cd /vagrant && bundle exec rails s -p 3000 -b '0.0.0.0'
  ", run: 'always', privileged: false
  config.ssh.forward_agent = true
end
#!/bin/bash -x

: '
The following libraries will be needed while installing:

* Ruby: graphicsmagick
* Rails: ruby-dev zlib1g-dev liblzma-dev
* PG: libpq-dev
'

PACKAGES_LIST="
build-essential
curl
vim
git
nodejs
graphicsmagick
ruby-dev
zlib1g-dev
liblzma-dev
libpq-dev
redis-server
postgresql
postgresql-contrib
"

PACKAGES=""
for package in $PACKAGES_LIST
do
    PACKAGES="$PACKAGES $package"
done

IS_INSTALLED=.installed

echo "Package Installation Initiated..."

# Install Packages
sudo apt-get update
sudo apt-get install -y $PACKAGES

# Install NVM
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

# Install Node LTS
nvm install --lts
nvm ls

# Request RVM Project Key
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

# Install RVM
curl -sSL https://get.rvm.io | bash -s stable

export PATH="$PATH:/home/ubuntu/.rvm/bin"
source ~/.rvm/scripts/rvm

# Create .ssh folder and know hosts
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keyscan -H github.com >> ~/.ssh/known_hosts

# Grant superuser to current user
sudo -u postgres createuser --superuser $(whoami)

# Install Ruby
rvm install 2.3.1
rvm use 2.3.1 --default

# Install Rails and Bundler
gem install rails bundler

# Install gems, create db and mock data
cd /vagrant && \
bundle install --force && \
bundle exec rake db:create db:migrate db:seed