Datasource name for a local Oracle Docker Instance

I am trying to connect to an oracle docker instance through a framework. The framework requires the table name and logical host name to be passed in.

I am trying to connect to an oracle docker instance through a framework. The framework requires the table name and logical host name to be passed in.

I am able to connect to the docker instance using jdbc connection in java.

My question is how do i set the logical host name to this docker instance that i can use.

Things I have tried:

  • I tried by adding a logical host in /etc/hosts file in the image using docker run command.
  • I tried passing in the docker name as the logical host
  • I tried giving the host name mentioned in tnsnames.ora file in the image

I am using Docker version 18.09.1, build 4c52b90 and Oracle v12.2.0.1. Any pointers would be helpful.

Thanks in advance!!

WordPress in Docker. Part 1: Dockerization

WordPress in Docker. Part 1: Dockerization

This entry-level guide will tell you why and how to Dockerize your WordPress projects.

This entry-level guide will tell you why and how to Dockerize your WordPress projects.

List all containers in Docker(Docker command)

List all containers in Docker(Docker command)

We can get a list of all containers in docker using `docker container list` or `docker ps` commands.

We can get a list of all containers in docker using docker container list or docker ps commands.

List Docker Containers

To list down docker containers we can use below two commands

  • docker container list
  • docker ps

docker container ls command introduced in docker 1.13 version. In older versions we have to use docker ps command.

List all Containers in docker, using docker ls command

The below command returns a list of all containers in docker.

docker container list -all

or

docker container ls -all

List all containers in docker, using docker ps command

In older version of docker we can use docker ps command to list all containers in docker.

$ docker ps -all

or

$ docker ps -a

List all Running docker containers

The default docker container ls command shows all running docker containers.

$ docker container list

or

$ docker container ls

or

To get list of all running docker containers use the below command

$ docker ps

List all stopped docker containers command

To get list of all stopped containers in docker use the below commands

$ docker container list -f "status=exited"

or

$ docker container ls -f "status=exited"

or you can use docker ps command

$ docker ps -f "status=exited"

List all latest created docker containers

To list out all latest created containers in docker use the below command.

$ docker container list --latest

Show n last created docker containers

To display n last created containers in docker use the below command.

$ docker container list --last=n

How to Connect NodeJS App in Docker to Oracle Database

How to Connect NodeJS App in Docker to Oracle Database

In this post, I’ll cover how to make a connection from a NodeJS application in a Docker container to your Oracle Database in three different scenarios.

In this post, I’ll cover how to make a connection from a NodeJS application in a Docker container to your Oracle Database in three different scenarios.

  • Typical Database connection.
  • Database inside a different Docker container.
  • Oracle Autonomous Transaction Processing Cloud Database.
Simple Test App

When attempting something new, I find it’s best to make sure all of the pieces that are not part of the new thing, are as simple as possible.

For my examples, I will be using a small NodeJS application that:

  • Connects to the Oracle Database
  • Runs a simple query.
  • Prints the results to the console.

Create a new file named dbConfig.js to set the database connection information.

module.exports = {
  user          : process.env.NODE_ORACLEDB_USER,
  password      : process.env.NODE_ORACLEDB_PASSWORD,
  connectString : process.env.NODE_ORACLEDB_CONNECTIONSTRING,
  poolMax: 2,
  poolMin: 2,
  poolIncrement: 0
};

Create a new file named server.js used to test the connection.

const oracledb = require('oracledb');
const config = require('./dbConfig.js');

async function runTest() {
  let conn;

  try {
    conn = await oracledb.getConnection(config);

    const result = await conn.execute(
      'select current_timestamp from dual'
    );

    console.log(result);
  } catch (err) {
    console.error(err);
  } finally {
    if (conn) {
      try {
        await conn.close();
      } catch (err) {
        console.error(err);
      }
    }
  }
}

runTest();

Install the node-oracledb driver. (If you have any questions about the node-oracledb driver, you can find the answers here.)

npm install oracledb -s

Create environment variables for the connection information. (Replace my values with yours.)

export NODE_ORACLEDB_USER=NotMyRealUser
export NODE_ORACLEDB_PASSWORD=NotMyRealPassword
export NODE_ORACLEDB_CONNECTIONSTRING=192.168.0.44:1521/NotMyRealServiceName

Test the NodeJS application. You should see something similar to the following.

@OraBlaineOS:SimpleApp$ node server.js 
{
  metaData: [ { name: 'CURRENT_TIMESTAMP' } ],
  rows: [ [ 2019-08-20T17:50:38.615Z ] ]
}
Create a Docker Container for the NodeJS App

Create a Dockerfile

FROM oraclelinux:7-slim

# Create app directory
WORKDIR /usr/src/app

# Copy the .js files from your host machine into the new app directory
ADD *.js ./

# Update Oracle Linux
# Install NodeJS
# Install the Oracle Instant Client
# Check that NodeJS and NPM installed correctly
# Install the OracleDB driver
RUN yum update -y && \
  yum install -y oracle-release-el7 && \
  yum install -y oracle-nodejs-release-el7 && \
  yum install -y --disablerepo=ol7_developer_EPEL nodejs && \
  yum install -y oracle-instantclient19.3-basic.x86_64 && \
  yum clean all && \
  node --version && \
  npm --version && \
  npm install oracledb && \
  echo Installed

CMD ["node", "server.js"]

Build the image

docker build --no-cache --force-rm=true -t node_example .

Now that you have an image you’ll run a container and to connect it to:

Typical Oracle Database

docker run \
--name typical_node_example -it \
-e NODE_ORACLEDB_USER=$NODE_ORACLEDB_USER \
-e NODE_ORACLEDB_PASSWORD=$NODE_ORACLEDB_PASSWORD \
-e NODE_ORACLEDB_CONNECTIONSTRING=$NODE_ORACLEDB_CONNECTIONSTRING \
node_example

The container will run, execute the query, and stop. You should see something similar to this output.

{ metaData: [ { name: 'CURRENT_TIMESTAMP' } ],
  rows: [ [ 2019-08-20T18:15:23.615Z ] ] }

An Oracle Database Inside a Docker Container

Created a Docker Network.

docker network create OrdsXeNet

You’ll use that same network to connect from the NodeJS container to the Oracle XE container.

First, change your NODE_ORACLEDB_CONNECTIONSTRING environment variable to use the Oracle XE container name.

export NODE_ORACLEDB_CONNECTIONSTRING=oracleXe:1521/xepdb1

Now, when you run a new docker container, you will attach it to the same Docker Network as the Oracle XE container.

docker run \
--name docker_network_node_example -it \
--network=OrdsXeNet \
-e NODE_ORACLEDB_USER=$NODE_ORACLEDB_USER \
-e NODE_ORACLEDB_PASSWORD=$NODE_ORACLEDB_PASSWORD \
-e NODE_ORACLEDB_CONNECTIONSTRING=$NODE_ORACLEDB_CONNECTIONSTRING \
node_example

The container will run, execute the query, and stop. You should see something similar to this output.

{ metaData: [ { name: 'CURRENT_TIMESTAMP' } ],
  rows: [ [ 2019-08-27T16:42:16.122Z ] ] }

Since both containers are using the same Docker network, you do not need to open the port when you run the Oracle XE container. This is useful if you’d like to keep your database private inside the Docker environment.

Oracle Autonomous Transaction Processing Cloud Database

After you create an Oracle ATP Cloud Database, you’ll need to download the credentials file and extract it into a secure location.

For this database, you will be using an entry in the tnsnames.ora file to make the database connection. Change the NODE_ORACLEDB_CONNECTIONSTRING environment variable to use the tnsnames entry.

export NODE_ORACLEDB_CONNECTIONSTRING=projects_tp

Before you run the container, you need to modify the sqlnet.ora file found in the credentials directory. Change the wallet location to the value that will be mapped inside the Docker container.

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/wallet/")))

When you run the new container for the node app, you will map a volume from the directory where you extracted your credentials file to the internal container directory. Mapping a volume makes sure that there is not a copy of the credential files inside the Docker container.

-v /my/host/machine/credentials/directory:/wallet

Finally, when you run the new container, you will add an additional environment variable defining where the tns admin information is located.

-e TNS_ADMIN=/wallet

The full command looks like this:

docker run \
--name cloud_atp_node_example -it \
-v /my/host/machine/credentials/directory:/wallet \
-e NODE_ORACLEDB_USER=$NODE_ORACLEDB_USER \
-e NODE_ORACLEDB_PASSWORD=$NODE_ORACLEDB_PASSWORD \
-e NODE_ORACLEDB_CONNECTIONSTRING=$NODE_ORACLEDB_CONNECTIONSTRING \
-e TNS_ADMIN=/wallet \
-p 3000:3000 \
node_example

The container will run, execute the query, and stop. You should see something similar to this output.

{ metaData: [ { name: 'CURRENT_TIMESTAMP' } ],
  rows: [ [ 2019-08-27T18:21:26.298Z ] ] }

Same Docker Image for all of the Examples

You may have noticed that you only built the Docker image once at the beginning of the post. The application in the Docker image uses environment variables to connect to the database. This allows you to run the same application in one or more containers and each container can connect to different Oracle Databases without having to rebuild the image.