從開發到部署——docker淺體驗
聽說docker很diao?我們來調戲一下它吧~
到底什麼是docker呢?
如果github做的是程式碼管理的工作,那麼docker做的就是環境管理的工作。
Docker是一種虛擬化技術,下面是docker和虛擬機器的的差別(右邊是docker)
對比虛擬機器與Docker
“Docker守護程序可以直接與主作業系統進行通訊,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離,並將各個容器互相隔離。虛擬機器啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從作業系統,Docker可以節省大量的磁碟空間以及其他系統資源”(百度的)
好的好的,道理我都懂,但是他能幫我解決什麼問題呢?
使用前:每次拿到新的linux伺服器就是配置環境,安裝依賴,程式碼部署,就很煩!
使用後:不管什麼linux伺服器,sudo docker pull your-image搞定一切,一勞永逸!
哇那不就很棒棒啊?
接下來就是帶大家走一遍流程啦,教大家怎麼基於一個已有的lamp映象建立一個自己的映象並且釋出
前期準備:
1.作業系統:window 10
3.一個實驗專案(這邊用一個之前寫的辣雞mvc)https://github.com/kingkun233/KinPHP
4.一個ubuntu虛擬機器(用作伺服器)
開始之前要講三樣東西
1.映象
2.容器
3.倉庫
這三樣是我們在使用容器是最常接觸到的東東;
上面這張圖是三者之間的關係,看不懂不要緊,打個比方,用面向物件來理解的話,映象就是類,容器就是物件,倉庫就類似於github,這裡是dockerhub。這樣應該好理解很多吧!通過下面的實踐相信會加深你們的理解。
第一步:
在docker官網註冊帳號
第二步:
下載docker並且安裝
安裝成功後會有這兩個圖示
開啟下面那個出現下圖就說明安裝成功了
第三步:
拉取別人已經做好的lamp環境,這裡推薦tutum做的lamp映象
檢視你本地有哪些映象
第五步:根據映象建立容器
檢視正在執行的容器
第六步:在瀏覽器測試
在終端的開始的地方會有ip地址(這個針對window開發用的,ubuntu的話就直接回環測試)
如果出現如下介面說明容器正常執行啦~~
唉?怎麼把專案程式碼放到容器裡面啊?其實也很簡單
在建立容器的時候加上 -v /c/Users/Kingkun/project/KinPHP:/app/KinPHP,其中冒號前面的是本地地址,後者是容器裡面的地址,這樣就把原生代碼目錄和容器目錄掛載在一起了。(注意,在window下只能掛c盤不能掛d盤)
掛載之後我們來測試一下
唉?有個sql報錯?原來是容器裡的mysql剛剛新鮮出爐,還沒有密碼。
第七步:進入容器給mysql設定密碼
用exec命令就可以調出終端啦~
Tutum/lamp映象的linux用的是ubuntu14.04,但是已經把使用者預設設為root了,所以命令都不用加sudo了~
預設mysql的root賬戶的不用密碼登入的
進入mysql:
修改mysql的root密碼
這樣就修改好了
下面是我專案的資料庫連線設定
再來看看
提示沒有kinPHP資料庫,說明已經連線上了,只是現在的mysql so fresh,沒有資料庫,好我們就給他加一個
再看
successed
第八步:安裝phpmyadmin
常規的apt-get update走一下
apt-get install phpmyadmin
ln -s /usr/shared/phpmyadmin /var/www/html(軟連線去網站根目錄)
看一下
successed
第九步:釋出映象(包含phpmyadmin的映象)
先登入docker賬戶
根據容器構建映象
看到commit是不是想到什麼啊
沒錯,和github非常像
然後釋出到dockerhub倉庫
在dockerhub上面看看
successed
第10步:在服務端拉取自己的映象進行測試
這裡用虛擬機器做伺服器
檢視ip地址
Ubuntu上安裝docker也是很簡單,apt-get update&&apt-get install docker.io
首先拉取我們已經做好的映象
然後把github上的專案拉下來
根據映象建立容器並且和clone下來的專案目錄進行掛載
用本地瀏覽器測試
phpmyadmin也有了,這是在tutum/lamp沒有的,也就是說我們配置的環境上傳成功了
再來看看專案KinPHP是否能執行
黑人問號.jpg?發現我們mysql的root是沒有密碼的,可是我們剛剛不是在本地已經配置了嗎?百度到的答案如下
還是舉個面向物件的例子,文章上面說過,映象就像是一個類,你可以為這個類新增一屬性(例如phpmyadmin),但是這個屬性的值是不會新增到類裡面的!由於伺服器端的容器是一個“新的物件”,所以mysql現在是全新的,我們設定root密碼和新增資料庫的操作都沒掉了(個人理解,歡迎指正)。那有沒有解決的方法呢?問題總是能解決的。
方法一:再次設定密碼和新增資料庫;
方法二:如上面回答,與本地目錄進行掛載;
方法三:寫shell(這個的話感興趣的可以去看一下dockerfile,是除了commit之外另外一種非常靈活的構建映象的方法,這裡就不細說);
我用的是第一種方法,因為懶。。。
好的,當我再次配置好了mysql密碼和建立好資料庫之後再看看
這樣我們就走了一遍用docker從本地開發到遠端部署的過程了
思考:我們是不是真的需要docker?
Docker真的能提高我們的工作效率嗎?我覺得要看情況,如果是一個小專案的話,用docker的必要並不大,畢竟學習成本就放在這裡;不過如果是大型專案(以後會不斷擴充套件功能和強調效能),docker就很棒棒了。至於更加深入的東西就要你們自己探索啦,畢竟我看了兩三天而已,溜了溜了