Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CON-2277 Create new subject and audit for play-with-containers-py based on JS version #2274

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions subjects/devops/play-with-containers-py/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
## play-with-containers-py

![Microservices](./resources/Microservices.png)

### Objectives

This project aims to discover the container concepts and tools, and practice
these tools by creating a microservices' architecture with docker and
docker-compose. Additionally, as a cloud and DevOps student, you will gain
insight into key containers and docker concepts as follows:

- `Containers`, is a unit of software that packages code and its dependencies,
so the application runs quickly and reliably across computing environments.
- `Docker`, is a set of "platform as a service" products that use OS-level
virtualization to deliver software in packages called containers.
- `Dockerfile`, is a text document that contains all the commands a user could
call on the command line to assemble an image.
- `Docker Images`, is a read-only template that contains a set of instructions
for creating a container that can run on the Docker platform.
- `Docker Networks`, it enables a user to link a Docker container to as many
networks as he/she requires.
- `Docker Volumes`, Volumes are the preferred mechanism for persisting data
generated and used by Docker containers.
- `Docker Compose`, Compose is a tool for defining and running multi-container
Docker applications. With Compose, you use a YAML file to configure your
application's services.

### Tips

- Spend time on the theory before rushing into the practice.
- Read the official documentation of Docker.

> Any lack of understanding of the concepts of this project may affect the
> difficulty of future projects, take your time to understand all concepts.

> Be curious and never stop searching!

> Each operation in Dockerfile is a layer in the image, You must design it
> appropriately to avoid duplicate or useless layers in the image.

> It is not recommended to use 'latest' in your Dockerfile, instead of that you
> can specify the version in the tag.

### Instructions

You have to install Docker in your Linux virtual machine, you will also need it
in the audit.

You have to implement this architecture:
![architecture](./resources/play-with-containers-py.png)

You will use the services you developed in the `crud-master-py` project.

You are required to create a `Dockerfile` for each service and call them in
your `docker-compose.yml` (each service should have its container for optimal
performance.). To ensure performance, the containers should be created from the
penultimate stable version of either `Alpine` or `Debian`, depending on your
preference. The corresponding service and Docker image must share the same
name. This implies that you must build your project's Docker images, and you are
not allowed to use pre-built Docker images or services like DockerHub, except
for `Alpine` and `Debian`.

#### Docker Containers:

- `inventory-db container` is a SQL database server that contains your
inventory database, it must be accessible via port `5432`.
- `billing-db container` is a SQL database server that contains your
billing database, it must be accessible via port `5432`.
- `inventory-app container` is a Python server that contains your
inventory-app. It will be connected to the inventory database and accessible
via port `8080`.
- `billing-app container` is a Python server that contains your billing-app.
It will be connected to the billing database and consuming the messages from
the RabbitMQ queue. It will be accessible via port `8080`.
- `rabbit-queue` is a RabbitMQ server that contains the queue.
- `api-gateway-app container` is a Python server that contains your
api-gateway-app. It will forward the requests to the other services, and it's
accessible via port `3000`.

> Containers must be restarted in case of failure!

#### Docker Volumes:

- `inventory-db volume` contains your inventory database.
- `billing-db volume` contains your billing database.
- `api-gateway-app volume` contains your API gateway logs.

#### Docker Network:

- You must have a docker network that establishes the connection between all
services inside your docker host.
- Any outside request must be able to access only the `api-gateway-app` via
port `3000`.

> All resources in your infrastructure must be targeted and managed by
> docker-compose.

> You don't have to push your credentials and passwords to your repo, the
> credentials and passwords must be in the `.env` file, and this file must be
> ignored in the `.gitignore` file.

> Don't push your passwords to Git, unless you want to throw a thief's party
> with free drinks and no bouncers on duty!

### Documentation

You must push a `README.md` file containing full documentation of your solution
(prerequisites, configuration, setup, usage, etc.).

### Bonus

If you complete the mandatory part successfully, and you still have free time,
you can implement anything that you feel deserves to be a bonus.

Challenge yourself!

### Submission and audit

You must submit the `README.md` file and all files used to create, delete and
manage your infrastructure: docker-compose, Dockerfiles, scripts and so on.

> The infrastructure must be able to be created, deleted, and managed only by
> docker-compose. In the audit you will be asked different questions about the
> concepts and the practices of this project, prepare yourself!
223 changes: 223 additions & 0 deletions subjects/devops/play-with-containers-py/audit/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
#### General

##### Check the Repo content

A `README.md` file and all files used to create, delete and manage the student infrastructure must be submitted in the repo.

###### Are all the required files present?

###### Was the `.env` file excluded from the git files?

###### Are all pushed files in the repo clean of any credentials or passwords?

##### Ask the following questions to the group or student:

##### What are containers and what are their advantages?

##### What is the difference between containers and virtual machines?

##### What is Docker and what is it used for?

###### Did the student reply correctly to the questions?

##### Open and read the `README.md` file provided by the student.

###### Does the `README.md` file contain all the required information to run and manage the solution (prerequisites, configuration, setup, usage, etc)?

#### Check the student infrastructure:

The student must implement this architecture:
![architecture](../pictures/architecture.png)

##### Run the student infrastructure:

```console
user:~$ docker-compose up
<...>
inventory-database ... done
billing-database ... done
inventory-app ... done
billing-app ... done
RabbitMQ ... done
api-gateway-app ... done
<...>
user:~$
```

###### Does the student architecture reflect the infrastructure enforced by the subject?

###### Does the infrastructure start correctly?

##### Ask the following questions to the group or student

##### What is a microservices' architecture?
MSilva95 marked this conversation as resolved.
Show resolved Hide resolved

##### Why do we use microservices architecture?

##### What is a queue and what is it used for?

##### What is RabbitMQ?

###### Did the student reply correctly to the questions?

#### Verify the Dockerfiles:

###### Is there a Dockerfile for each service?

###### Are all Dockerfiles based on `Debian` or `Alpine`?

###### Are Dockerfiles or any other solution files free from sensitive data (sensitive data should only exist in `.env` file)?

##### Ask the following questions to the group or student

##### What is a Dockerfile?

##### Explain the instructions used on the Dockerfile.

###### Did the student reply correctly to the questions?

#### Check the Containers:

```console
user:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<...> inventory-database <...> <...> <...> 5432/tcp inventory-database
<...> billing-database <...> <...> <...> 5432/tcp billing-database
<...> inventory-app <...> <...> <...> 8080/tcp inventory-app
<...> billing-app <...> <...> <...> 8080/tcp billing-app
<...> RabbitMQ <...> <...> <...> 5672/tcp RabbitMQ
<...> api-gateway-app <...> <...> <...> 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp api-gateway-app
user:~$
```

- `inventory-db container` is a SQL database server that contains your inventory database, it must be accessible via port `5432`.
- `billing-db container` is a SQL database server that contains your billing database, it must be accessible via port `5432`.
- `inventory-app container` is a Node.js server that contains your inventory-app. It will be connected to the inventory database and accessible via port `8080`.
- `billing-app container` is a Node.js server that contains your billing-app. It will be connected to the billing database and consuming the messages from the RabbitMQ queue. It will be accessible via port `8080`.
- `rabbit-queue` is a RabbitMQ server that contains the queue.
- `api-gateway-app container` is a Node.js server that contains your api-gateway-app. It will forward the requests to the other services and it's accessible via port `3000`.

##### Check the Container restart policy:

```console
user:~$ docker inspect -f "{{ .HostConfig.RestartPolicy }}" <container-name>
{on-failure 0}
user:~$
```

###### Do all containers have the correct configuration?

###### Are the containers configured to restart in case of failure?

#### Check the Docker volumes:

```console
user:~$ docker volume ls
DRIVER VOLUME NAME
<...> inventory-database
<...> billing-database
<...> api-gateway-app
user:~$
```

- `inventory-database volume` contains the inventory database.
- `billing-database volume` contains the billing database.
- `api-gateway-app volume` contains the API gateway logs.

###### Do all volumes have the correct configuration?

##### Ask the following questions to the group or student

##### What is a Docker volume?

##### Why do we use Docker volumes?

###### Did the student reply correctly to the questions?

#### Check the solution network:

###### Is the connection to the api-gateway-app the only one exposed from outside of the Docker host?

##### Ask the following questions to the group or student

##### What is the Docker network?

##### Why do we use the Docker network?

###### Did the student reply correctly to the questions?

#### Check the Docker images:

```console
user:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
inventory-database <...> <...> <...> <...>
billing-database <...> <...> <...> <...>
inventory-app <...> <...> <...> <...>
billing-app <...> <...> <...> <...>
RabbitMQ <...> <...> <...> <...>
api-gateway-app <...> <...> <...> <...>
user:~$
```

###### Is there a Docker image for each service with the same service name?

##### Ask the following questions to the group or student

##### What is a Docker image?

##### Why do we use Docker images?

###### Did the student reply correctly to the questions?

#### Inventory API Endpoints

##### Open Postman and make a `POST` request to `http://[GATEWAY_IP]:[GATEWAY_PORT]/api/movies/` address with the following body as `Content-Type: application/json`:
```json
{
"title": "A new movie",
"description": "Very short description"
}
```

###### Can you confirm the response was the success code `200`?

##### In Postman make a `GET` request to `http://[GATEWAY_IP]:[GATEWAY_PORT]/api/movies/` address.

###### Can you confirm the response was success code `200` and the body of the response is in `json` with the information of the last added movie?

#### Billing API Endpoints

##### Open Postman and make a `POST` request to `http://[GATEWAY_IP]:[GATEWAY_PORT]/api/billing/` address with the following body as `Content-Type: application/json`:
```json
{
"user_id": "20",
"number_of_items": "99",
"total_amount": "250"
}
```

###### Can you confirm the response was success code `200`?

##### Stop the billing-app container

###### Can you confirm the `billing-app` container was correctly stopped?

##### Open Postman and make a `POST` request to `http://[GATEWAY_IP]:[GATEWAY_PORT]/api/billing/` address with the following body as `Content-Type: application/json`:
```json
{
"user_id": "22",
"number_of_items": "10",
"total_amount": "50"
}
```

###### Can you confirm the response was success code `200` even if the `billing_app` is not working?

#### Bonus

###### +Did the student use his/her own `crud-master-py` solution?

###### +Did the student add any optional bonus?

###### +Is this project an outstanding project?
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading