Thursday, September 7, 2017

Docker

Source: http://www.cc.ntu.edu.tw/chinese/epaper/0036/20160321_3611.html

前言
想像小明是個資訊相關科系的大學生,為了維持生計,難免總是要去接一些外包的案子來過生活,假設來自客戶的需求是希望在Amazon Web Services (AWS)上用Ubuntu 14.04 開發一套網路伺服器,而他平常慣用的電腦是Windows系統(或者是Mac OS),難不成要去買一台新的電腦,然後安裝Ubuntu作業系統來開發案子?又或者有更簡單的方法,就是直接在他的Windows系統上安裝虛擬主機(Virtual Machine),有了虛擬化的技術,軟體相容性變得不再是問題。
假若小明又接了新的案子,這次是幫客戶修改既有的軟體,他看了看系統版本,環境是Ubuntu 10.04,雖然還是Ubuntu系統,但在10.04的軟體竟然無法在14.04上編譯,小明花費了大量工夫,才發現原來一些函式庫在新版的14.04上已更新並不支援舊版,於是他花了一周末重新編譯所需的函式庫,花了這麼多時間,卻還沒開始開發專案,所以知道下次遇到這種情形,直接安裝虛擬主機Ubuntu 10.04是最快的方法。然而隨著事業越作越大,他的電腦裡有著各式各樣不同的虛擬作業系統,Debian、Ubuntu、CentOS…等等幾十幾套不同版本的開發環境,很顯然他必需要去買一個新的硬碟來存放這些映像檔。而且遇到一個困難點,若要同時執行多個虛擬主機顯然會降低系統校能,難不成要在買一台新電腦嗎?
一台電腦最多可以執行十台虛擬主機就已經很勉強了,假若有人告訴小明,有一個新的虛擬技術,可以在一台主機上同時執行數百個不同的虛擬應用程式,而且彼此完全隔離,不就解決了現有的難題嗎? 傳統的虛擬主機技術是利用硬體的功能來模擬,而這套輕量的虛擬技術,一般習慣將它稱之為容器(Container),則是套透過作業系統(Linux為其原生),建立多個虛擬的實例(instances),有獨立的函式庫及獨立的shell,並彼此隔離。以下就以容器與虛擬主機作一個對照表。

表一 Docker容器與虛擬主機功能比較
Docker簡介
雲端時代的來臨,意味著我們不再需要追求高效能的家用主機,而傾向把複雜運算丟給雲端來處理,數據雲端化的趨勢,也加速雲端伺服器開發的需求。想像若一個開發者,在Amazon申請了AWS雲端服務,然後以LAMP(Linux、Apache、MySQL、PHP)建置其網路平台,即使是一個熟練的工程師,仍需花費不少時間在系統安裝與設定,才能讓手邊的原始碼在網路上執行。而當客戶需求改變時,有可能又要花時間將系統從AWS搬到微軟的Azure平台,這表示工程師又要花時間處理煩瑣的問題。假設在不同的平台上都安裝了Docker的應用程式,就可以將自己開發的程式用容器打包起來,快速移植到另一個平台。 如下圖所示,容器是一個映像檔(比如說CentOS 6.6)加上自己開發的應用程式,所組合成的架構,新的主機端只要安裝了相同的映像檔(CentOS 6.6)之後,就可以執行既有的應用程式。傳統上必需安裝幾GB大的虛擬主機,而在這個例子上,只要下載兩百多MB的映像檔即可以完成一樣的工作,這是傳統虛擬主機所無法比擬的地方。這邊出現了幾個關鍵字映像檔容器,之後會有更清楚的說明,這邊只要知道最重要的觀念就是,用Docker建置的軟體(又稱為容器),可以迅速的移植到不同平台,也就是Docker一直宣揚的精神 "Build, Ship, and Run Any App, Anywhere."

圖二 虛擬容器的搬移
Docker的支援與安裝
Docker是以Linux為其原生開發,所以在大部份的Linux系統上都可以安裝。但是Docker是在2013年發行初始版本,這意謂著若是要建構Docker開發平台,建議以較新的Linux系統為優先考量。而Windows 和Mac OS作業系統本身無法直接運行,所以要透過Boot2Docker來支援,有興趣的的讀者可以自行參考連結網址。不過對於Windows和Mac OS環境的開發者來說,建議還是先安裝Linux虛擬主機,再用此虛擬主機建置Docker平台,會簡化安裝流程(如下圖說明)。

圖三 虛擬容器的建議設置
以下簡述不同版本的安裝方式
1. Ubuntu 14.04系統:
 $ sudo apt-get update
 $ sudo apt-get install docker.io
 $ sudo ln –sf /usr/bin/docker.io /usr/local/bin/docker
2. Ubuntu 14.04以下的版本,要更新內核才能支援:
 $ sudo apt-get update
 $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
 $ sudo apt-get install docker.io
 $ sudo ln –sf /usr/bin/docker.io /usr/local/bin/docker
3. CentOS 7:
 $ sudo yum install docker
4. CentOS 6的版本以上的版本:
 $ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
 $ sudo yum install docker-io
安裝好Docker後,用一個Hello World來測試是否安裝成功。
 $ docker run ubuntu:10.04 /bin/echo 'Hello world'

圖四 第一個Docker測試環境
其中docker run ubuntu:10.04 是指定一個特定版本的系統(10:04),然後執行其echo指令,這邊私人端的倉庫若沒有此10.04的映像檔,則會去公有倉庫抓這個版本的,並運行其指令,當然也可以試試看其它指令。
 $ docker run centos:6.6 /bin/ps

圖五 Docker執行程序(以PS指令)
使用ps 指令來觀察系統目前執行的程序,可見當安裝了Centos 6.6映像檔,僅載入最小的系統資源。
到目前為止,安裝了Docker系統後,就可以在平台上以最小資源運行其指令,不同版本的映像檔約幾百MB左右,當私有端沒有時,會從公有倉庫抓取所需的映像檔,當下次執行時,就可以重複使用。若想要觀察目前已安裝的映像檔(image),則可透過下列指令。如圖所示,可以看到已安裝映像檔,以及所佔的容量。
 $ sudo docker images

圖六 系統上的映像檔(image)
Docker的基本概念
剛剛筆者以一個簡單的安裝程序,瞭解Docker怎麼運行,但相信對大部份的讀者來說,其概念還是很模糊,所以接下來這節將介紹Docker的核心概念。主要有四個核心:
 Docker I/O
 倉庫Repository
 映像檔Image
 容器Container
在介紹這四個核心前,先花一點篇幅來介紹Docker與VM的差異性。如圖七所示:

圖七 Docker容器與虛擬機器的比較
Docker 僅載入所需要的函式庫與執行檔,而不像VM需要安裝大容量的作業系統。而這些函式庫與執行檔則被放在映像檔內,可以快速的從網上下載到私有端倉庫。
1. Docker I/O
任何系統要操作Docker的系統,就必需在作業系統上先安裝Docker,上一節筆者已簡單介紹如何安裝及使用。有了Docker I/O,就可以跟公有雲端進行互動,抓取所需的映像檔,跟VM不同的地方在於,VM是用硬體端的hypervisor技術來同時執行多個虛擬主機,一般可預見需要大量的運行資源。
Docker則是用軟體端的作業系統來實現虛擬分割的技術,由於僅載入核心的函式庫,所以跟VM不同的地方在於,可以同時執行數百個不同的應用容器,其原理不難理解,因為Linux平台本身就可以穩定的執行多個程序,而Docker則是套用Linux的技術,將每個容器當成一個實例(instance),彼此完全隔離,又可以依需求而互動。
2. 倉庫Repository
倉庫的概念就是發揮雲端的精神,將大量的資源存放在公有倉庫,而私有倉庫則存放常用的資源或者是自行開發的資源。這其實跟Linux的概念是很相似的,最大的不同點在於,Docker存放的是不同版本的作業系統映像檔。
舉例來說,開發者先在私人主機端利用Docker I/O安裝了映像檔Ubuntu 14.04,並在此環境上開發了應用軟體app1,而他預計將在雲端放上這套軟體app1。他所需要的工作就是在雲端上利用公有倉庫下載Ubuntu 14.04映像檔,接著就可以運行其app1,而不用在乎雲端伺服器是否與自己的主機相容。能精簡安裝的流程其關鍵就在於,映像檔本身是唯讀且不可更改,這樣才能確保在不同雲端平台,都有相同的系統環境,易於應用軟體的移植。目前最大的公有倉庫網址如下:https://hub.docker.com/
3. 映像檔Image
前面介紹了Docker與VM的不同,這邊的映像檔就可以想成是VM上的Guest OS,其差別在於映像檔僅包含最小可運行的系統,而且更重要的是映像檔本身是唯讀不可修改。
這邊可能會有疑惑,既然不能修改映像檔,那不就意味著不能修改環境?事實上還是可以,那是因為Docker本身提供了容器的架構讓使用者可以自行設定並修改,如果有需要,還可以自行建構成新的映像檔放在私有倉庫。而為了避免映像檔衝突,公有雲端為每個映像檔提供了獨有的ID(例如Ubuntu 14.04的ID = 8251da35e7a7),只有是同樣的ID就可以確保所下載的映像檔是官方所發行的,而不會跟私有的映像檔有所以衝突。
4. 容器Container
容器是利用映像檔所創造的實例(instance),一個映像檔可以創造出多個不同的容器,而且彼此隔離。容器就像是映像檔的可寫層,與維讀的映像檔組合成一個環境,便於開發所需的應用程式。因為容器是Docker最核心的技術,所以用以下的例子來說明:
新建一個容器,以ubuntu 14.04來建構
 $ sudo docker create –it ubuntu:14.04
查詢已建立的容器,初始會是停止狀態
 $ sudo docker ps –al
運行已建立的容器,輸入剛剛查詢的id,每台主機不一樣,請自行輸入
id可以輸入前幾碼即可
 $ sudo docker start -i “ID” 例如b6a0ac8b2ad1或者是b6a

圖八 利用標籤碼啟動Docker容器
停止容器
 $ sudo docker stop "ID"
匯出容器,就可以搬移到其它的主機上
 $ sudo docker export "ID" > test.tar
匯入容器成新的映像檔,即可儲存到本機倉庫中
 $ cat test.tar | sudo docker export - test/ubuntu:v1.0
結論
Docker從2013年發展出來,已成為當紅的虛擬化技術,其主要原因在於它輕量化的虛擬層級以及方便移植,有利於雲端系統的開發。尤其是現在的數位時代面臨了大數據的挑戰,虛擬化本身也面臨了系統資源的不夠問題,若能夠運用Docker的輕量化技術,在雲端實作大量的虛擬化主機,不在受限於成本的考量,這也是可以期待Docker未來的發展。

Sunday, May 14, 2017

SecureCRT logging

Source: http://www.ciscozine.com/how-to-log-securecrt/

Configure default settings for logging:
    . Go to Options -> Global Options -> Default Session
    . Click on "Edit Default Settings..." -> Select "Log File"

These fields accept several variables; a complete list is shown below:

%H – hostname
%S – session name
%Y – four-digit year
%M – two-digit month
%D – two-digit day of the month
%h – two-digit hour
%m – two-digit minute
%s – two-digit seconds
%t – three-digit milliseconds
%% – percent (%)
%envvar% – environment variable (for instance %USERNAME%)


Friday, February 24, 2017

Symbols keyboard shortcuts on Mac

Function (ƒ) : Option + f
Corporate (©) : Option + g
Degree (˚) : Option + k or Option + 0 (º)
Micro (µ) : Option + m
Pi (π) : Option + p
Registered mark (®) : Option + r
Summation (∑) : Option + w
Approximately (≈): Option + x
Yen (¥) : Option + y
Ohm (Ω): Option + z
Divide (÷) : Option + /
Non-equal (≠) : Option + =
Infinity (∞) : Option + 5
Euro ($) : Option + 3
Trade mark (™) : Option + 2

Wednesday, December 28, 2016

Node.js for Mac

Source: http://icarus4.logdown.com/posts/175092-nodejs-installation-guide

1. Install NVM (Node.js Version Manager)
   1.1. Add "source $(brew --prefix nvm)/nvm.sh" to ~/.bash_profile
   1.2. Source ~/.bash_profile

2. Install Node.js
   2.1. List available versions by "nvm ls-remote"
   2.2. Install the LTS by "nvm install v6.9.2"


Node.js directory: /usr/local/opt/nvm/versions/node/vX.X.X
Installed versions: nvm ls
Current in use version: nvm -v
To switch version: nvm use vX.X.X (only valid for current shell). To fix it, set it as default version to use: nvm alias default vX.X.X



Tuesday, November 22, 2016

Samba server on Ubuntu

. Install samba server on ubuntu if not done yet.
    sudo apt-get install samba

. Create an user, howard.
    sudo useradd howard

. Create a samba user, howard, and set the password.
    sudo smbpasswd -a howard

. Configure the shared folder permission info in samba config file.
    sudo vi /etc/samba/smb.conf
    Add following info to the end of smb.conf file
    [src]
    path = /home/howard/src/
    browseable = yes
    read only = no
    writeable = yes
    create mask = 0755
    directory mask = 0755
    valid users = howard

. Restart the samba service and it's now ready!
    sudo service smbd restart


[To connect the samba server from a Mac OS X]
    Go to finder and Cmd+K, enter smb://IPOfUbuntu/src

Monday, November 7, 2016

Sync folders with rsync

Copy everything from srcFolder to dstFolder
     rsync -va srcFolderPath/ dstFolderPath/


Copy everything from srcFolder to dstFolder and delete any files that does not exist in srcFolder

     rsync -va --delete srcFolderPath/ dstFolderPath/

Note: the trailing slash (/) of the srcFolderPath is important. If you omit it, for instance, rsync -va srcFolderPath dstFolderPath/
then a folder named "srcFolderPath" will be created and saved into dstFolderPath.

Friday, October 7, 2016

The file is damaged and should be moved to the trash

The problem could be fixed by turned off the gatekeeper.

1. Disable the gatekeeper by
   . sudo spctl --master-disable
2. Right click on the application and click open. It should work now.
3. Enable the gatekeeper by
   . sudo spctl --master-enable



To check the status of the gatekeeper:
   . sudo spctl --status

Check clients which connect to Mac OS X Wi-Fi Internet Sharing

arp -i bridge100 -a bridge100 may be different on your Mac OSX