經過 Docker 部署 nodejs -- egg 項目

經常使用的 docker 命令

  • 安裝 docker 環境
  • docker --help 查看 docker 命令提示
  • docker ps -a 查看全部運行的容器
  • docker images 查看全部的
  • 配置 Dockerfile 文件
  • 查看容器運行日誌:docker logs -f [containerId]

Docker 打包 egg 鏡像
  • 在項目根目錄新建 Dockerfile 文件,編輯內容以下
# 設置基礎鏡像,若是本地沒有該鏡像,會從Docker.io服務器pull鏡像
FROM node:10.13.0

# 配置環境變量
ENV NODE_ENV production

# 這個是容器中的文件目錄
RUN mkdir -p /usr/src/app 
# 設置工做目錄
WORKDIR /usr/src/app 
# 拷貝package.json文件到工做目錄
# !!重要:package.json須要單獨添加。
# Docker在構建鏡像的時候,是一層一層構建的,僅當這一層有變化時,從新構建對應的層。
# 若是package.json和源代碼一塊兒添加到鏡像,則每次修改源碼都須要從新安裝npm模塊,這樣木有必要。
# 因此,正確的順序是: 添加package.json;安裝npm模塊;添加源代碼。
COPY package.json /usr/src/app/package.json 
# 安裝npm依賴(使用淘寶的鏡像源)
# 若是使用的境外服務器,無需使用淘寶的鏡像源,即改成`RUN npm i`。
RUN npm i --production --registry=https://registry.npm.taobao.org 
# 拷貝全部源代碼到工做目
COPY . /usr/src/app 
# 暴露容器端口
EXPOSE 9000

CMD npm start 
複製代碼
  • 在 egg 項目的 package.json 文件中,在 start 啓動項中,--daemon 是後臺啓動。若是使用 docker 容器,須要去除 --daemon .
  • 進入項目根目錄,執行鏡像打包命令: docker build -t image_name ./
  • 打包完成之後執行容器啓動命令: docker run -itd --net=host --name container_name -p 8000:8000 image_name
  • -t 這個參數很重要,它表明不會進入到容器內部去執行命令,若是去掉它,會在容器內部執行啓動 Dockerfile CMD 中的命令。
  • 執行完畢後,能夠經過 docker ps 命令去查看,會顯示正在運行的容器,若是發現容器沒有正常啓動,能夠執行 docker logs -f containerID 命令,查看容器內的執行日誌。

可能出現的問題


  1. 容器沒法正常啓動:出現這種狀況,首先檢查你的容器打包命令是否正確,docker ps -a 命令查看你打包的全部容器. 容器打包命令中的 -itd 中的 -d 至關於在容器內部執行了 Dockerfile 文件中的 CMD 命令,咱們知道在 nodejs 中執行命令後控制檯會有日誌輸出,能夠經過 docker logs -f containerID 檢查日誌輸出。
  2. 容器正常啓動,可是容器中的程序沒法正常鏈接本地宿主機中的數據庫等本地服務,首先要搞清楚服務端口號,在容器運行命令中加上對應的端口映射,好比 docker run -itd --net=host --name container_name -p 8000:8000 -p 9999:9999 image_name . --net=host 參數很是重要,這告訴容器和宿主機共享網絡。這個時候,在容器內部能夠經過你映射的端口號去正常訪問本地服務。
  3. 若是前面兩個步驟執行完之後,仍是沒法正常啓動和訪問服務,建議去 egg.js github 倉庫中去查詢相關問題的解決方案 egg.js issue
相關文章
相關標籤/搜索