It’s easier to explain things with an example. So, I will take up centos/postgresql docker image and nuleculize it for Docker and Kubernetes as providers. This post assumes that you have setup an Atomic environment on CentOS7/Fedora. If you have not done so, you can follow the instructions here.

First, we’ll create scaffolding for our Nulecule PostgreSQL application.

mkdir -p nulecule-postgresql/artifacts/{docker,kubernetes}
touch nulecule-postgresql/{Dockerfile,LICENSE,Nulecule,README.md}
touch nulecule-postgresql/docker/postgresql-app-pod_run
touch nulecule-postgresql/kubernetes/{postgresql-pod,postgresql-service}.yaml

Second, we’ll edit nulecule-postgresql/Nulecule file as below:

---
specversion: 0.0.2
id: postgresql-atomicapp

metadata:
  name: PostgreSQL Atomic App
  appversion: 1.0.0
  description: This is PostgreSQL
graph:
  - name: postgresql-atomicapp
    params:
      - name: db_user
        description: Database User
      - name: db_pass
        description: Database Password
      - name: db_name
        description: Database Name
    artifacts:
      kubernetes:
        - file://artifacts/kubernetes/postgresql-pod.yaml
        - file://artifacts/kubernetes/postgresql-service.yaml
      docker:
        - file://artifacts/docker/postgresql-app-pod_run

Third, we’ll edit nulecule-postgresql/Dockerfile as below:

FROM projectatomic/atomicapp:0.1.3

MAINTAINER Ratnadeep Debnath <rtnpro@redhat.com>

LABEL io.projectatomic.nulecule.specversion="0.0.2" \
	  io.projectatomic.nulecule.providers="kubernetes,docker"

ADD /Nulecule LICENSE /application-entity/
ADD /artifacts /application-entity/artifacts

Fourth, we’ll edit nulecule-postgresql/artifacts/docker/postgresql-app-pod_run as below:

docker run -d --name postgresql-atomicapp-app -p 5432:5432 -e DB_USER=$db_user -e DB_PASS=$db_pass -e DB_NAME=$db_name centos/postgresql

Fifth, we’ll edit nulecule-postgresql/artifacts/kubernetes/postgresql-pod.yaml as below:

apiVersion: v1
id: postgresql
spec:
  containers:
    - name: postgresql
      image: centos/postgresql
      env:
        - name: DB_NAME
          value: $db_name
        - name: DB_USER
          value: $db_user
        - name: DB_PASS
          value: $db_pass
      ports:
        - containerPort: 5432
metadata:
  name: postgresql
  labels:
    name: postgresql
kind: Pod

Sixth, we’ll edit nulecule-postgresql/artifacts/kubernetes/postgresql-service.yaml as below:

kind: Service
apiVersion: v1
metadata:
  name: postgresql
  labels:
    name: postgresql
    name: postgres
spec:
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
      nodePort: 0
  selector:
    name: postgresql
  portalIP: None
  type: ClusterIP
  sessionAffinity: None
status:
  loadBalancer: {}

Edit nulecule-postgresql/{LICENSE,README.md} as needed.

Seventh, we’ll build our Nulecule application image as below:

cd nulecule-postgresql
sudo docker build -t nulecule-centos-postgresql .

Eighth, we’ll the run our newly created nulecule image:

sudo atomic run nulecule-centos-postgresql

Enter database name and credentials during runtime, when prompted to do so (if you have not configured answers.conf already). Once the command finishes execution, you can check running postgresql application on kubernetes as below:

$ kubectl get service postgresql
NAME      LABELS    SELECTOR       IP               PORT(S)
postgresql   name=db   name=postgresql   10.254.167.159   5432/TCP

You can also access the postgresql database as below:

$ sudo docker run --rm -ti centos/postgresql psql -h 10.254.167.159 -U <db user> -d <db name> -W
Password for user test: <password>
psql (9.2.7)
Type "help" for help.

test=# \l
                             List of databases
  Name     |  Owner   | Encoding  | Collate | Ctype |   Access privileges
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     |
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
    	   |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
    	   |          |           |         |       | postgres=CTc/postgres
 test      | postgres | SQL_ASCII | C       | C     | =Tc/postgres         +
	       |          |           |         |       | postgres=CTc/postgres+
		   |          |           |         |       | test=CTc/postgres
(4 rows)

test=# \conninfo
You are connected to database "test" as user "test" on host "10.254.167.159" at port "5432".

This was a summary of steps you need to follow to nuleculize your existing Docker application. For more info, you can refer to Getting started guide of Nulecule.