Docker實踐

起因

Docker算是現在非常火的一個項目,但筆者對其一直不怎么感冒,畢竟沒啥使用場景。只是最近,筆者需要在自己的mac電腦上面安裝項目的開發環境,發現需要安裝MySQL,LedisDB,xcodis,Redis,Zookeeper等一堆東西,而同樣的流程仍然要在Windows的機器上面再來一遍,陡然覺得必須得有一個更好的方式來管理整個項目的開發環境了。自然,筆者將目光放到了Docker上面。

根據官方自己的介紹,Docker其實是一個為開發和運維人員提供構建,分發以及運行分布式應用的開源平臺(野心真的不小,難怪CoreOS要新弄一個Rocket來跟他競爭的)。

Docker主要包括Docker Engine,一個輕量級的運行和包管理工具,Docker Hub,一個用來共享和自動化工作流的云服務。實際在使用Docker的工程中,我們通常都是會在Docker Hub上面找到一個base image,編寫Dockerfile,構建我們自己的image。所以很多時候,學習使用Docker,我們僅需要了解Docker Engine的東西就可以了。

至于為啥選用Docker,原因還是很明確的,輕量簡單,相比于使用VM,Docker實在是太輕量了,筆者在自己的mac air上面同時可以運行多個Docker container進行開發工作,而這個對VM來說是不敢想象的。

后面,筆者將結合自己的經驗,來說說如何構建一個MySQL Docker,以及當中踩過的坑。

MySQL Docker

筆者一直從事MySQL相關工作的開發,對于MySQL的依賴很深,但每次安裝MySQL其實是讓筆者非常頭疼的一件事情,不同平臺安裝方式不一樣,加上一堆設置,很容易就把人搞暈了。所以自然,我的Docker第一次嘗試就放到了MySQL上面。

對于mac用戶,首先需要安裝boot2docker這個工具才能使用Docker,這個工具是挺方便的,但也有點坑,后續會說明。

筆者前面說了,通常使用Docker的方式是在Hub上面找一個base image,雖然Hub上面有很多MySQL的image,但筆者因為開發go-mysql,需要在MySQL啟動的時候傳入特定的參數,所以決定自行編寫Dockerfile來構建。

首先,筆者使用的base image為ubuntu:14.04,Dockerfile文件很簡單,如下:

FROM ubuntu:14.04

# 安裝MySQL 5.6,因為筆者需要使用GTID
RUN apt-get update \
    && apt-get install -y mysql-server-5.6

# 清空apt-get的cache以及MySQL datadir
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /var/lib/mysql

# 使用精簡配置,主要是為了省內存,筆者機器至少要跑6個MySQL
ADD my.cnf /etc/mysql/my.cnf

# 這里主要是給mysql_install_db腳本使用
ADD my-default.cnf /usr/share/mysql/my-default.cnf

# 增加啟動腳本
ADD start.sh /start.sh
RUN chmod +x /start.sh

# 將MySQL datadir設置成可外部掛載
VOLUME ["/var/lib/mysql"]

# 導出3306端口
EXPOSE 3306

# 啟動執行start.sh腳本
CMD ["/start.sh"]

我們需要注意,對于MySQL這種需要存儲數據的服務來說,一定需要給datadir設置VOLUMN,這樣你才能存儲數據。筆者當初就忘記設置VOLUMN,結果啟動6個MySQL Docker container之后,突然發現這幾個MySQL使用的是同一份數據。

如果有VOLUMN, 我們可以在docker run的時候指定對應的外部掛載點,如果沒有指定,Docker會在自己的vm目錄下面生成一個唯一的掛載點,我們可以通過docker inspect命令詳細了解每個container的情況。

對于start.sh,比較簡單:

  • 判斷MySQL datadir下面有沒有數據,如果沒有,調用mysql_install_db初始化。
  • 允許任意ip都能使用root賬號訪問,mysql -uroot -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;",否則我們在外部無法連接MySQL。
  • 啟動mysql

構建:

docker build -t siddontang/mysql .

構建好了MySQL Docker image,我們就能使用docker run來運行了:

docker run -d -p 3306:3306 --name=mysql siddontang/mysql:latest

這里,我們基于siddontang/mysql這個image創建了一個名叫mysql的container并運行,它會調用start.sh腳本來啟動MySQL。

而我們通過docker stop mysql就可以停止mysql container了。

如果筆者需要運行多個MySQL,僅僅需要多新建幾個container并運行就可以了,當然得指定對應的端口。可以看到,這種方式非常的簡單,雖然使用mysqld_multi也能達到同樣的效果,但是如果我需要新增一個MySQL實例,mysqld_mutli還需要去更改配置文件,以及在對應的MySQL里面設置允許mysqld_multi stop的權限,其實算是比較麻煩的。而這些,在Docker里面,一個docker run就搞定了。

完整的構建代碼在這里,mysql-docker,你也可以pull筆者提交到Hub的image siddontang/mysql來直接使用docker pull siddontang/mysql:latest

Boot2Docker Pitfall

從前面可以看到,Docker的使用是非常方便的,但筆者在使用的時候仍然碰到了一點坑,這里記錄一下。

IP

最開始碰到的就是ip問題,筆者在run的時候做了端口映射,但是外部使用MySQL客戶端死活連接不上,而這個只在筆者mac上面出現,linux上面正常,后來發現是boot2docker的問題,我們需要使用boot2docker ip返回的ip來訪問container,在筆者的機器上面,這個ip為192.168.59.103。

Volumn

仍然是boot2docker的問題,筆者在docker run的時候,使用-v來將外部的目錄綁定到datadir這個VOLUMN上面,這個在linux上面是成功的,可是在mac上面,筆者發現mysql_install_db死活沒有權限寫入磁盤。后來才知道,boot2docker只允許對自己VM下面的路徑進行綁定。鑒于在mac下面僅僅是調試,數據不許持久化保存,這個問題也懶得管了。反正只要不刪除掉container,數據還是會在的。

Flatten Image

在使用Dockerfile構建自己的image的時候,對于Dockerfile里面的每一步,Docker都會生成一個layer來對應,也就是每一步都是一次提交,到最后你會發現,生成的image非常的龐大,而當你push這個image到Hub上面的時候,你的所有layer都會提交上去,加之我們國家的網速水平,會讓人崩潰的。

所以我們需要精簡生成的image大小,也就是flatten,這個Docker官方還沒有支持,但至少我們還是有辦法的:

  • docker export and docker import,通過對特定container的export和import操作,我們可以生成一個無歷史的新container,詳見這里
  • docker-squash,很方便的一個工具,筆者就使用這個進行image的flatten處理。

后記

總的來說,Docker還是很容易上手的,只要我們熟悉了它的命令,Dockerfile的編寫以及相應的運行機制,就能很方便的用Docker來進行團隊的持續集成開發。而在生產環境中使用Docker,筆者還沒有相關的經驗,沒準后續私有云會采用Docker進行部署。

后續,對于多個Container的交互,以及服務發現,擴容等,筆者也還需要好好研究,CoreOS沒準是一個方向,或者研究下rocket :-)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容