
In the previous post, we mentioned about the Docker tutorial in.
This time, we are starting to run sample projects: Focusing on the Docker Compose file with Nodejs, Flask, PostgreSQL images to implement different tiers:
It shows:
GitHub Code Repo: https://github.com/omerbsezer/Fast-Docker/tree/main/hands-on-sample-projects/full-stack-app
Project structure:
project-root/ ├── docker-compose.yaml ├── frontend/ │ ├── package.json │ ├── index.js │ ├── index.html │ ├── Dockerfile ├── backend/ │ ├── app.py │ ├── requirements.txt │ ├── Dockerfile
FROM node:18 WORKDIR /home/app COPY . . EXPOSE 3000 RUN npm install CMD ["npm", "start"]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Frontend</title> </head> <body> <h1>Frontend is working!</h1> </body> </html>
const express = require("express");
const app = express();
const port=3000;
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
})
app.listen(port, () => {
console.log(`running at port ${port}`);
});
{
"name": "nodejsapp",
"version": "1.0.0",
"description": "nodejsapp description",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.3"
}
}
FROM python:3.11 WORKDIR /usr/src/app COPY . . RUN pip install -r requirements.txt EXPOSE 5000 CMD ["python", "app.py"]
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return "Backend is working!"
@app.route('/api', methods=['GET'])
def api():
return jsonify({"message": "Hello from the backend!"})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
flask
services:
frontend:
build:
context: ./frontend
container_name: frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/usr/src/app
depends_on:
- backend
backend:
build:
context: ./backend
container_name: backend
ports:
- "5000:5000"
volumes:
- ./backend:/usr/src/app
command: sh -c "pip install -r requirements.txt && python app.py"
db:
image: postgres:15
container_name: db
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
db_data:
user@docker:~$ docker compose up -d [+] Running 4/4 ✔ Network node_default Created 0.1s ✔ Container db Started 0.7s ✔ Container backend Started 0.7s ✔ Container frontend Started
user@docker:~$ curl http://localhost:3000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Frontend</title>
</head>
<body>
<h1>Frontend is working!</h1>
</body>
user@docker:~$ curl http://localhost:5000/api
{"message":"Hello from the backend!"}
user@docker:~$ curl http://localhost:5000
Backend is working!
</html>
user@docker:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e51751b546c node-frontend "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp frontend d8d28325ce10 postgres:15 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp db 04c1d04a5668 node-backend "sh -c 'pip install …" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp backend user@docker:~$ docker compose down [+] Running 4/4 ✔ Container frontend Removed 1.0s ✔ Container db Removed 0.5s ✔ Container backend Removed 10.5s ✔ Network node_default Removed 0.2s user@docker:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
This post shows how to create Docker compose file using sample frontend (express.js), backend (flask), database (postgresql) apps. Please have a look below menu for other Docker content, if you haven't seen before.
Follow for Tips, Tutorials, Hands-On Labs for AWS, Kubernetes, Docker, Linux, DevOps, Ansible, Machine Learning, Generative AI, SAAS.
The above is the detailed content of Docker Hands-on: Learn Docker Compose File with Nodejs, Flask, PostgreSQL. For more information, please follow other related articles on the PHP Chinese website!