本文假设你已经安装好了Docker
与Python
的虚拟环境。
环境
-
Ubuntu Linux 17.04
-
Docker version 17.09.0-ce, build afdb6d4
-
Oracle Database 12.2.0.1 Enterprise Edition
-
Python 3.6.3
-
Django 1.11.6
-
djangorestframework 3.7.0
安装Oracle
借助于强力的Docker
,让我们安装Oracle
数据库变得更简单,而不是花很久的时间来安装数据库,让我们来体验一下Docker
的强大之处吧。
下载所需软件包
- Download the Oracle Docker build files.
Repo URL: https://github.com/oracle/docker-images
- Download
Oracle Database 12c Release 2
for Linux x86-64
Download URL:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
- 你现在应该有两个文件
~/Downloads$ ls -l 总用量 3379844 -rw-r--r-- 1 ansheng ansheng 7248413 10月 16 15:55 docker-images-master.zip -rw-r--r-- 1 ansheng ansheng 3453696911 10月 15 16:22 linuxx64_12201_database.zip
准备工作
解压docker-images-master.zip
~/Downloads$ unzip docker-images-master.zip
拷贝linuxx64_12201_database.zip
文件到docker-images-master/OracleDatabase/dockerfiles/12.2.0.1
目录下,因为我们下载的是12.2.0.1
版本,所以需要拷贝到12.2.0.1
目录下。
~/Downloads$ cp linuxx64_12201_database.zip docker-images-master/OracleDatabase/dockerfiles/12.2.0.1/
构建Docker镜像
Oracle
为我们提供了快速构建镜像的脚本,我们只需要指定构建的版本即可,但请确保你的网络是流畅的,因为在构建的过程中会更新和安装一些软件包。
~/Downloads$ cd docker-images-master/OracleDatabase/dockerfiles/ ~/Downloads/docker-images-master/OracleDatabase/dockerfiles$ sudo ./buildDockerImage.sh -v 12.2.0.1 -e
然后就会开始构建镜像了,这个过程是漫长的,因为我用的是Ubuntu
,所以执行的时候需要加sudo
权限,脚本的参数-v
指定要构建的版本,-e
根据企业版
创建镜像。
更多的参数请访问:https://github.com/oracle/docker-images/tree/master/OracleDatabase#building-oracle-database-docker-install-images
当构建完毕之后我们通过sudo docker images
指令来查看构建好的镜像
~/Downloads/docker-images-master/OracleDatabase/dockerfiles$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE oracle/database 12.2.0.1-ee 7ace5bfa1100 About a minute ago 13.2GB oraclelinux 7-slim a6e9e9e5ddc1 2 weeks ago 118MB
上面的镜像中,oracle/database
就是根据oraclelinux
来构建的,构建出来的镜像还是挺大的
启动一个Oracle容器
执行以下指令启动容器
~/Downloads/docker-images-master/OracleDatabase/dockerfiles$ cd ~$ sudo docker run -d --name oracle -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ansheng -e ORACLE_PWD=ansheng.me oracle/database:12.2.0.1-ee affc07af4da51f03c67db1cb7266bd66aef442c71793a216ce2be4e5349b0cbd
启动参数解释如下:
上面的启动参数可以有更多,请参考https://github.com/oracle/docker-images/tree/master/OracleDatabase#building-oracle-database-docker-install-images
你还可以通过docker logs
来查看启动日志,启动过程有点慢...
~$ sudo docker logs -f oracle
容器启动完成之后可以测试连接
$ sudo docker exec oracle sqlplus sys/ansheng.me@//localhost:1521/ansheng as sysdba
你还可以执行以下执行来更改密码
~$ docker exec oracle ./setPassword.sh <Your Password>
容器内的Oracle数据库
还配置了Oracle Enterprise Manager Express
,要访问OEM Express
,请启动浏览器并按照以下URL:
<https://localhost:5500/em/>
配置Django项目
请先切换到虚拟环境在进行以下操作,我使用的是pyenv
~$ pyenv activate venv (venv) ~$
- 安装django与djangorestframework
(venv) ~$ pip install django djangorestframework
- 创建项目
(venv) ~$ django-admin startproject ansheng
- 创建app
(venv) ~$ cd ansheng/ (venv) ~/ansheng$ python manage.py startapp july
- july/models.py
from django.db import models # Create your models here. class Love(models.Model): name = models.CharField(max_length=12, null=True, blank=True, help_text='名称') username = models.CharField(max_length=32, help_text='用户名') email = models.EmailField(help_text='邮箱')
- july/views.py
from .models import Account from rest_framework import serializers, viewsets # Create your serializers here. class AccountSerializer(serializers.ModelSerializer): class Meta: model = Account fields = '__all__' # Create your views here. class AccountViewSet(viewsets.ModelViewSet): queryset = Account.objects.all() serializer_class = AccountSerializer
- ansheng/urls.py
from django.conf.urls import url, include from rest_framework.routers import DefaultRouter from july.views import AccountViewSet router = DefaultRouter() router.register('accounts', AccountViewSet, base_name='accounts') urlpatterns = [ url(r'^', include(router.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
- ansheng/settings.py
INSTALLED_APPS = [ ... 'rest_framework', 'july' ]
配置Oracle数据库
cx-Oracle
是django
连接oracle
的一个库
(venv) ~/ansheng$ pip3 install cx-Oracle
将ansheng/settings.py
中的DATABASES
替换为
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'ansheng', 'USER': 'system', 'PASSWORD': 'ansheng.me', 'HOST': '127.0.0.1', 'PORT': '1521', } }
要在Linux
上面连接Oracle
,你还需要安装客户端的一些lib,可以在http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html中下载,下载后的文件如下:
(venv) ~/ansheng$ cd ~/Downloads/ (venv) ~/Downloads$ ls -l -rw-r--r-- 1 ansheng ansheng 52826628 10月 16 17:06 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm -rw-r--r-- 1 ansheng ansheng 606864 10月 16 17:00 oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm -rw-r--r-- 1 ansheng ansheng 708104 10月 16 17:00 oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
因为我用的是Ubuntu
不能直接安装rpm
,所以需要借助alien
来把rpm
包转换为deb
包
# 安装alien (venv) ~/Downloads$ sudo apt-get install alien # 借助alien进行安装 (venv) ~/Downloads$ sudo alien -i oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm (venv) ~/Downloads$ sudo alien -i oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm (venv) ~/Downloads$ sudo alien -i oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm # 安装所需要的库 (venv) ~/Downloads$ sudo apt-get install libaio1
我们使用的Oracle是12.2版本的,所以一定要下载和Oracle一样的版本,不然是不能使用的
环境配置
(venv) ~/Downloads$ vim /etc/ld.so.conf ...... /usr/lib/oracle/12.2/client64/lib/
重新加载库文件
(venv) ~/Downloads$ sudo ldconfig
执行以下执行生成临时变量,这些配置都是针对当前窗口生效的,如果你想永久生效,可以加入用户的~/.bashrc
文件中
(venv) ~/Downloads$ export ORACLE_HOME=/usr/lib/oracle/12.2/client64 (venv) ~/Downloads$ export ORACLE_BASE=/usr/lib/oracle/12.2 (venv) ~/Downloads$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/lib (venv) ~/Downloads$ export PATH=$PATH:$ORACLE_HOME/bin
测试
进入项目目录,生成数据库表
(venv) ~/Downloads$ cd ~/ansheng/ (venv) ~/ansheng$ python manage.py migrate
生成july
表结构
(venv) ~/ansheng$ python manage.py makemigrations july (venv) ~/ansheng$ python manage.py migrate
启动项目
(venv) ~/ansheng$ python manage.py runserver
然后浏览器打开http://127.0.0.1:8000/accounts/
,进行增删改查试下呗