因此,总结一下上面的描述 ,启动该oracle数据库镜像,执行的命令如下:
docker run -d --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
然后使用数据库管理软件连接,连接信息如下:
port: 1521 sid: xe username: system password: oracle
4. 初始化xip数据库用户
删除原容器
docker container ls docker rm $具体container的ID
使用以下命令重新启动:
docker run --name oracle -d -p 1521:1521 -it -v /Users/suitm/Persion/DockerFile/oracle_data:/u01/app/oracle/oradata/XE/datafile alexeiled/docker-oracle-xe-11g bash
其中 :
使用一下命令启动数据库
su - oracle sqlplus '/as sysdba' startup
创建表空间和操作目录
create tablespace spc_stdxip logging datafile '/u01/app/oracle/oradata/XE/datafile/spc_stdxip_01.dbf' size 5G autoextend on next 32m maxsize 20G extent management local; create directory stdxip AS '/u01/app/oracle/oradata/XE/datafile';
创建用户脚本如下:
sqlplus '/as sysdba' <<! create user $1 identified by $1 default tablespace spc_$2 account unlock; grant dba to $1; GRANT read, write ON DIRECTORY $2 TO $1; --GRANT CREATE VIEW TO $1; --GRANT SELECT ANY TEBLE TO $1; --GRANT SELECT ANY DICTIONARY TO $1; !
执行 sh ./user_create.sh stdxip
sh ./user_create.sh stdvdmp
sh ./user_create.sh stdmidl
修改UTF-8不校验字符长度
ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
否则导入不进去,会报错:
RA-02374: conversion error loading table "STDXIP"."XIP_XML2CONV" ORA-12899: value too large for column XIP_NODEDESC (actual: 57, maximum: 50) ORA-02372: data for row: XIP_NODEDESC : 0X'CCEED0B4D7B4CCACD0C5CFA2B5C44950202020202020202020'
然后执行impdp命令导入
这里使用的脚本
sh ./ora_impdp.sh stdxip stdxip stdxip spc_stdcop
脚本内容如下:
#!/bin/ksh #日志# is_prt() { #echo "[$0--------------------]$1" echo "$1" } #用法提示# useage() { is_prt "useage: $0 本地用户 原用户 所属银行(系统目录) 原表空间" is_prt " ps: dmp的文件名必须是'本地用户'.dmp, 存放位置必须在'/backup/所属银行 下面" is_prt " eg: $0 tlmidl midl tlbank USERS" } #误执行缓冲 wait_sure() { is_prt "导入用户$1,从原用户$2,表空间[spc_$3],从原表空间[$4]......" is_prt "倒计时3......" sleep 1 is_prt "倒计时2......" sleep 1 is_prt "倒计时1......" sleep 1 } if [ $# -ne 4 ] then useage; exit fi wait_sure $1 $2 $3 $4 #export ORACLE_SID=xipdb #is_prt "先新建用户$1" #sh /root/binsh/ora_user_create.sh $1 $3 is_prt "开始导入用户$1,从原用户$2,表空间[spc_$3],从原表空间[$4].,....." impdp $1/$1 dumpfile=$1.dmp directory=$3 REMAP_TABLESPACE=$4:spc_$3 REMAP_SCHEMA=$2:$1 logfile=$1.log if [ $? -ne 0 ] then exit; fi
启动监听
修改listener.ora(注意HOST不是127.0.0.1,而是docker内部分配的HOSTNAME)
vi /etc/hosts查看 hostname /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora 修改HOST = fc16312c37c4
listener.ora内容如下:
# listener.ora Network Configuration File: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = XE) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe) (SID_NAME = XE) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = fc16312c37c4)(PORT = 1521)) ) ) DEFAULT_SERVICE_LISTENER = (XE)
/etc/hosts文件内容如下,每个容器都不一样,需要查找一下:
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 fc16312c37c4
启动监听lsnrctl start
启动数据库
sqlplus '/as sysdba' startup
查看连接数据库是否正常
oracle@fc16312c37c4:~/product/11.2.0/xe/network/admin$ sqlplus stdxip/stdxip SQL*Plus: Release 11.2.0.2.0 Production on Tue Apr 3 08:27:59 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production SQL> select * from xip_sysdate; XIP_ID X XIP_DATE XIP_YDATE XIP_TDATE XIP_LTSYNCDT ---------- - ---------- ---------- ---------- -------------- HTC01 L 20151120 20151119 20151121 1 SQL>
配置dbvis连接工具,连接成功 :
docker_4.4.1.png
5. 创建stdxip用户使用的docker
5.1 搜索并下载centos
/Users/suitm>docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 4153 [OK] ansible/centos7-ansible Ansible on Centos7 105 [OK] jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x86_… 93 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 49 [OK] imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 40 [OK] tutum/centos Simple CentOS docker image with SSH access 36 gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glust… 25 [OK] centos/python-35-centos7 Platform for building and running Python 3.5… 19 kinogmt/centos-ssh CentOS with SSH 17 [OK] openshift/base-centos7 A Centos7 derived base image for Source-To-I… 17 centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational … 12 openshift/jenkins-2-centos7 A Centos7 based Jenkins v2.x image for use w… 10 openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6 darksheer/centos Base Centos Image -- Updated hourly 3 [OK] pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag names… 3 openshift/wildfly-101-centos7 A Centos7 based WildFly v10.1 image for use … 3 openshift/jenkins-1-centos7 DEPRECATED: A Centos7 based Jenkins v1.x ima… 3 blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] openshift/php-55-centos7 DEPRECATED: A Centos7 based PHP v5.5 image f… 1 openshift/wildfly-81-centos7 A Centos7 based WildFly v8.1 image for use w… 1 pivotaldata/centos Base centos, freshened up a little with a Do… 1 pivotaldata/centos-mingw Using the mingw toolchain to cross-compile t… 1 pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated wi… 0 jameseckersall/sonarr-centos Sonarr on CentOS 7 0 [OK] smartentry/centos centos with smartentry 0 [OK]
使用第一个官方镜像。
docker pull centos
5.2 运行容器,并配置基本环境
执行以下命令从镜像生成容器stdxip ,并mount本地文件夹/Users/suitm/Persion/DockerFile/xip为xip用户的初始文件夹。
docker run --name stdxip --mount type=bind,source=/Users/suitm/Persion/DockerFile/xip,target=/home/xip -it centos bash
新建用户:useradd xip -d/home/xip -p pass
安装基本软件:
yum install gcc yum install make yum install libaio
安装oracle11g的客户端
cd /home/xip/rpm rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-precomp-11.2.0.4.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
新建tnsnames.ora文件
cd /usr/lib/oracle/11.2/client64 mkdir -p network/admin touch tnsnames.ora vi tnsnames.ora 填写如下内容: # tnsnames.ora Network Configuration File: /opt/oracle10g/u01/network/admin/tnsnames.ora # Generated by Oracle configuration tools.111 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = stdxip) ) )
配置环境变量
export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export ORACLE_BASE=/usr/lib/oracle/11.2 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
配置zh_CN.gbk环境,locale -a 没有汉字字符集
yum -y install kde-l10n-Chinese localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
时区修改:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
基本环境处理:
打包并解压xip用户环境,配置。
5.3 启动服务,为运行中的container增加端口
方法1: 修改iptab规则(不推荐)
/Users/suitm>docker inspect `stdxip` | grep IPAddress -bash: stdxip: command not found "docker inspect" requires at least 1 argument. See 'docker inspect --help'. Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] [flags] Return low-level information on Docker objects /Users/suitm>docker inspect stdxip | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3", /Users/suitm>
修改iptab规则:(MACOS下做不到,该条不用)
iptables -t nat -A DOCKER -p tcp --dport 9999 -j DNAT --to-destination 172.17.0.3:9999
方法2 : docker commit
可以docker commit 当前容器,然后再docker run -p 端口:端口
因此使用 docker commit stdxip stdxip
然后执行
docker run --name stdvdmp -p 9999:9999 --mount type=bind,source=/Users/suitm/Persion/DockerFile/xip,target=/home/xip -it stdxip bash su - xip vdmp.sh
又研究了一下,把应用当成服务启动,应该是标准的docker用法,而不应该像之前的虚拟机方式,在一个容器中启动一堆应用。 因此应该把当前的stdxip保存好,然后写好启动脚本,启动vdmp的时候就启动stdvdmp容器,启动二代支付系统的时候,就启动cnaps2容器.
5.4 基本环境启动,连接调试,编译
编译会报错,找不到stropt.h,因此进入 touch /usr/include/stropts.h
由于precomp安装完的位置不太好,分别放在:
/usr/include/oracle/11.2/client64/sqlca.h
proc/usr/lib/oracle/11.2/client64/lib/precomp
一般我们的环境,都是放在
'$ORACLE_HOME/precomp' 下面,多了一个lib 头文件一般法放在precomp下面的public下面。
可以修改makefile的INCLUDE,但是为了保持各地环境的一致性,尤其和公司环境的一致性,把系统安装好的包,ln -s 到原来的位置;
具体操作如下:
ln -s /usr/lib/oracle/11.2/client64/lib/precomp /usr/lib/oracle/11.2/client64/precomp ln -s /usr/include/oracle/11.2/client64 /usr/lib/oracle/11.2/client64/lib/precomp/public
5.5 安装sshd服务
不推荐在镜像中安装sshd服务,如果确实需要修改共享文件夹的内容,可以单独在容器中安装一下sshd。
yum install openssh-server
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' /usr/sbin/sshd -D
6. 梳理xip环境,使用dockerfile构建
周末重新梳理了一下,由于docker commit 创建镜像不透明,并且不易于后期维护,因此,编写dockerfile来重新构建stdxip环境,当然,前提是/home/xip目录已经部署完成。
文件目录如下:
/Users/suitm/binsh>lf Dockerfile oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-precomp-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-tools-11.2.0.4.0-1.x86_64.rpm
执行构建命令:
docker build -t stdxip .
docker build 是构建镜像、-t 是指定构建的镜像的名字, "." 是上下文context. 如果没有 -f 指定dockerfile,会默认读取当前文件夹下面的Dockerfile文件,类似makefile
默认dokcer 会将上下文的文件夹打包上传到docker服务端,所以docker是CS架构的,因此如果上下文里的路径,到后面docker 中只用COPY等命令的时候,不可以用绝对路径。
Dockerfile文件内容如下:
# base image FROM centos # MAINTAINER 作者信息 MAINTAINER suitianmou@tfrunning.com.cn # 本地环境变量, 需要根据实际情况编写 ENV ORACLE_IP=172.17.0.2 #ARG ORACLE_IP=172.17.0.2 ## ENV是环境变量,在容器运行过程中也有效,ARG是DOCKERFILE变量,仅在该文件执行过程中有效 # 拷贝oracle11g的rpm安装包到镜像中 COPY *.rpm /tmp/ ## 安装gcc、make等软件包 RUN yum install -y gcc \ && yum install -y make \ && yum install -y libaio \ && yum clean all \ # centos无此头文件,编译可能会报错 && touch /usr/include/stropts.h \ # 修改时区 && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ ## 安装oracle_client && rpm -ivh /tmp/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm \ && rpm -ivh /tmp/oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm \ && rpm -ivh /tmp/oracle-instantclient11.2-precomp-11.2.0.4.0-1.x86_64.rpm \ && rpm -ivh /tmp/oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm \ && rm -f /tmp/*.rpm \ # 链接proc && ln -s /usr/lib/oracle/11.2/client64/lib/precomp /usr/lib/oracle/11.2/client64/precomp \ && ln -s /usr/include/oracle/11.2/client64 /usr/lib/oracle/11.2/client64/lib/precomp/public \ # 配置tnsnames.ora, 使用ln -s && mkdir -p /usr/lib/oracle/11.2/client64/network/admin \ # && echo -e 'XE =\n\ # (DESCRIPTION =\n\ # (ADDRESS = (PROTOCOL = TCP)(HOST = $ORACLE_IP)(PORT = 1521))\n\ # (CONNECT_DATA =\n\ # (SERVER = DEDICATED)\n\ # (SERVICE_NAME = XE)\n\ # )\n\ # )' > /usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora \ && ln -s /home/xip/docker/tnsnames.ora /usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora \ # 修改root密码 && echo "pass"|passwd root --stdin \ # 新建xip用户 && useradd xip -d/home/xip -p pass \ # 新建启动entrypoint脚本 && echo -e '#!/bin/bash\n\nsource $HOME/.profile && sh $1\n\nbash\n' > /docker_start.sh \ && sed -i -E 's/\r/\n/g' /docker_start.sh \ && chmod 777 /docker_start.sh # 指定xip为运行用户 USER xip # 指定ENTRYPOINT ENTRYPOINT ["/docker_start.sh"] ## 容器启动必定会执行的明星,用户输入的CMD会作为参数输入进来,这样就可以达到启动vdmp.sh 的实际启动脚本是docker_start.sh vdmp.sh
启动容器的命令如下:
docker run --name stdvdmp -d -p 9999:9999 -it -v /Users/suitm/Persion/DockerFile/xip:/home/xip stdxip vdmp.sh
这样一个VDMP容器服务就启动完成了。
7. oracle容器的启动梳理
由于容器停止后,非mount的数据都会丢失,因此oracle容器如果重新创建,经常会发生如下错误:
SQL> startup ORACLE instance started. Total System Global Area 601272320 bytes Fixed Size 2228848 bytes Variable Size 201330064 bytes Database Buffers 394264576 bytes Redo Buffers 3448832 bytes Database mounted. ORA-01122: database file 5 failed verification check ORA-01110: data file 5: '/u01/app/oracle/oradata/XE/datafile/spc_stdxip_01.dbf' ORA-01207: file is more recent than control file - old control file
因此,重新梳理一下数据库文件,将变化的文件数据库文件都放在挂载目录下:
本地路径如下:
/Users/suitm/Persion/DockerFile/oracle_data>ls
datafile redo
/Users/suitm/Persion/DockerFile/oracle_data>ls datafile
binsh datafile sysaux.dbf temp.dbf users.dbf
control.dbf ora_ctl_file_bak.txt system.dbf undotbs1.dbf
/Users/suitm/Persion/DockerFile/oracle_data>ls redo
mark onlinelog
启动命令如下:
docker run --name oracle_test -d -p 1521:1521 -it -v /Users/suitm/Persion/DockerFile/oracle_data/datafile:/u01/app/oracle/oradata/XE -v /Users/suitm/Persion/DockerFile/ oracle_data/redo:/u01/app/oracle/fast_recovery_area/XE alexeiled/docker-oracle-xe-11g bash
8. 总结
至此,基本上使用docker就完全搭建了一个渠道环境。后续再运行项目,则在stdxip镜像基础上,运行新的容器即可。
在本机启动docker的服务之后。(我本机docker设置为默认启动)
执行: docker start oracle 就可以启动oracle的监听了数据库服务了。
执行: docker start vdmp就可以启动vdmp服务了。
另外对于docker的使用回顾注意一下几点:
不要把一个容器当成一个虚拟机,而是当成一个服务。
镜像中需要变更的部分,尽量放在volume中,而不要放在镜像的联合文件系统内部。会越来越大。
oralce数据库,只要有onlinelog(联机日志)、control.dbf(控制文件)、数据文件, 三个文件,就可以完全的回复一个数据库。实际在小节7中也是这么使用的。用的oracle完全是外网仓库的镜像,而不是我做的修改镜像。
进入一个容器,使用docker exec -it 容器名 bash , 这样即使退出,也不会对原服务有影响。
本次volume使用的还不好,直接在启动容器的时候挂在本地文件夹。这样如果本地文件夹调整位置,所有容器都要重启。进一步来做的话,应该建立一个本地的volume,本地volume挂在本地文件夹,然后容器启动的时候,挂载本地volume名字。再进一步,可以建立一个数据容器,来关联本地的volume,然后其他容器启动的时候,volume from 这个本地数据容器,这样各服务的容器连本地容器的名字也不用知道。(本地容器不需要启动)
附录: 常用命令
docker image ls (-a) 查看镜像
docker container ls (-a) 查看容器
docker volume ls 查看文件卷
docker run --name oracle -d -p 1521:1521 -it -v /Users/suitm/Persion/DockerFile/oracle_data:/u01/app/oracle/oradata/XE/datafile alexeiled/docker-oracle-xe-11g bash
docker attach 容器名称/容器id
docker inspect 容器名/容器ID
docker exec -it 容器名 bash 进入已经运行的容器,并运行bash命令
作者:冰天
链接:https://www.jianshu.com/p/e3426223b528