Integrate Chef Container With Docker

Docker 最近真的是太紅了,所以好像不來跟他扯上一點關係不行,可能會被其他的工程師鄙視,以往我在開發 Chef Cookbook 時,都是採用 Vagrant + Berkshelf 來搞定一切,不過 Vagrant 的背後藏鏡人,其實就是咱們的 Virtual Machine,所以一開多了難免硬體資源要越吃越多,那假如我們把 Vagrant 換成 Docker 是不是就可以魚與熊掌同時兼得呢?跟著文章做一次後就可以利用Chef 來 Provision Docker,到時候再來評估也不遲

1. 一開始當然逃不過要安裝一些必要的Package

  • 首先當然是要把 Docker 給安裝好,目前應該所有常見的平台都有支援,所以先到 Docker 的官方安裝網頁,選定自己想要使用平台的安裝方法

  • 接下來要安裝 ChefDK,裡面包含有不少好用開發 Chef 的工具,但是我們今天只用得到 Berkshelf,先到 ChefDK 官方下載網頁去把支援你使用平台的安裝檔給搞回來為首要任務,根據你的平台有可能是rpm,deb,dmg 或是 msi,

# rpm
~$ sudo rpm -ivh 檔名
# deb
~$ sudo dpkg -i 檔名
# dmg 和 msi
~$ 用手點一下吧XD

安裝好了之後假如你是 Linux 相關的作業系統(Windows 的我沒裝過XD),可以把 ChefDK 使用的 Ruby 版本設定到環境變數裡,指令如下:

~$ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
~$ source /etc/profile
~$ which ruby
# 應該會出現 /opt/chefdk/embedded/bin/ruby
# 假如是出現 /usr/bin/ruby 那就是設定失敗嘍
  • 一般來說只要做好這兩個步驟就可以使用,也可用下面的指令驗證,假如你想要做更多的設定或是得到更詳細的說明,到 ChefDK 的官方安裝文件網站逛逛
~$ chef verify
Running verification for component '...'
..........
---------------------------------------------
Verification of component '...' succeeded.
  • 接下來安裝 knife container plugin,為什麼要裝這個呢?因為 Docker 拿掉太多東西,導致原本 Chef 的 Workflow 是行不通的,所以需要這個 Plugin 搭配 Chef-Container 一起使用,才可以達到 Provision 的可能性
~$ chef gem install knife-container

2. 該裝的東西也裝得差不多了,接下來就來試試看用 Chef Provision 一個 Docker 安裝好 Apache

  • 執行下面的指令,把Berksfile, Dockerfile 和 一些哩哩匝匝的東西生出來
knife container docker init demo/apache2 -r 'recipe[apache2]' -z -b
# -z 代表 local mode
# -b 代表 生成 Berksfile
  • 檔案結構如下:
dockerfiles/
└── demo/
    └── apache2/
        ├── Berksfile
        ├── Dockerfile
        └── chef/
            ├── first-boot.json
            └── zero.rb
  • 接下來必須要更改 Node Attribute 增加 container_service 要跑什麼,等等我們把 Docker image 啟動之後,Chef 才知道要透過 runit 去執行它,以前不用這樣做的原因是一般的 Virtual Machine 有 init scheme
~$ vim dockerfiles/demo/apache2/chef/first-boot.json
# 把檔案內容修改如下即可:
{
   "run_list": [
      "recipe[apache2]"
   ],
   "container_service": {
      "apache2": {
         "command": "/usr/sbin/apache2 -k start"
      }
   }
}
  • 再來是把 Docker image 建立起來,這邊我是使用 Chef 官方的 Demo image 來偷懶XD
~$ knife container docker build demo/apache2 -z
# -z 很重要,因為這邊還是在跑 local mode,不然你就會看到...
# FATAL: Can not find a Chef configuration file

... 略 ...
# Berkshelf 會先把必要的 Cookbook下載到...
# dockerfiles/demo/apache2/chef/cookbook 裡面放好
# 然後 chef 就會開始執行,看到下面這段就代表執行成功
[2014-12-13T13:26:10+00:00] INFO: service[apache2] reloaded
[2014-12-13T13:26:10+00:00] INFO: Chef Run complete in 22.533930209 seconds
[2014-12-13T13:26:10+00:00] INFO: Running report handlers
[2014-12-13T13:26:10+00:00] INFO: Report handlers complete
[2014-12-13T13:26:12+00:00] INFO: Deleting client key...
 ---> 503674cfdfe7
Removing intermediate container 56b1f1055e84
Step 3 : RUN rm -rf /etc/chef/secure/*
 ---> Running in 9d003a1b6331
 ---> 6f710d21b424
Removing intermediate container 9d003a1b6331
Step 4 : ENTRYPOINT chef-init
 ---> Running in 3919beb26744
 ---> ab6f8834adf4
Removing intermediate container 3919beb26744
Step 5 : CMD --onboot
 ---> Running in 933c20976ff4
 ---> 504448f300a2
Removing intermediate container 933c20976ff4
Successfully built 504448f300a2
  • 看看 Docker image 是不是已經被建立好了
~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
demo/apache2        latest              504448f300a2        7 minutes ago       350.9 MB
  • 接下來把這個我們把用 Chef Provision 好的 Docker image 啟動起來
~$ docker run -d demo/apache2
  • 最後來看一下他是不是真的再跑了,沒有意外的話就會看到 Container 啟動中,而且 Apache 也在其中執行著
# 查看目前正在執行的 Container
~$ docker ps

# 查看 Container 內在執行的 Process
~$ docker top {container ID}
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s