首頁 >web前端 >js教程 >Docker 實作:學習 Docker 使用 Nodejs、Flask、PostgreSQL 編寫文件

Docker 實作:學習 Docker 使用 Nodejs、Flask、PostgreSQL 編寫文件

Linda Hamilton
Linda Hamilton原創
2025-01-14 18:28:14640瀏覽

Docker Hands-on: Learn Docker Compose File with Nodejs, Flask, PostgreSQL

在上一篇文章中,我們提到了 Docker 教學。

  • https://dev.to/omerberatsezer/docker-tutorial-dockerfile-commands-container-images-volume-network-docker-compose-2p9h

這次,我們開始運行範例專案:專注於使用 Nodejs、Flask、PostgreSQL 映像的 Docker Compose 檔案來實現不同的層:

  • 前端(nodejs 和expressjs),
  • 後端(燒瓶),
  • 資料庫(postgresql)。

它顯示:

  • 如何運作多個容器
  • 如何使用depends_on順序運行容器
  • 如何在同一網路中運作容器
  • 如何在撰寫文件中建立卷宗
  • 如何實現連接埠轉送

GitHub 代碼倉庫: https://github.com/omerbsezer/Fast-Docker/tree/main/hands-on-sample-projects/full-stack-app

專案結構:

project-root/
├── docker-compose.yaml
├── frontend/
│   ├── package.json
│   ├── index.js
│   ├── index.html
│   ├── Dockerfile
├── backend/
│   ├── app.py
│   ├── requirements.txt
│   ├── Dockerfile
  • 建立前端目錄,建立Dockerfile:
FROM node:18
WORKDIR /home/app
COPY . .
EXPOSE 3000
RUN npm install
CMD ["npm", "start"]
  • 建立index.html:
<!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>
  • 創建index.js(express js):
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}`);
});
  • 建立package.json:
{
  "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"
  }
}
  • 然後,建立後端目錄,並建立Dockerfile:
FROM python:3.11
WORKDIR /usr/src/app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
  • 使用 Flask 建立後端應用程式:
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)
  • 建立requirements.txt:
flask
  • 最後在後端和前端目錄之上建立 docker-compose.yaml:
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:
  • 然後,在 docker-compose.yaml 上執行指令:
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  
  • 然後,用curl檢查前端、後端:
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

結論

這篇文章展示如何使用範例前端 (express.js)、後端 (flask)、資料庫 (postgresql) 應用程式建立 Docker compose 檔案。如果您以前沒有看過,請查看下面的選單,以了解其他 Docker 內容。

專注於 AWS、Kubernetes、Docker、Linux、DevOps、Ansible、機器學習、生成式 AI、SAAS 的提示、教學和實作實驗室。

  • https://github.com/omerbsezer/
  • https://www.linkedin.com/in/omerberatsezer/

以上是Docker 實作:學習 Docker 使用 Nodejs、Flask、PostgreSQL 編寫文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn