使用docker建立rails執行環境

1. 安裝 Ubuntu 16.04 Host

我們使用docker來安裝rails應用程式
使用docker有以下好處

1. 可將rails應用程式,連同執行環境
   發布至任何可以執行docker的linux機器

2. 開發環境和執行環境分離,host機器上無需安裝ruby

3. 可自在的測試各種rails版本

2. 登入帳號以 rails ( UID = 1000 ) 為範例

我們會在docker上創建一個一模一樣的帳號(UID = 1000)
這樣的好處在於docker rails可以和host機器共用檔案
因為我們會凍結docker rails的執行環境
程式碼由host的IDE(rubymine,vs core等)來負責更新
而rails站台產生的永續資料,也不會因為container的關閉而消失

3. 安裝docker套件

sudo apt-get update
sudo apt-get install docker.io
sudo docker pull ubuntu:16.04

4.設定ubuntu image

啟動ubuntu container

sudo docker run -t -i ubuntu:16.04 /bin/bash

在container中安裝相依套件

apt-get update
apt-get install vim
apt-get install build-essential
apt-get install bison
apt-get install openssl
apt-get install libreadline6
apt-get install libreadline6-dev
apt-get install curl
apt-get install zlib1g
apt-get install zlib1g-dev
apt-get install libssl-dev
apt-get install libyaml-dev
apt-get install libsqlite3-0
apt-get install libsqlite3-dev
apt-get install sqlite3
apt-get install libxml2-dev
apt-get install libxslt-dev
apt-get install autoconf
apt-get install libc6-dev
apt-get install nodejs
apt-get install libcurl4-openssl-dev
apt-get install imagemagick
apt-get install wget
apt-get install sudo
apt-get install tzdata

5. 編譯ruby直譯器

可以至官網下載新版原始碼

cd ~
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.gz  #下載原始碼
tar zxv -f ruby-2.4.2.tar.gz                                     #解壓縮
cd ruby-2.4.2                                                    #進入原始碼目錄
./configure                                                      #產生Makefile
make                                                             #開始編譯
make install                                                     #安裝
ruby -v                                                          #測試ruby

6. 建立帳號

這個帳號要與host的登入帳號UID一樣
系統建立時第一個帳號UID為1000
這樣container和host可以共用資料夾

useradd rails -m -s /bin/bash
passwd rails

7. 安裝rails

gem install rails --no-ri --no-rdoc  #使用gem來安裝rails
exit                                 #離開docker container

8. 將container儲存為docker image

我們剛才的container需要儲存為docker image
從此之後便可以任意啟動,拷貝至其他docker

sudo docker ps -a
你可以看見這樣的訊息

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
e495fd4faaf7        ubuntu:16.04        "/bin/bash"         24 hours ago        Exited

記下CONTAINER ID
本例是e495fd4faaf7
以下指令可以將container儲存成image

sudo docker commit -m "註解打這裡" e495fd4faaf7 rails

以下指令可以看見剛才新增的image

sudo docker images
REPOSITORY   TAG                 IMAGE ID            CREATED              SIZE
rails        latest              5feec0b18ece        About a minute ago   1.168 GB

9.啟動rails執行環境

sudo docker run -t -i --rm -p 3000:3000 -v /home/rails:/home/rails rails sudo -i -u rails /bin/bash

參數解析
-t -i

綁定標準輸出入

-rm

離開container就立即刪除

-p 3000:3000

將 主機 3000 port 導向 container 3000 port

-v /home/rails:/home/rails

將 主機的家目錄綁定到 container 的家目錄


1.你在container家目錄所做的變更( rails new, rails generate 等等 )都會反映到主機家目錄

2.主機的IDE(rubymine,vs core等等)的編輯結果,container也存取得到

-i -u rails /bin/bash

以使用者rails登入container

10. 於conatiner環境中執行rails指令

cd ~
rails new ggg --skip-bundle
cd ggg ; bundle install --path=vendor/bundle
rails s -b 0.0.0.0

此時打開host端瀏覽器輸入http://127.0.0.1:3000即可看見 welcome 頁面

最後

rails從5.0開始的預設應用伺服器是puma,不再是webrick
所以我們只要安裝ngnix做反向代理伺服器
接著讓puma執行在product模式便足敷使用