open-learning-exchange/planet

View on GitHub
docker/README.md

Summary

Maintainability
Test Coverage
# Planet & Docker
We decide to package our application in a docker container. We believe that with small standalone containerized application, we can ship more educational app to our Rasbperry Pi Package. We also have a plan to put container management integration as part of our planet app.

## Description
This folder contains most of our docker secret sauce and recipe.

### What is Docker
Docker means many things to many people. In simplest form we can say that docker is a way to containerized or put into a box (mental box) our app. So that when we run our app it is isolated to some degree from the host. It is basically a next level of VM, docker container basically can answer many problem that we want to achieve with VM, but with docker container it is more simple and resource-friendly. A docker container can run in Raspberry Pi, but VM in Raspberry Pi is insane. Docker helps us to have different isolated environment (deploying some apps) without polluting our host machine.

### Components
We have several docker components in our application there are
* Planet. There are two version, one is for production and one is for development.
  * Planet for production. It basically our production optimized Planet that served via Nginx.
  * Planet for development. It basically a runtime that make it possible for Planet to run (mostly node.js)
* CouchDB. It basically a CouchDB container and it developed in the different project. You can access it here in [ole-vi/rpi-couchdb](https://github.com/ole-vi/rpi-couchdb)
* CouchDB initialization data a.k.a. `db-init`. It contains all the schema necessary for our Planet to run.

### Target Architecture
Because we want to run our production Planet mostly in Raspberry Pi, the target architecture of our app are
* ARM (for production app run in the field running in Raspberry Pi, mostly for community)
* x86 (for production Nation)

### Docker-related files
* Docker file (`Dockerfile`)
* Docker compose file (`docker-compose.yml`)

This docker compose can be use for your development environment and very handy, you can spawn the development environment in a matter of seconds and start your development. Your code changes in host folder are automatically reflected to docker and ready to test in your browser.

## How to use
I will divide this how to use into two sections, for development and for production. It is interesting to run our development environment on top of isolated docker container.

### For Development

### For Production

1. Move to `docker` folder
2. Run the following command to spawn your environment for the first time
   (Optional: update planet.yml with specific images from https://hub.docker.com/r/treehouses/planet/tags/)

```
docker-compose -f planet.yml -f install.yml -p planet up -d --build
```

See if the docker containers running

```
docker ps
```

You'll see you containers like this

```
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                                NAMES
ea3b914c3193        planetdev_planet    "/bin/sh -c 'bash ..."   About a minute ago   Up 58 seconds       0.0.0.0:3000->3000/tcp                                               planetdev_planet_1
57f30698ccda        klaemo/couchdb      "tini -- /docker-e..."   About a minute ago   Up About a minute   4369/tcp, 9100/tcp, 0.0.0.0:2200->5984/tcp, 0.0.0.0:2201->5986/tcp   planetdev_couchdb_1
```

Connect to your `planetdev_planet` with

```
docker logs {{id}}
```

in this case

```
docker logs ea3b914c3193 -f
```

press `CTRL+C` to exit logs view

3. When you're done, you can do the following command

```
docker-compose -f planet.yml -f install.yml -p planet stop
```

4. When you go back to code

```
docker-compose -f planet.yml -f install.yml -p planet start
```

5. When you have to delete the environment

```
docker-compose -f planet.yml -f install.yml -p planet down
```

Remember when your containers active you can always look to your containers logs to see whats going on on the background.