Docker實踐

前言

本文並不是一篇Docker的入門文章, 而是面向對Docker有必定了解的開發人員, 文章不會介紹如何安裝Docker, 以及什麼是Docker鏡像,什麼是Docker容器這些概念,若是須要了解請前往Docker官方文檔。這裏咱們只探討一下Docker在開發中的實踐,或者說咱們怎麼用Docker來幫助咱們在開發中受益。前端

背景

隨着NodeJS的發佈,前端便像嗑了藥似的瘋狂發展,各類概念,框架,插件層出不窮,致使前端小夥伴壓力很大(鄙人後端,前端不大專業,若有不當請包涵),別的不說,就一個前端開發環境的搭建可能就要花費很長時間,一個npm install執行半天,中途還有可能由於本機環境的緣由報各類摸不着頭腦的錯,並且node_modules文件夾異常龐大,win下刪都刪不掉,常常心生罵娘衝動。所以本文就實踐一下如何用Docker來幫咱們解決前端開發中遇到的這些問題,最後也會簡單分析下後端的Docker應用。node

項目

話很少說,咱們開始,直接上項目,碼代碼....
假如咱們有以下項目 dockerdemo:
目錄結構 package.jsonwebpack

很明顯這個項目依賴了不少插件(項目比較早,用的grunt,用gulp,webpack的小夥伴勿噴),若是是您的第一個項目的話你大概須要作如下步驟去搭建整個開發環境。web

  • 安裝node,須要跟團隊負責人肯定版本信息
  • 安裝grunt或者gulp
  • 安裝bower
  • 安裝express
  • 安裝sass或less,貌似要依賴ruby
  • 克隆源碼
  • 執行npm install
  • 執行bower install
  • ......

其間還要經歷各類等待,甚至出現不明不白的錯誤。下面咱們就一步步用Docker搭建咱們的前端開發環境docker

Dockerfile

分析一下不難發現,咱們須要的是一個安裝了node,npm的環境,若是咱們能有一個預裝好的系統那就最好不過了,幸運的是Docker剛好能知足咱們的這個需求,去DockerHub 搜一下就會發現官方提供了node的鏡像,並且各個版本包羅萬象,這樣事情就好辦了,開始寫Dockerfile構建咱們的鏡像。沒錯咱們的鏡像就是基於官方node鏡像。假如你本機的項目目錄位於/home/xiaoqiang/projects/dockerdemo,咱們在項目目錄下新建一個Dockerfile文件,並添加以下代碼:express

FROM node:4.4.7

RUN mkdir -p /home/project/dockerdemo

ADD . /home/project/dockerdemo  

WORKDIR /home/project/dockerdemo

VOLUME /home/project/dockerdemo

EXPOSE 9000 35729

RUN npm install -g grunt && npm install -g bower

CMD ["./grunt_release.sh"]

grunt_release.sh以下npm

#!/bin/sh

npm install
bower install --allow-root
grunt build

分析下上面文件的內容:json

  1. 第一行,表示咱們的鏡像給予官方node4.4.7版本鏡像
  2. 第二行,RUN指令表示在鏡像構建時執行後面的命令,這裏咱們在鏡像中建立項目目錄
  3. 第三行,ADD指令表示將宿主機中的文件添加到鏡像中去,這裏咱們將本機的項目目錄中的源碼內容一併添加到鏡像中去
  4. 第四行,WORKDIR指令表示將工做目錄切換到制定目錄下,至關於cd,這裏就是咱們的項目目錄
  5. 第五行,VOLUME指令表示爲鏡像添加一個卷,而卷具備以下特色:
    1. 卷能夠在多個容器中共享數據
    2. 對於卷的修改會當即響應到宿主機或者容器中
    3. 對於卷的修改不會被提交到鏡像中去
    4. ...
      這裏咱們指定項目目錄做爲卷,後面咱們在運行容器的時候會指定一個本機的文件夾做爲容器中卷在宿主機上存儲數據的地方。
  6. 第六行,EXPOSE指令表示所運行的容器會公開指定端口,一樣咱們在運行容器的時候會指定一個本機的端口映射到容器公開的端口上。
  7. 第七行,運行安裝grunt跟bower的命令,這樣當咱們在啓動容器的時候,就能夠直接使用他們了。
  8. 第八行,CMD指令是指定在容器啓動後默認執行的命令,該命令能夠被覆蓋。

好了,代碼分析完了,總之大致思路就是咱們把本機項目目錄映射到容器中去,而且在容器中公開能夠訪問網頁的端口,並在容器啓動是執行相應命令,如安裝插件,啓編譯,啓動server等。gulp

構建

Dockerfile寫完了下面就是基於該文件構建鏡像了,代碼很簡單:
build_docker.sh後端

#!/bin/sh
sudo docker build -t dockerdemo .

執行該命令等待完成後,咱們就能夠基於該鏡像運行咱們的容器了,或者說咱們的環境基本搭建完成了。

容器

運行容器的命令也很簡單,代碼以下: run_docker.sh

sudo docker run -it --rm --name dockerdemo -v /home/xiaoqiang/projects/dockerdemo:/home/project/dockerdemo -p 9000:9000 -p 35729:35729 dockerdemo
  1. --name指定容器的名字
  2. --rm指定在容器退出後自動刪除該容器
  3. -v表示用本機的指定文件夾映射到容器中的卷,這裏是爲了保證咱們的代碼能夠即時相應到容器中去。
  4. -p表示用本機指定端口映射到容器中的端口

這樣你就能夠享受編碼的愉快過程了,而不用頭疼環境的搭建了。

總結

你可能以爲還得寫這麼多命令多麼麻煩,若是這麼想說明你仍是沒有理解其中的道理。

  1. 這些命令只須要編寫一次,而不用每一個進入該項目的開發人員都去編寫,一般由項目搭建者寫好,其餘人只須要執行構建(build_docker.sh)跟運行(run_docker.sh)腳本就能夠了,其餘的都不須要關心。
  2. 整個環境的安裝中除非有網絡斷開的狀況,不然不會報錯,由於鏡像是官方的,不可能有問題,你必定會一次安裝成功。
  3. 咱們能夠把容器部署到測試環境中,生產環境中,這樣就能夠保證咱們這些環境中的運行環境是一致的,不會再說」我這裏是好的呀,你哪裏怎麼不行呢?必定是你的問題「,換句話說,咱們打包的是運行環境,這個是一致的。

最後

Docker技術還比較年輕,對於它的理解目前是仁者見仁,智者見智,很難說最佳實踐是什麼,這一套只是個人一些思考跟應用,可能有不少不合適不合理不正確的地方,還望指點,若是感受有用還望不吝點贊~~~

相關文章
相關標籤/搜索