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

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