環境:centos7
##docker的安裝以及一些設定
-
安裝docker
yum install docker
-
啟動docker服務
systemctl start docker.service
-
設定開機啟動
systemctl enable docker.service
pull下nodejs映象,說是docker hub 慢,就找到了一個國內的映象去下載
docker pull hub.c.163.com/nce2/nodejs:0.12.2
-
檢視映象
docker images
-
建立node應用
-
在工作目錄下建立
package.json
檔案vi package.json
寫入內容 -
建立
server.js
,也就是我們node應用的主檔案vi server.js
寫點內容 -
建立Dockerfile檔案
-
在專案程式碼更目錄建立
Dockerfile
檔案vi Dockerfile
下面簡單解釋下Dockerfile檔案
FROM hub.c.163.com/nce2/nodejs:0.12.2
複製程式碼
FROM是構建映象的基礎映象源,後面的一串是我們剛才pull下來的那個Image,如果本地沒有Docker,會自己pull映象的。
RUN mkdir -p /home/Service
WORKDIR /home/Service
複製程式碼
第一句RUN用於在Image裡建立一個資料夾,將會用於儲存我們的程式碼。 第二句WORKDIR是將我們建立的資料夾作為工作目錄。
# Bundle app Source
COPY . /home/Service
RUN npm install
複製程式碼
第一句的COPY是把本機當前目錄下的所有檔案拷貝到Image的 /home/Service
目錄下。
第二句的RUN是用npm 安裝我們的node應用中的所有依賴包。
EXPOSE 8888
複製程式碼
我們的node應用監聽的是8888埠,我們可以把這個埠暴露給主機。這樣我們就可以從外網訪問我們的應用了。
CMD ["npm" , "start"]
複製程式碼
用來啟動我們的node應用。
##構建Image
在我們的Dockerfile所在的目錄下執行構建命令
docker build -t mynodeapp .
別忘了最後那個點,不久我們會看到成功構建的資訊。
然後我們去檢視一下我們構建的映象
docker images
##執行構建的Image
docker run -d -p 8888:8888 50550c
-d
表示容器會在後臺執行,-p
表示埠對映,把本機的8888埠對映到container
的8888埠,這樣外網就可以通過本機訪問我們的應用,
後面的50550c是我們Image的ID,沒寫後面的是因為根據這幾個就能定位出來了。
竟然報錯了,也不能訪問8888埠。想了一下,應該是映象的問題。 就跑去dochub找了官方映象,修改Dockerfile裡的基礎映象
FROM node:4-onbuild
複製程式碼
然後再次構建我們的應用
docker build -t nodeapp .
然後開始從官網下載映象,確實特別慢..等了好久才下載完1個。貌似需要下載9個檔案.. 在漫長的等待過程中。。。
算了,放棄。。找找國內映象試試吧~~
然後去daocloud
註冊了帳號,在這拉映象吧
很快,映象pull
下來了。然後檢視下現在的映象。
現在我們去改下Dockerfile
的基礎映象吧。
FROM daocloud.io/library/node
複製程式碼
現在我們再來構建下映象試試
docker build -t nodeapp .
看到了構建成功的資訊,接著檢視一下imges
然後啟動:
docker run -d -p 8888:8888 7b784
果然出現了問題... 啟動不成功,最後才知道,映象和Dockerfile
都是一一對應的,不對應就可能會出現上面的所有問題。(切記)
最近還是選擇了官網的映象,等待了40分鐘左右,全部pull
下來了,開始幹活~~
- 修改
Dockerfile
檔案如下:
FROM node:4-onbuild
# replace this with your application's default port
EXPOSE 8888
複製程式碼
-
重新構建:
docker build -t my-node-apps .
-
啟動docker映象:
docker run -d -p 8888:8888 8b
-
然後檢視下container
docker ps
然後用瀏覽器訪問下8888埠,能成功訪問到我們的應用了。
完美!!!!!!!!!這次終於成功了~
然後去刪除沒用的images
和container
...
若要刪除所有的image, 使用命令:docker rmi $( docker images -q )
刪除container docker rm id
##總結
因為映象的事情走了不少彎路,浪費了很多的時間,所以最好還是去官網下需要的東西,然後看官方給的文件,英文的也要盡力去看。
今後還要去做學習一些images
的管理,container
的管理,以及應用日誌處理相關的東西。
本文於2017-04-03釋出在 麥曉傑的新浪部落格
參考: