Use this software to run Oracle 12c within a Docker container, while the database files are on a mounted volume. This allows you to mount multiple snapshots of the same volume and mount them in different containers simultaneously.
I would recommend running this on a dedicated server (cluster) or VM, since you will need to set some specific kernel parameters and use a modified version of Docker. This README walks you through all the steps to get it running.
I've only tried this with 12c so far, but I don't see any reason why it wouldn't work with older versions of Oracle.
Oracle requires a shared memory (shm) of at least 256 MB, and a stack size soft limit of at least 10240 kB (10485760 bytes), during installation and running. Be sure to build and run with these parameters:
--shm-size=256m --ulimit stack=10485760
I used Ubuntu 14.04 as a host, so it doesn't have to be an Oracle-approved OS. You need at least 3 GB of swap space on the host. Don't think you know better, Oracle will check during installation and just stop if you don't have enough swap space.
You also need to set some kernel parameters and security limits. Check
this guide
and follow the parts about editing sysctl.conf
and limits.conf
.
Download or clone this repository, if you haven't done so already. Then
download Oracle 12c (12.2.0.1.0)
from OTN.
Extract the zip file in the resources
directory, so the installer will
be at resources/database/runInstaller
.
Run
$ docker build --shm-size=256m --ulimit stack=10485760 -t oracle12c .
to build the image and tag it as oracle12c
.
It may take a while. Make sure you see the text Successfully Setup Software.
somewhere in the output.
The resulting image can do two things: create an empty database and run an existing database. The idea is that you create a database first, make a snapshot and run it in multiple containers.
Make a directory where you can store the database, e.g.
$ mkdir /tmp/database
Start the container, passing the Oracle SID that you want to use. In this example,
I'll use FOO
as the SID:
$ docker run --shm-size=256m --ulimit stack=10485760 -e COMMAND=initdb -e ORACLE_SID=FOO -v /tmp/db-FOO:/mnt/database oracle12c
Start the container again, using the same SID and pointing to (a snapshot of) the same volume:
$ docker run --shm-size=256m --ulimit stack=10485760 -e COMMAND=rundb -e ORACLE_SID=FOO -v /tmp/db-FOO:/mnt/database -P --name db1 oracle12c
This will start the server and show the alert log. If you want to run it in the background, add a -d switch:
$ docker run --shm-size=256m --ulimit stack=10485760 -d -e COMMAND=rundb -e ORACLE_SID=FOO -v /tmp/db-FOO:/mnt/database -P --name db1 oracle12c
When the container is running, port 1521 is exposed. You can user docker ps
to
see the running Docker processes and find out which port is used on the host.
To start sqlplus as sys in the database, and shut it down afterwards:
docker run --shm-size=256m --ulimit stack=10485760 -i -t -e COMMAND=sqlpluslocal -e ORACLE_SID=FOO -v /tmp/db-FOO:/mnt/database oracle12c
To run all *.sql
scripts in /tmp/sql
in the database, and shut it down afterwards:
docker run --shm-size=256m --ulimit stack=10485760 -e COMMAND=runsqllocal -e ORACLE_SID=FOO -v /tmp/db-FOO:/mnt/database -v /tmp/sql:/mnt/sql oracle12c
To connect to the database FOO running in container db1 with sqlplus:
docker run --shm-size=256m --ulimit stack=10485760 -i -t -e COMMAND=sqlplusremote -e ORACLE_SID=FOO -e ORACLE_USER=system -e ORACLE_PASSWORD=password --link db1:remotedb -P oracle12c
To run all *.sql
scripts in /tmp/sql
in the database FOO running in container db1:
docker run --shm-size=256m --ulimit stack=10485760 -e COMMAND=runsqlremote -e ORACLE_SID=FOO -e ORACLE_USER=system -e ORACLE_PASSWORD=password --link db1:remotedb -v /tmp/sql:/mnt/sql oracle12c