Introduction to container based development - Part 2/4
Tags: docker
Published: 2020-03-26 19:25:22

This is the second part of our container based development series. This post is based on the container development [article]( https://github.com/drFabio/containerDevelopment/blob/master/article.pdf) created by me.


### Creating our image - Pressing our own CD.

We are going create a node program its behavior is the following.

    
- try to find a file and read from it;
- output the content of the file;
- save the content +1;
- repeat every 1 second until 19.
- if no content is found it will create the file and save with 0;

The code is on the repository on the [firstContainer branch](https://github.com/drFabio/containerDevelopment/tree/firstContainer).

**nodeCounter.js**
```javascript
const fs = require('fs')
const path = require('path')

const counterFile = path.resolve(__dirname, './counter.txt')

const COUNTER_LIMIT = 20
const INTERVAL = 1000
let counterData = 0
if (fs.existsSync(counterFile)) {
  const fileData = fs.readFileSync(counterFile)
  counterData = parseInt(fileData, 10)
}

const recursiveCounter = () => {
  if (counterData === COUNTER_LIMIT) {
    process.exit(0)
  }
  console.log(counterData)
  counterData++
  fs.writeFileSync(counterFile, counterData)
  setTimeout(recursiveCounter, INTERVAL)
}

recursiveCounter()
```

With this code on some folder we also need to configure our container, to make how our CD is going to be built.

*Dockerfile* (No extension)
```dockerfile
FROM node:13-alpine3.10
RUN mkdir -p /app/ourApp/
COPY ./nodeCounter.js  /app/ourApp/
WORKDIR  /app/ourApp/
CMD node ./nodeCounter.js
```

The dockerfile above have [some commands](https://docs.docker.com/engine/reference/builder/)

* [FROM](https://docs.docker.com/engine/reference/builder/#from) - We are using a Node image that uses the alpien linux operating system.
* [RUN](https://docs.docker.com/engine/reference/builder/#run) - On this image we are creating a folder.
* [COPY](https://docs.docker.com/engine/reference/builder/#copy) - We are copying our node program to the folder.
* [WORKDIR](https://docs.docker.com/engine/reference/builder/#workdir) - We change the working dir so all commands will run starting from this new location.
* [CMD](https://docs.docker.com/engine/reference/builder/#cmd) - We say which command should run as soon as you play the CD.

To make our cd we execute the following on the terminal, it says to build a image called container_dev with the tag first using the dockerfile on the same folder I am executing the command.

```shell
docker build -t container_dev:first  .
```
The output will be something like:

```text
Sending build context to Docker daemon  70.66kB
Step 1/5 : FROM node:13-alpine3.10
.......
Successfully built 50c9fae3a235
Successfully tagged container_dev:first
```
If we want to see our images we can type 

```shell
docker images
```

To see our container data like Ids, names , tags and so on.

```text
REPOSITORY                              TAG                 IMAGE ID
container_dev                           first               50c9fae3a235       
node                                    13-alpine3.10     
```

Now that our image has a name and a tag we can run it:

```shell
docker run container_dev:first
```

And you should see a count from 0 to 19 and our image stopping. Congratulations you just created your first image!
This image is saving data on a file, run it again if we persisted data it should stop immediately since we are already on the 20 but now it will start again from 0, run it twice with a little delay each count will not interfere with each other. That is part of the security of containers they are isolated.

Our next topic: Volumes!