Docker是一個近來快速興起的虛擬化技術,與虛擬機器不同的是,docker以應用程式為中心,將應用程式執行階段所需要的程式碼、函式庫等與OS/硬體層分離。在OS內的核心系統層打造虛擬執行環境。由於他不需要在Container內執行OS,因此不需要等待開機的時間,一個應用程式可以在幾秒之內就啟動並開始提供服務。
這系列的文章將會介紹透過Azure虛擬機器建立一個如下的Tomcat+mySQL環境,由於筆者只是個Linux初學者,因此除了需要能夠達到Load balance web server以及mySQL必須位於另一個host上之外,一切其他都會盡量以較簡單的方式來達成。
事前準備
- 建立一個虛擬網路DockerVnet,分為兩個子網段Subnet-Web1(10.0.0.0/11)與Subnet-DB(10.32.0.0/11)
建立虛擬機器
建立虛擬機器的步驟比較簡單,Azure的Gallery已經提供了幾個內建docker服務的image可以選擇;我們需要做的就是到Azure Portal建立兩台Web Host加入Subnet-Web以及一台SQL Host加入Subnet-DB
- 建立虛擬機器dockerweb1,確認將他加入虛擬網路中
- 重複以上步驟將dockerweb1、dockerweb2與dockermysql1建立完成
- 建立完成後,你應該可以在Resource Group中看到所有的機器,下圖中的haproxy為筆者後續建立用來做load balance測試之用,這裡可以先跳過他。
設定Tomcat Container
建立虛擬機器完成後,接下來便是設定我們的Container;由於筆者需要的情境是兩台host上各自建立一個container執行tomcat應用程式;此tomcat應用程式需要到mysql上取得資料並顯示。因此在這裡我們需要在dockerweb1與dockerweb2上建立一個container,在container中安裝tomcat與java runtime,安裝我們的應用程式並設定連線資訊指向mysql。
由於特殊需求,我需要將tomcat安裝在CentOS 5.8的image上,因此以下的範例,Container都是用CentOS 5.8的版本;但是實際上當然可以依照需求修改。
- 首先ssh到dockerweb1上確認docker服務已經安裝與執行
- 接著,我從docker registry中取得CentOS 5.8的image
- sudo docker pull gpmidi/centos-5.8
- 完成後確認docker image
- 接著,以此image啟動container,我們會在這個container中安裝tomcat及java環境
- sudo docker run –it gpmidi/centos-5.8 bash
- 請特別注意這裡紅色框框的地方,這是container id,稍後我們會需要這個container id
- 在container中安裝Java環境,由於這裡的動作都是標準動作,因此這裡就只列出我使用的命令
- 安裝完成後,切換到tomcat\bin目錄執行sh startup.sh測試安裝結果
- 確定完成後,執行exit離開此container
- 回到host環境後,要將剛剛我們針對container設定的改變commit回local repository
- sudo docker commit -a=”Michael” -m=”TOMCAT” <<Container ID>> <<Repository>>
- 例如:sudo docker commit -a=”Michael Chi” -m=”Tomcat” 123456 michilab;則以後我們可以直接以michilab這個image來啟動已經設定好tomcat的container
- 重複以上步驟將dockerweb2也設定完成
設定mySQL Container
- SSH到mySQL Host (dockermysql1)上,抓取CentOS 5.8的image,啟動此container
- 在此container安裝mySQL
- yum install mysql-server mysql php-mysql
- 安裝完成後,修改網路設定檔
- vi /etc/sysconfig/network
- 把host name改為以下
- HOSTNAME=internal.hostname.DOMAIN.com
- 啟動mysql伺服器
- 設定root使用者的帳密
mysql -u root
Set the root user password for all local domains
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new-password');
SET PASSWORD FOR 'root'@'localhost.localdomain' = PASSWORD('new-password');
SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('new-password');
Drop the Any user
DROP USER ''@'localhost';
DROP USER ''@'localhost.localdomain';
Exit MySQL
CRETE DATABASE test
Use test
CREATE INSTANCE mysqld98 basedir="/var/mysql98"
CREATE TABLE `memMember` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`fbId` varchar(20) DEFAULT NULL,
`name` varchar(50) NOT NULL,
`birthday` datetime DEFAULT NULL,
`phone` varchar(30) DEFAULT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 執行exit離開container
- 回到host commit改變
- sudo docker commit -a=”Michael” -m=”mySQL” <<container id>> <<repository>>