文章目录
- 前言
- 部署过程详解
- 使用docker-compose文件创建容器
- 临时开启NAS的SSH远程访问
- 通过SSH客户端远程连接NAS
- 进入容器创建用户
- 拷贝容器中的数据库相关文件至宿主机
- 在ContainerStation中修改docker-compose文件
- 总结
前言
ContainerStation本质上是对Docker可视化的一款软件,所以使用起来并不像直接敲docker指令那么灵活,而且软件自身也存在一些bug(比如进入容器使用vi指令编辑文件时,想按esc退出编辑模式,但是该输入却被当做失去焦点事件处理,导致编辑好的文件永远无法保存)。笔者通过这次部署Oracle11g,彻底弄清楚了ContainerStation和Docker之间的对应关系,从而能够随心所欲地部署任意软件。
网上关于Docker部署Oracle11g的文章很多,但受限于NAS平台,没法直接套用网上教程,需对教程理解之后再进行部署,这也是笔者写本文的原因。
部署过程详解
使用docker-compose文件创建容器
version: '3.1'
services:
oracle:
image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
container_name: oracle
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
- ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
- ORACLE_SID=helowin
ports:
- 1521:1521
注意:第一次创建时不能挂载数据卷,否则数据库无法启动!因为oracle启动后会创建数据库文件、日志文件、ctl控制文件等。如果直接挂载目录,目录为空,这些文件就不会创建,导致无法启动!所以千万不要画蛇添足地先把数据卷给挂载了!
临时开启NAS的SSH远程访问
笔者的NAS是威联通TS-564,系统版本为QTS5.0.1.2248,开启SSH的方法为:控制台——>网络和文件服务——>Telnet/SSH——>勾选允许SSH连接——>应用。
通过SSH客户端远程连接NAS
SSH客户端很多,笔者常用的是MobaXterm。需要强调一点,笔者是在局域网内通过SSH操作的NAS(不建议外网操作,因为外网操作需要暴露SSH连接所需的22号端口至公网,很容易被网上渗透攻击)。
在MobaXterm中输入NAS的ip,管理员账户的用户名和密码就能成功连接NAS了。
进入容器创建用户
docker exec -it oracle bash
cd /home/oracle/
source .bash_profile
sqlplus /nolog
SQL> conn /as sysdba
SQL> alter user system identified by system;
SQL> alter user sys identified by system;
SQL> create user bruce identified by yca1cahk;
SQL> grant connect,resource,dba to mike;
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
SQL> alter system set processes=2000 scope=spfile;
对于上述指令,我们进入容器后连接了数据库,创建了一个bruce用户并赋权,同时修改了system和sys用户的密码。到此时,我们已经可以通过Navicat等工具连接数据库了。注意SID是helowin
。
拷贝容器中的数据库相关文件至宿主机
笔者在NAS的/share
目录下创建了一个Software
文件夹,所有需要挂载数据卷的容器都使用该文件夹下的对应目录。针对oracle容器,我创建的目录信息为:/share/Software/oracle/oradata/helowin/
。
在SSH中执行拷贝操作(不需要进入容器):
docker cp oracle:/home/oracle/app/oracle/oradata/helowin/ /share/Software/oracle/oradata/helowin/
cd /share/Software/oracle/oradata
chown -R 500.500 helowin/ #把helowin目录所有者赋予 500,因为500是容器内oracle组合用户的 id
在ContainerStation中修改docker-compose文件
还记得上文说过,docker-compose文件中不要挂载数据卷了吧?现在已做好准备工作,可以挂载了。修改文件前,记得先把oracle容器给停了。文件内容修改如下:
version: '3.1'
services:
oracle:
image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
container_name: oracle
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
- ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
- ORACLE_SID=helowin
ports:
- 1521:1521
volumes:
- /share/Software/oracle/oradata/helowin/:/home/oracle/app/oracle/oradata/helowin/
修改之后启动容器,此时便已完成了Oracle11g的部署,同时将数据文件挂载到了宿主机上。
注意:为了安全,部署完成后可以禁用SSH的连接了!
总结
如果全程通过命令行按照Docker下部署Oracle的方式去操作是很容易的,但笔者担心这种方式创建的容器ContainerStation中无法正确加载(讲道理应该是可以加载的,没试过)。本文介绍了通过命令行和GUI操作相结合的方式来完成数据库的部署,稍微麻烦了点,但懂得原理的话应该没什么操作难度。
我猜ContainerStation设计的初衷就是想让不懂Docker的人能快速部署容器,所以操作起来很受限。尤其对于Oracle这种专用软件,ContainerStation提供的操作已经不够用了,必须得自己敲命令行才能搞定。