Search Google

Thursday, April 23, 2015

距離上次分享Linux container相關文章已經五年多了, 沒想到五年後居然有人用Linux container搞出了大名堂, 是的, 就是Docker!  最近越來越常聽到大家在討論Docker, 但是也很常聽到有人在問Docker跟VM到底哪裡不同.


舉個例子來說明:

在以前如果想要在同一台電腦上面同時虛擬化AP server + APP, DB, Mail server applications, 我們需要在Hosting OS上面跑三個VM instances (如下圖左邊的VMs), 每一個VM instance雖然只執行各自被指派的任務 (如下圖左邊填滿橘色, 綠色, 灰色的部分), 但是從OS層來說卻是在同一台實體機器上執行了四份OS, 相同的libraries被重覆載入四次 (如下圖左邊藍色的部分), 所以記憶體, CPU等資源等於浪費了.

有了Container (如下圖右邊的Containers)我們就不需要浪費資源在各application共用的部分, 下圖右邊的Containers所要表現的就是我們不再需要為了執行虛擬化的application而重複地在各個虛擬環境中執行OS, 各虛擬環境透過使用Hosting OS已經載入過的libraries替我們節省實體機器上的資源, 當然, 這只是眾多優點中的一個而已.


另外一個優點就是透過maintain Dockerfile (點我看sample)能幫助我們更清楚地知道每個application的環境是如何建立出來的, 包含需要安裝哪些套件, 需要先設定什麼樣的參數與執行什麼樣的指令.  
Dockerfile中可以reference既有的docker image讓我們動態且快速的調整出不同情況下所需的虛擬環境, 而且Dockerfile很小的文字檔, 需要的人很快就可以取得並在自己的環境把image build出來, 而不需要隨便就傳個幾GB的流量.

概念上的說明進行到這裡就好, 關於Docker的基本設定+使用google已經提供很多資訊了, 下面是我實際設定+使用過程中預到的問題以及小筆記:


// unable to run firefox from docker

// configure docker to use devicemapper rather than aufs (某些application需要在devicemapper模式下才能在docker中執行, eg. DB2)
https://gist.github.com/pcolazurdo/e61cfb84812a70b93e74
umount -l $(grep 'aufs' /proc/mounts | awk '{print $2}' | sort -r)
rm -rf /var/lib/docker
vi /etc/init.d/docker
touch /var/lib/boot2docker/profile
在profile中加入
#!/bin/sh
EXTRA_ARGS="--storage-opt dm.basesize=20G --storage-driver=devicemapper"

// create local docker registry (for local push/pull, 如果想讓開發測試團隊在內網就能夠分享docker images, 自己建個docker registry是個不錯的選擇)
http://cloudcounselor.com/2014/01/07/docker-private-registry-on-centos-rhel-6-5/

// private docker-registry
yum install -y docker-registry
default port: 5000
default repository location: /var/lib/docker-registry
編輯/var/lib/boot2docker/profile:
EXTRA_ARGS="--storage-opt dm.basesize=40G --storage-driver=devicemapper --insecure-registry localdocker:5000"
編輯/etc/hosts:
{intranet IP} localdocker
編輯/etc/hosts後要重啓docker:
/etc/init.d/docker stop
/etc/init.d/docker start
push to private docker-registry: docker push localdocker:5000/{repository}:{tag}
pull from private docker-registry: docker pull localdocker:5000/{repository}:{tag}

// docker-registry rest api (用來管理local docker registry裡的docker images+版本)
https://docs.docker.com/reference/api/registry_api/#delete-a-repository-tag
eg. get tags of mydb2:
GET http://localdocker:5000/v1/repositories/library/mydb2/tags
eg. remove ssosdpbase tag from db2-trinity:
DELETE http://localdocker:5000/v1/repositories/library/mydb2/tags/base
remove repository:
DELETE http://localdocker:5000/v1/repositories/mydb2

Wednesday, December 15, 2010

修改CodeIgniter (aka. CI)使其能正確執行oci_bind_by_name所需步驟

修改CodeIgniter (aka. CI)使其能正確執行oci_bind_by_name所需步驟:
Step 1.
/system/database/DB_driver.php -->
line 293:
--
if (FALSE === ($this->result_id = $this->simple_query($sql)))
++
if (FALSE === ($this->result_id = $this->simple_query($sql, $binds)))
line 440:
--
function simple_query($sql)
++
function simple_query($sql, $binds=FALSE)
line 447:
--
return $this->_execute($sql);
++
return $this->_execute($sql, $binds);

Step 2.
/system/database/drivers/oci8/oci8_driver.php -->
line 165:
--
function _execute($sql)
++
function _execute($sql, $binds=FALSE)
line 172-172:
--
++
if($binds != FALSE) {
foreach($binds as $k => $bind) {
oci_bind_by_name($this->stmt_id, $bind['name'], $bind['value']);
}
}

使用範例:
$sql = "insert
into related_firm
(
TYPE,
NAME,
CONTACT_ADDR,
CONTACT_NUMBER,
CONTACT_FAX,
SN
)
values
(
:TYPE,
:NAME,
:CONTACT_ADDR,
:CONTACT_NUMBER,
:CONTACT_FAX,
:SN
)";
$params[] = array('name'=>':TYPE', 'value'=>$this->type);
$params[] = array('name'=>':NAME', 'value'=>$this->name);
$params[] = array('name'=>':CONTACT_ADDR', 'value'=>$this->contactAddress);
$params[] = array('name'=>':CONTACT_NUMBER', 'value'=>$this->contactNumber);
$params[] = array('name'=>':CONTACT_FAX', 'value'=>$this->contactFax);
$params[] = array('name'=>':SN', 'value'=>$this->serialNumber);
$db = $this->load->database('TESTDB', TRUE);
$db->query($sql, $values, TRUE);

Thursday, December 09, 2010

Generate setter/getter for PHP in Eclipse

很久沒發文了,慶祝今天找到個快速產生setter/getter的套件,特別上來分享一下!

話說使用Eclipse開發Java class時在變數上點右鍵後選source即可看到自動產生setter/getter的選項,但開發PHP class時卻沒有這項貼心的功能~
詢問Google老師之後看到了很多做法,其中不乏自行編輯Eclipse的template for auto code completion,但是最讚的莫過於PHP source plugin這個套件,裝完之後Eclipse的toolbar上會出現"PHP Source",點下去即可選擇要產生特定變數的Getter/Setter :-)

下面的URL是該套件的官方網站:
http://pdt.plugins.e-surf.pl/features.php
裡面有screenshot供人瞻仰。。。

Saturday, May 22, 2010

紅酒"蒸"牛肉~

醞釀許久的煮飯魂終於在今天得到實現了~
參考前人的食譜(http://www.wretch.cc/blog/QLynnQ/7273158)之後,昨天下班後直奔sogo復興館B2的生鮮超市買了以下食材:





經過一整個晚上的浸泡,牛肉散發出迷人的香氣,放到鍋子裡稍微煎過之後更是香氣四溢!



牛肉起鍋後不用洗鍋子,直接把洋蔥放下去拌炒,接著再把紅蘿蔔與洋菇放下去一起炒,接著把蕃茄切塊丟進去煮成天然番茄醬,理論上現在應該就要把浸牛肉的紅酒倒進去悶煮,但有鑒於紅酒存量不足,於是拿水代替~









然後加入鹽,黑胡椒,香料攪拌調味









將煮好的醬汁與起鍋的牛肉混合後把之前保存下來的紅酒肉汁一併加到鍋內









再加點鹽、黑胡椒、香料就可以放進電鍋裡蒸了(為了確保蒸得夠久,我在電鍋的外鍋放了三碗水)!





最後就是清理環境,打完收工,等著吃飯囉~


Friday, March 19, 2010

等一下就下車

搭捷運的時候很常聽到"等一下就下車",今天早上不免俗的又聽到了~
很奇怪,看到行動不便的人讓座是很正常的一件事,為什麼要用"等一下就下車"當做理由呢?
還是說"等一下沒有要下車"就不打算讓坐,如果是這樣,幹麻還假惺惺的讓座呢?
反正等一下你下車自然會空出一個座位啊!
真是莫名奇妙~

Saturday, March 13, 2010

指定Eclipse使用JDK執行

Symdrome:

The Maven Integration requires that Eclipse be running in a JDK, beacuase a number of Maven core plugins are using jars from the JDK.

Please make sure the -vm options in eclipse.ini is pointing to a JDK and verify that Installed JREs are also using JDK installs.

Solution:
在eclipse.ini的最開頭(一定要在最開頭,而且-vm之後要換行!)加上jdk裡面javaw.exe的完整路徑,如下:
-vm
C:\Program Files\Java\jdk1.6.0_16\bin\javaw.exe

Sunday, March 07, 2010

Servicemix 3.3.1最常見的build error & solution

先給sulution:
http://cwiki.apache.org/SM/discussion-forums.html#nabble-tt25602583|a25603368

再給syndrome:

error: error reading
[Home_Dir]\.m2\repository\org\springframework\spring-dao\2.0.6\spring-dao-2.0.6.jar;
error in opening zip file
重點是error in opening zip file
根據官方說法,是被3rd party的東西影響到的,所以我們只需要將solution提供的repository加入pom.xml的repositories裡,再將zip file的目錄刪除,以上面的syndrome為例 --> [Home_Dir]\.m2\repository\org\springframework\spring-dao
然後重新執行mvn install皆可。

據說在3.3.2版本中會解決這個問題,至於他什麼時候要release,誰知道呢?
所以先將就一下temp solution,頂著先~

Thursday, March 04, 2010

不喜歡照著manual還做不出來的感覺!

Open source的東西這就是這樣。。。照著manual做還不一定能得到相同的結果!
http://servicemix.apache.org/building.html
已經是從SVN checkout src出來,還是在build的過程中得到這樣的錯誤訊息:

[INFO] Error building POM (may not be this project's POM).
Project ID: null:servicemix-utils:bundle:1.1.0
Reason: Cannot find parent: org.apache.servicemix:servicemix-pom for project: null:servicemix-utils:bundle:1.1.0 for project null:servicemix-utils:bundle:1.1.0

Google也不一定神準,花了點時間把垃圾過濾掉後終於找到解答
http://mail-archives.apache.org/mod_mbox/servicemix-users/201002.mbox/%3CA57F3D97-AB5E-4E7E-A84D-46B8771B9E5C@gmail.com%3E
原來是檔案根本就有問題!
刪掉讓maven在build的過程中自動再下載一次就解了,之後在build xerces也出現相同的錯誤,解法同樣是將對應的.pom檔移除。

Wednesday, February 24, 2010

眉眉角角~

今天終於解決了一個延宕多時的問題 --> 在我的機器上始終無法執行ANT!

C:\Documents and Settings\Administrator>ant
這個時候不應有 Files\Apache。

上Google找了很多次也找了很久始終找不到答案(居然有Google找不到的東西!),
在百般無奈下只好再度把manual翻出來看,終於在仔細研讀後看到了這麼一段話
Windows Note:

The ant.bat script makes use of three environment variables - ANT_HOME, CLASSPATH and JAVA_HOME. Ensure that ANT_HOME and JAVA_HOME variables are set, and that they do not have quotes (either ' or ") and they do not end with \ or with /. CLASSPATH should be unset or empty.

原來是我先前設定的CLASSPATH造成ANT無法執行,於是趕緊在ant.bat的開頭加上
set CLASSPATH=

經測試後終於解決了擱置超過半年的疑案!
C:\Documents and Settings\Administrator>ant
Buildfile: build.xml does not exist!
Build failed
這個故事告訴我們人要在走投無路而且有只能靠自己的覺悟時才會認真看manual。。。

Sunday, August 16, 2009

Pixar展覽日

今天跟chtsai與信安一行人到台北市立美術館看pixar 20周年展覽,沒想到人超多,買預售票還要排大概一小時,現場買票要等兩小時~


整個展覽中我最喜歡的是那些上面寫滿密密麻麻註記的手稿,還有製作流程的說明影片,感覺上跟我們做系統文件差不多,只是歡樂多了!為了不破壞各位參觀的興致,就不說得太仔細了,不過當然要不免俗地放一些在入口及出口拍的紀念照。




最後推薦大家去看看,可以晚一點再去,如果堅持要現在(週末)去的話就要做好跟一堆人擠&排隊的心理準備~