初次使用docker 并搭建oracle环境和xip环境

初次使用docker 并搭建oracle环境和xip环境

[TOC]

1. docker基本介绍

fengmian.jpeg

表象上,基本和vmware虚拟机非常类似,但是由于公用系统资源,所以启动宣传上只需要50ms,因此可以一个应用一个容器。

docker 有三个部分:

  1. 仓库, 类似github,用来共享镜像。
  2. 镜像,类似iso系统镜像,是别人安装好的基本环境镜像,当时自己也可以创建。
  3. 容器,实际运行的实体,容器是从镜像开始运行的,运行过程中的操作,如果不另外保存为镜像,则销毁就全部丢失。

关于容器和镜像的进一步分析:

docker一直强调两点:

  1. docker 不是虚拟机
  2. 容器即服务

要充分理解这两点,其实主要在于理解容器即服务,docker类似于集装箱,每个服务启动的时候,都包含他所依赖的环境。

从我们常用的说法来说,可以说每启动一个服务,就启动了一个虚拟机。

比如我要启动ftp服务和ssh服务来修改某个文件夹的文件内容,传统虚拟机做法是启动一个虚拟机,然后启动ftp服务,然后启动ssh服务。但是docker的做法是,先启动一个虚拟机,然后配置这个虚拟机启动的时候,自动启动ftp服务。 再启动虚拟机2,配置这个虚拟机启动ssh服务。 然后两个虚拟机配置一个共享文件夹。

由于docker和虚拟机的技术不同,主要是用了大量的系统复用,因此启动效率特别高,按官方说法,docker一个容器的启动,只需要50ms.

理解了以上这几点,才可以对docker的使用有一个充分的理解,我开始在使用的过程中,也很有疑惑,尤其是启动xip环境容器的时候,总想先启动sshd,再启动vdmp.sh 再启动pmts.sh,并且由于docker容器在启动的时候,指定开放的端口(docker run -p 22:22),而在启动后,无法(可以用iptables,但是非常复杂,而且官方不推荐)追加映射端口,导致新系统的服务无法对外暴露。

正确的做法是,配置好基本的xip环境作为镜像,然后启动vdmp容器,启动脚本直接就是vdmp.sh。 再启动pmts容器,启动脚本为pmts.sh。 这两个服务都不需要sshd服务,也不需要bash命令行。如果想类似开发环境telnet或者ssh登录,则再启动一个sshd容器,用来编辑和编译环境。

2. docker下载和使用手册

官网下载地址: https://store.docker.com/editions/community/docker-ce-desktop-mac

使用手册(docker_practice): https://www.gitbook.com/book/yeasy/docker_practice/details

3. 基本环境创建和调整

本机电脑使用的是macOS系统,以下描述和截图都是在macOS上操作,不过基本都是命令行操作。windows和linux的安装过程,都参见上节的使用手册,有详细过程,基本上大同小异。

1. 下载镜像安装

下载docker.dmg,https://store.docker.com/editions/community/docker-ce-desktop-mac

然后正常安装dmg文件,安装完成后,右上角会有一个小海豚的图标。

docker_3.1.1.png

2. 使用国内镜像

参见使用手册中的描述,我本次使用的是daocloud的国内镜像加速。

  • 注册 https://www.daocloud.io/mirror#accelerator-doc

  • 使用:

    Docker For Mac
    
    右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中加入下面的镜像地址:(这个地址可能因为不同的人而不同)
    
    http://d01edbdc.m.daocloud.ioCopy
    
    点击 Apply & Restart 按钮使设置生效。
    

3. 基本安装完成校验

使用iterm(term)进入终端,输入docker:

docker_3.3.1.png

4. 安装oracle数据库镜像

1. 搜索oracle镜像

docker search oracle

结果如下:

/Users/suitm>docker search  oracle
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
oraclelinux                         Official Docker builds of Oracle Linux.         432                 [OK]
frolvlad/alpine-oraclejdk8          The smallest Docker image with OracleJDK 8 (…   297                                     [OK]
sath89/oracle-12c                   Oracle Standard Edition 12c Release 1 with d…   275                                     [OK]
alexeiled/docker-oracle-xe-11g      This is a working (hopefully) Oracle XE 11.2…   240                                     [OK]
sath89/oracle-xe-11g                Oracle xe 11g with database files mount supp…   172                                     [OK]
.......

这里我选择的 alexeiled/docker-oracle-xe-11g 这个镜像,第一是因为11g版本比较熟悉,第二个是star也比较多,说明质量可以。

2. 下载镜像

docker pull alexeiled/docker-oracle-xe-11g

结果如下,因为比较大2个多G,因此需要耐心等待:

/Users/suitm>docker pull alexeiled/docker-oracle-xe-11g
Using default tag: latest
latest: Pulling from alexeiled/docker-oracle-xe-11g
759d6771041e: Already exists
8836b825667b: Already exists
c2f5e51744e6: Already exists
a3ed95caeb02: Already exists
787648ea7b44: Already exists
46f20000ce59: Already exists
2a190e47ca3f: Already exists
f8043f470a85: Already exists
0f6111a00dd6: Already exists
deacbfda2b11: Already exists
6eb979936fa3: Already exists
5194f2505f56: Already exists
a63e30990791: Already exists
994cf2ce199e: Already exists
5eba4c64e295: Already exists
01227e9ca0a6: Already exists
076b6fa27478: Already exists
d6407a7221b5: Already exists
bbc5a28168da: Already exists
dd783b45fa26: Already exists
0a686089bc7e: Already exists
73fac5e681c5: Already exists
afaede9e60b1: Already exists
a5d9cef8ef2a: Already exists
32bcfcf46e45: Already exists
aa896f927427: Already exists
f99ab5aba6e5: Already exists
Digest: sha256:35448e199115012a742ff9098da3287c666ce52d18efcf4658e0437892ed3ee6
Status: Image is up to date for alexeiled/docker-oracle-xe-11g:latest

3. 使用镜像

https://dashboard.daocloud.io/packages/explore 对镜像进行搜索,或者直接上官网也可以。

该镜像一般都有说明,比如这个镜像的使用说明如下:

https://dashboard.daocloud.io/packages/3dee34c3-9c70-488e-b6a1-9838140ac245

docker-oracle-xe-11g
Oracle XE - Dockerfile

This repository contains a Dockerfile to create a docker container with Oracle Express Edition 11g Release 2 and Ubuntu 14.04 LTS (Trusty)

This Dockerfile has been published as a trusted build to the public Docker Registry.

How-To: Build this image

If you want to build this image and use latest Oracle XE version, you will need to download Oracle XE from Oracle site.

Then you will also need to convert download rpm file into deb, using alien tool.

Run following command to convert downloaded rpm package into deb.

sudo alien oracle-xe-11.2.0-1.0.x86_64.rpm
I also keep, already downloaded Oracle XE image in GitHub repository, split into 3 pieces, due to GitHub 100MB file limit. Original file is split by running split command and merged back with cat command (Google for how to use both commands).

How-To: Install and Use

docker pull alexeiled/docker-oracle-xe-11g
Note: It's important to run Oracle XE with >1GB shared memory.

Start Oracle XE

Running Oracle XE in detached mode with 1521 and 8080 ports opened and 2GB shared memory:

docker run -d --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
Start Oracle XE and execute SQL on startup

Put your *.sql files for database init into some local folder and mount this folder during container startup to /etc/entrypoint-initdb.d volume.

docker run -d --shm-size=1g -p 8080:8080 -p 1521:1521 -v /local-initdb:/etc/entrypoint-initdb.d alexeiled/docker-oracle-xe-11g
Connect

Connect database with following setting:

hostname: localhost
port: 1521
sid: xe
username: system
password: oracle
Password for SYS user

oracle
Connect to Oracle Application Express web management console with following settings:

url: http://localhost:8080/apex
workspace: internal
user: admin
password: oracle
Do not forget to change admin password!

因此,总结一下上面的描述 ,启动该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

其中 :

  • —name 为容器起名字,后续使用docker attach $name 就可以
  • -d 代表后台运行
  • -p 代表 本机端口:docker端口
  • -it 代表使用交互式
  • -v 代表挂在文件夹,类似mount。 前面本机的文件夹名,后面是容器内的文件夹名称
  • bash 是要执行的命令,这里是启动一个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

    • REDO日志文件夹直接挂在到本地的oracle_data/redo文件夹
    • 数据文件和控制文件直接挂载到本地的oracle_data/datafile文件夹

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命令

推荐阅读更多精彩内容