Docker封裝 Django2.0項目 & 數據庫爲Neo4j

docker指令圖表

在這裏插入圖片描述

背景

  • 我們可能經常會 從 GitHubclonepull 別人的項目,然後在自己的設備上運行,期間比較痛苦的一個操作就是需要 配置其環境、安裝各種包。
  • 之前就有聽說過Docker,也被其build once, configure once and run anywhere跨平臺的口號所驚歎
  • 最近所接觸的一個項目的部署需要用到Docker,正好趁此機會學習一下。
  • 項目用到的數據庫是neo4j,本文不會設計 Django + Nginx + uWSGI的部署,而只是涉及DockerDjango項目的封裝
  • 我之前簡單記錄過 Django + Nginx + uWSGI + mysql的實戰部署,詳情移至Here
  • 本篇只對用到的docker指令進行介紹,其餘未用到的docker指令不多做介紹。(我是個Novice -_-#)

思路

  • base imagepython3.6
    • 然後在 base image 中安裝 neo4j (需先安裝jdk,因爲neo4j 是基於JDK的)
    • 再安裝 Django2.0+ ,安裝django項目中用到的module,-> pip install requirements.txt
    • 調試成功之後,push 到阿里雲私有倉庫。(也可以用 DockerHub
      在這裏插入圖片描述

一般流程

本項目流程

在這裏插入圖片描述

注意
我嘗試了 用 neo4j3.4 作爲 base image,但是發現在數據庫遷移的時候,雖說可以遷移成功,但是最後 container進行 commit 時,(也是可以 commit 成功的)總是會丟失數據庫中的信息。查了很多資料,依舊未找到解決此問題的辦法。大致看了下neo4j的文檔,也沒搞明白… 索性換別的思路。(若有大佬知道怎麼解決此問題,歡迎批評指正!)

最初的思路是用 centOS 作爲 base image,但是後面思考了一下,如果這樣的話, 用到的所有工具都要安裝。。。索性也作罷。

  • 下面貼一張 logo,現在越看 這隻背上裝有集裝箱的小鯨魚,就越覺的貼切!!!
    在這裏插入圖片描述

實操

  • 這裏略去docker安裝步驟

1. docker 拉取 python3.6鏡像

docker search python:3.6  # 查詢python:3.6鏡像 -- 冒號後面是版本號

對應參數:

  • - - no-trunc
  • - - s 66 列出star數不小於66個的鏡像
  • - - automated 只列出automated build的鏡像
    在這裏插入圖片描述
docker pull python:3.6

在這裏插入圖片描述
在這裏插入圖片描述

進到容器中

docker run -it python:3.6 /bin/bash
  • -it 以交互模式運行容器,併爲容器重新分配一個僞輸入終端
    在這裏插入圖片描述
  • 項目放到home目錄中,下面安裝需要的工具
  • 提前在宿主機中下載好jdk8neo4j3.5
    在這裏插入圖片描述
  • docker cp 拷貝到容器中
docker cp 宿主機路徑 容器id:容器內路徑

在這裏插入圖片描述

  • 解壓縮
tar -zxvf neo4j-community-3.5.12-unix.tar.gz

在這裏插入圖片描述

配置環境變量

  • 先安裝 vim -_-#
  • cat /etc/issue 發現python:3.6 鏡像是基於 Debian 系統的
    在這裏插入圖片描述
  • 先更新一下 apt-get
apt-get update
apt-get upgrade
    • 最後再apt-get install vim即可
      在這裏插入圖片描述
  • 編輯 etc/profile 下的文件,添加如下幾行
export JAVA_HOME=/home/jdk1.8.0_231
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

export NEO4J_HOME=/home/neo4j-community-3.5.12
export PATH=$PATH:$NEO4J_HOME/bin

在這裏插入圖片描述

  • 然後 source /etc/profile 一下
  • 查看 jdkneo4j 是否安裝成功
    在這裏插入圖片描述

啓動neo4j服務

在這裏插入圖片描述

  • 然後在本地輸入 ip+端口 發現無法訪問, 是因爲需要配置conf文件,允許遠程訪問
    在這裏插入圖片描述
  • 配置文件路徑
    在這裏插入圖片描述
  • 取消註釋這兩行代碼

第一行寫着呢 To accept non-local connextions…

在這裏插入圖片描述

  • 然後修改密碼。(這裏保險起見,將密碼修改成Django項目裏面,neo4j驅動訪問neo4j數據庫時的密碼),即設置和之前密碼一樣
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 數據庫爲空
    在這裏插入圖片描述

下面執行數據遷移 (將宿主機中的neo4j數據遷移到該容器中)

  • Neo4j數據進行備份、還原、遷移的操作時,首先要關閉neo4j
  • 導出代碼,後面是導出的數據存放的路徑
neo4j-admin  dump --database=graph.db --to=/home/robot/Neoj_data/graph.db.dump
  • dump 文件cp到容器中
    在這裏插入圖片描述
  • 執行數據導入命令 --froce 強制執行,會覆蓋之前的graph.db
    在這裏插入圖片描述

Django項目 docker cp 到容器中

在這裏插入圖片描述

  • 安裝對應的庫 (這裏只安裝一次)一般是pip install requirements.txt
  • 由於這裏我們只用到了 neo4jdjango 我直接安裝了
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 啓動項目

若報錯:neobolt.exceptions.ServiceUnavailable: Failed to establish connection to (’::1’, 7687, 0, 0) (reason [Errno 101] Network is unreachable)
說明 neo4j數據庫沒有啓動服務
在這裏插入圖片描述

  • 這裏需要配置端口,纔可以遠程訪問

Docker容器動態添加端口

  • 參考Here
  • 也可以先 docker commit ,然後在 docker run 新鏡像裏面 加上 -p 參數來綁定端口
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 啓動 django 項目
    在這裏插入圖片描述
  • 調試成功,下面停掉 djangoneo4jdocker commit到阿里雲

將容器 docker commit 爲新的鏡像,並上傳至阿里雲私有倉庫

pull & run 部署

  • 上傳完成 如下圖
    在這裏插入圖片描述
sudo docker login --username=captain孟威 registry.cn-shanghai.aliyuncs.com

# 輸入密碼

sudo docker pull registry.cn-shanghai.aliyuncs.com/mengfuli/tutorial:1.0

docker run -it  -p 8000:8000 前綴/tutorial:1.0 /bin/bash

# 運行倉庫的時候,需要進到 /bin/bash 裏面啓動一下服務
1) source /etc/profile
2) neo4j start
# 2)執行完 需要等上幾秒,因爲neo4j服務啓動需要一些時間,然後再執行 3)
3)nohup python  home/Drug_KG/manage.py runserver 0.0.0.0:8000 >> kg_log.log 2>&1 &
# 第3)步設置成 項目在後臺運行

遇到的坑

若有容器佔用端口,再次申請該端口會報 bind: address already in use 錯誤

Reference

https://www.jianshu.com/p/b3a978d4f77f
https://zhuanlan.zhihu.com/p/65938559

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章