Docker and 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
使用情境:需要快速且大量部署產品,並可實作各服務的負載平衡。
預期結果:使用 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