文章目录
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