知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
實(shí)踐在windows下用docker進(jìn)行web開發(fā)
發(fā)表時(shí)間:2015-5-20
發(fā)布人:葵宇科技
瀏覽次數(shù):58
關(guān)于如何在windows下安裝docker,詳見http://blog.csdn.net/ownfire/article/details/45847939
本文著重闡述如何將docker實(shí)用起來(lái)
大家在協(xié)同開發(fā)過(guò)程中,通常會(huì)遇到各人開發(fā)環(huán)境不同,導(dǎo)致本地部署開發(fā)環(huán)境浪費(fèi)時(shí)間、擴(kuò)展庫(kù)有差異、甚至系統(tǒng)不同等問(wèn)題,docker就是為了解決這些問(wèn)題、快速開發(fā)環(huán)境、讓開發(fā)人員迅速進(jìn)入開發(fā)狀態(tài)而生的
Docker是一個(gè)基于Go語(yǔ)言的開源應(yīng)用容器引擎,可以自動(dòng)化地部署應(yīng)用到可移植的的容器中,這些容器獨(dú)立于硬件、語(yǔ)言、框架、打包系統(tǒng)。
一個(gè)標(biāo)準(zhǔn)的Docker容器包含一個(gè)軟件組件及其所有的依賴——二進(jìn)制文件,庫(kù),配置文件,腳本等等。
Docker擴(kuò)展了LXC(Linux Container),使用高層的API,提供輕量虛擬化解決方案來(lái)實(shí)現(xiàn)進(jìn)程間隔離??梢赃\(yùn)行在任何支持cgroups(control groups)跟AUFS的64位Linux內(nèi)核上。
LXC是docker的核心技術(shù),借助于namespace的隔離機(jī)制和cgroup限額功能,提供了一套統(tǒng)一的API和工具來(lái)建立和管理container。(類Hypervisor)
Linux Namespace (ns)
Control Groups (cgroups)
LXC 旨在提供一個(gè)共享kernel的OS級(jí)虛擬化方法,在執(zhí)行時(shí)不用重復(fù)加載kernel, 且container的kernel與host共享,因此可以大大加快container的啟動(dòng)過(guò)程,并顯著減少內(nèi)存消耗。
在LXC的基礎(chǔ)上, Docker額外提供的Feature包括
1、標(biāo)準(zhǔn)統(tǒng)一的打包部署運(yùn)行方案
2、歷史版本控制
3、Image的重用
4、Image共享發(fā)布等。
下面是本文重點(diǎn),安裝好docker后如何快速進(jìn)入開發(fā)狀態(tài),僅針對(duì)web開發(fā):
開始講述之前,要再次認(rèn)識(shí)到docker只是一個(gè)在虛擬機(jī)中運(yùn)行的系統(tǒng)底層,是連接上層宿主windows和下層開發(fā)環(huán)境容器,container(即開發(fā)環(huán)境容器)類似于子系統(tǒng),是在docker虛擬機(jī)中像應(yīng)用程序一樣運(yùn)行的隔離環(huán)境,和宿主系統(tǒng)的一切交互都要通過(guò)處于中間層的docker,并且默認(rèn)都是關(guān)閉的,可以理解為好多個(gè)沙盒
web開發(fā)涉及到web服務(wù)器和項(xiàng)目代碼和數(shù)據(jù)庫(kù),我們一項(xiàng)一項(xiàng)來(lái)解決
本文假定docker虛擬機(jī)啟動(dòng)后的綁定ip為192.168.59.103
1、web服務(wù)器
一、安裝nginx并設(shè)置端口映射
一開始docker安裝好并且啟動(dòng)container后,container內(nèi)的服務(wù)端口(例如nginx啟動(dòng)后監(jiān)聽的80端口)是不對(duì)外暴露的,在宿主windows下用瀏覽器訪問(wèn)docker虛擬機(jī)ip是訪問(wèn)不到container內(nèi)的80端口的
必須做端口映射操作,只要在container啟動(dòng)時(shí),docker run命令帶上端口映射參數(shù)就可以了:
docker run -it -p 22222:33333 fe65a2781dae /bin/bash
解釋:
-it參數(shù)在啟動(dòng)container為tty形式時(shí)必帶,否則無(wú)法做命令行交互
-p 22222:33333 關(guān)鍵參數(shù),指定docker虛擬機(jī)的22222端口,映射為container的33333端口,即對(duì)192.168.59.103:22222的訪問(wèn),統(tǒng)統(tǒng)訪問(wèn)到container的33333端口。如果要映射80端口,設(shè)置-p 80:80就好
fe65a2781dae 指定docker要運(yùn)行的imageid,也可以是REPOSITORY:TAG形式
/bin/bash docker啟動(dòng)container后要運(yùn)行的命令,一般啟動(dòng)命令行交互就用這個(gè)就好了
所以要把nginx調(diào)通,要做以下步驟:
1、docker run -it -p 80:80 fe65a2781dae /bin/bash
2、container內(nèi)運(yùn)行nginx
3、宿主windows瀏覽器訪問(wèn)192.168.59.103
4、Welcome to nginx!
二、配置nginx在容器啟動(dòng)時(shí)自動(dòng)啟動(dòng)
最簡(jiǎn)單的方法:
vi /etc/bashrc
添加一行類似
/usr/sbin/nginx -c /etc/nginx/nginx.conf
保存并推出
docker commit 保存容器修改,下次再啟動(dòng)容器時(shí),自動(dòng)就把nginx啟動(dòng)起來(lái)了,要添加其他自啟動(dòng)程序同樣操作
docker commit 如何使用,不在本文范圍,請(qǐng)自行百度
其他還有通過(guò)Dockerfile的方法,還有一種通過(guò)linux進(jìn)程管理工具supervisor的方法,詳見:
http://segmentfault.com/a/1190000000755980
上文關(guān)于supervisor的部分,轉(zhuǎn)載了另一篇文章,在此也直接把鏈接列出來(lái)方便查看:
http://air.googol.im/2014/03/28/supervisor-with-docker-to-manage-processes.html
2、項(xiàng)目代碼
docker只是一個(gè)開發(fā)環(huán)境的容器,一般不用來(lái)做代碼持久化的容器,如果這樣做,很容易丟代碼,因?yàn)閐ocker并不主動(dòng)保存在container內(nèi)的修改除非你手動(dòng)操作
最好的解決辦法就是,有一個(gè)共享文件夾,從宿主windows共享至container內(nèi),作為項(xiàng)目代碼根目錄
過(guò)程大致如下:
一、建立virtualbox和docker虛擬機(jī)的共享
可以參考http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html
打開virtualbox并且選擇到boot2docker-vm虛擬機(jī),右鍵點(diǎn)設(shè)置
-
點(diǎn)擊共享文件夾設(shè)置框,右上角的添加按鈕
-
選擇之前本機(jī)設(shè)置的共享文件夾,此時(shí)一定不可以勾選自動(dòng)掛載
-
設(shè)置好共享名后,進(jìn)入docker虛擬機(jī)系統(tǒng),打開終端,先執(zhí)行命令,在掛載點(diǎn)目錄添加“bdshare”目錄,接著執(zhí)行"mount -t vboxsf BaiduShare /mnt/bdshare/",就能完成共享文件夾的設(shè)置。請(qǐng)記住mount命令一定要帶上參數(shù)-t vboxsf,BaiduShare就是共享文件夾名稱,/mnt/bdshare/就是要在docker虛擬機(jī)中掛載的絕對(duì)路徑
-
docker虛擬機(jī)系統(tǒng)默認(rèn)使用docker用戶,可能會(huì)遇到Permission denied錯(cuò)誤,即權(quán)限不足,需要切換到root賬戶操作,只要輸入“sudo su”命令即可,無(wú)需密碼
二、docker容器掛載docker虛擬機(jī)的目錄
可以參考http://my.oschina.net/piorcn/blog/324202
docker可以支持把一個(gè)宿主機(jī)上的目錄掛載到鏡像里。
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
通過(guò)-v參數(shù),冒號(hào)前為宿主機(jī)目錄,必須為絕對(duì)路徑,冒號(hào)后為鏡像內(nèi)掛載的路徑。
現(xiàn)在鏡像內(nèi)就可以共享宿主機(jī)里的文件了。
此處要掛載上一步virtualbox和docker虛擬機(jī)共享的文件夾,就在docker啟動(dòng)container時(shí)加上參數(shù):
-v /mnt/bdshare/:/data
命令類似:
docker run -it -p 80:80 -v /mnt/bdshare/:/bdshare fe65a2781dae /bin/bash
這樣就把宿主windows的K:\BaiduShare目錄,掛載到了container的/bdshare目錄
3、數(shù)據(jù)庫(kù)
同樣因?yàn)閐ocker只是一個(gè)容器,不具備主動(dòng)持久化的原因,所有會(huì)記錄狀態(tài)的數(shù)據(jù)(例如數(shù)據(jù)庫(kù))都無(wú)法被保存下來(lái)
解決的方法還是通過(guò)使用掛載的共享目錄,將所有需要持久化的數(shù)據(jù)保存目錄都放在共享目錄中即可,下次container啟動(dòng)的時(shí)候掛載上共享目錄,數(shù)據(jù)保持原樣
4、docker虛擬機(jī)和container的持久化
我們可能想對(duì)docker虛擬機(jī)本身做些配置,以便在虛擬機(jī)啟動(dòng)時(shí)自動(dòng)啟動(dòng)一些程序,比如自動(dòng)掛載共享目錄,正常的linux系統(tǒng)只要往/etc/fstab文件或者/etc/rc.local文件里寫執(zhí)行語(yǔ)句,系統(tǒng)啟動(dòng)時(shí)就會(huì)自動(dòng)執(zhí)行
但是往docker虛擬機(jī)的自啟動(dòng)文件里寫語(yǔ)句的話,下次啟動(dòng)就不見了,這是為什么呢,是因?yàn)?#xff1a;
docker虛擬機(jī)里面跑的是TinyCoreLinux,這個(gè)OS的rootfs是臨時(shí)性的(放在內(nèi)存的,實(shí)際上就是boot2docker.iso文件里面的一個(gè)rootfs),因此其根目錄/下的東西(包括/home)根本不會(huì)持久化,只有/mnt/sda1這個(gè)目錄下的才能持久化。如果你放在/home目錄下,只要VM一重啟,就會(huì)丟失的,/mnt/sda1則不會(huì),實(shí)際上就是那個(gè)~/.boot2docker-vm.vmdk文件掛載到了/mnt/sda1目錄下
docker里跑的container只是docker系統(tǒng)底層的上層隔離沙盒,container里持久化的一切內(nèi)容,最終都持久化到docker虛擬機(jī)里
這樣方法就清楚了,沒辦法針對(duì)docker虛擬機(jī)做自啟動(dòng)配置,但是可以寫好自啟動(dòng)的sh腳本,放在/mnt/sda1這個(gè)目錄下,下次啟動(dòng)虛擬機(jī)時(shí),手動(dòng)切換到這個(gè)目錄下運(yùn)行sh腳本。目前沒有找到更好的方法, 如果有更好的方法,歡迎告訴我謝謝
而container的持久化,除了掛載宿主windows的共享目錄外,還有就是映射的目錄設(shè)置到虛擬機(jī)的/mnt/sda1目錄下,這兩種方法一個(gè)是持久化到宿主系統(tǒng)中,一個(gè)是持久化到虛擬機(jī)的虛擬磁盤中。兩種方法都可以,就看自己選擇了
舉例,我的/mnt/sda1/的sh腳本內(nèi)容是:
sudo mount -t vboxsf sync /mnt/sync/ #掛載宿主windows的共享目錄
docker run -it -p 80:80 -v /mnt/sync:/sync -v /mnt/sda1/data:/data centos:centos6 /bin/bash #映射共享目錄,和虛擬機(jī)磁盤
相關(guān)案例查看更多
相關(guān)閱讀
- 英文網(wǎng)站建設(shè)公司
- 國(guó)內(nèi)知名網(wǎng)站建設(shè)公司排名
- 云南建站公司
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 網(wǎng)站制作
- 云南小程序開發(fā)費(fèi)用
- 安家微信小程序
- 云南小程序被騙
- 網(wǎng)站建設(shè)特性
- 云南小程序開發(fā)推薦
- 網(wǎng)頁(yè)制作
- 報(bào)廢車拆解軟件
- 北京小程序開發(fā)
- 汽車回收管理
- 軟件定制
- 報(bào)廢車
- 云南網(wǎng)站優(yōu)化公司
- 云南網(wǎng)站建設(shè)專業(yè)品牌
- 關(guān)鍵詞快速排名
- 云南網(wǎng)站建設(shè)案例
- 網(wǎng)站排名優(yōu)化
- 網(wǎng)站建設(shè)方法
- 昆明小程序公司
- 云南省城鄉(xiāng)建設(shè)廳網(wǎng)站
- Web開發(fā)框架
- 專業(yè)網(wǎng)站建設(shè)公司
- 小程序開發(fā)排名前十名
- 商標(biāo)
- 云南小程序開發(fā)公司
- 網(wǎng)站建設(shè)首選