文章目錄
docker
指令圖表
背景
- 我們可能經常會 從
GitHub
上clone
或pull
別人的項目,然後在自己的設備上運行,期間比較痛苦的一個操作就是需要 配置其環境、安裝各種包。 - 之前就有聽說過
Docker
,也被其build once, configure once and run anywhere
跨平臺的口號所驚歎 - 最近所接觸的一個項目的部署需要用到
Docker
,正好趁此機會學習一下。 - 項目用到的數據庫是
neo4j
,本文不會設計Django + Nginx + uWSGI
的部署,而只是涉及Docker
對Django
項目的封裝 - 我之前簡單記錄過
Django + Nginx + uWSGI + mysql
的實戰部署,詳情移至Here - 本篇只對用到的
docker指令
進行介紹,其餘未用到的docker指令
不多做介紹。(我是個Novice -_-#)
思路
base image
爲python3.6
- 然後在
base image
中安裝neo4j
(需先安裝jdk
,因爲neo4j
是基於JDK的) - 再安裝
Django2.0+
,安裝django
項目中用到的module
,->pip install requirements.txt
- 調試成功之後,
push
到阿里雲私有倉庫。(也可以用DockerHub
)
- 然後在
一般流程
- 參考Here
本項目流程
注意
我嘗試了 用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
目錄中,下面安裝需要的工具 - 提前在宿主機中下載好
jdk8
和neo4j3.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
一下 - 查看
jdk
和neo4j
是否安裝成功
啓動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
- 由於這裏我們只用到了
neo4j
和django
我直接安裝了
- 啓動項目
若報錯: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
項目
- 調試成功,下面停掉
django
和neo4j
,docker commit
到阿里雲
將容器 docker commit
爲新的鏡像,並上傳至阿里雲私有倉庫
- 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
錯誤
- 參考Here
Reference
https://www.jianshu.com/p/b3a978d4f77f
https://zhuanlan.zhihu.com/p/65938559