Dockerfile 是一份文字檔案裡面寫著
Image就是根據 Dockerfile 所做成的
Step1: 在桌面建立docker-node-app資料夾
Step1: 建立 package.json -> 這個是Node.js專案的設定檔,檔案內容如下:
{
"name": "docker-node-app",
"version": "1.0.0",
"description": "A simple Node.js app running in Docker",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
Step2: 建立 app.js -> 會開一個 Web Server,檔案內容如下:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from Docker + Node.js!');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Step3: 初始化 npm
到 Terminal 中 cd 到剛剛建立的 docker-node-app資料夾下npm install
-> 資料夾中會有node_modules
Step1: 建立一個新檔案 Dockerfile,內容如下:
# 使用官方 Node.js base image
FROM node:18
# 建立 app 目錄
WORKDIR /usr/src/app
# 複製 package.json + package-lock.json
COPY package*.json ./
# 安裝 app dependencies
RUN npm install
# 複製整個專案到容器內
COPY . .
# 對外開放 3000 port
EXPOSE 3000
# 啟動指令
CMD [ "npm", "start" ]
提醒: Dockerfile 沒有副檔名,不要存成Dockerfile.txt
Step1:到 Terminal 中 cd 到剛剛建立的 docker-node-app資料夾下,輸入指令:docker build -t docker-node-app .
部份 | 說明 |
---|---|
-t 你想取的Image名字 |
幫Image取個名字 |
. |
表示在目前這個資料夾下尋找 Dockerfile |
輸入docker run -d -p 3000:3000 docker-node-app
,成功後接著打開瀏覽器,輸入:
http://localhost:3000 ,看到以下畫面表示成功:
docker-compose 可以解決多容器管理的問題,可以一鍵啟動前後端+資料庫,
也是一個純文字檔,叫做 docker-compose.yml,用來告訴 Docker 的容器設定內容像是:
docker-compose up
就能一次全部啟動好在剛建立的 docker-node-app 資料夾哩,新增一個檔案: docker-compose.yml
檔案內容如下:
services:
web:
build: .
ports:
- "3000:3000"
部份 | 說明 |
---|---|
build: . |
直接用現在資料夾的 Dockerfile 來 build |
ports: |
把容器內的 3000 port,綁到主機的 3000 port |
提醒: 是.yml,不是.yaml喔
在 docker-node-app/ 資料夾下打開 Terminal,輸入:docker-compose up -d
可以來看看有沒有成功跑起來輸入: docker ps
提醒: 要先檢查有沒有容器正在佔用 port 3000,有的話手動停掉或刪掉啟動的容器
相信做到這裡的人應該對 Docker 有一定的熟悉了,以下有些動作都有做過,就不多做解釋了。
預計結構如下:
docker-node-mysql/
├── backend/
│ ├── app.js
│ └── package.json
├── docker-compose.yml
Step1: 在桌面建立一個新的資料夾叫 docker-node-mysql
Step2: 在 docker-node-mysql 資料夾下建立一個叫 backend 的資料夾
Step3: 在 docker-node-mysql/backend/下建立兩個檔案: package.json、app.js,檔案內容如下:
package.json
{
"name": "docker-node-mysql",
"version": "1.0.0",
"description": "Node.js + MySQL docker-compose example",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.18.2",
"mysql2": "^3.2.0"
}
}
app.js
const express = require('express');
const mysql = require('mysql2');
const app = express();
const port = 3000;
// 設定資料庫連線(主機用 mysql --> 等下Compose會自動解析)
const db = mysql.createConnection({
host: process.env.DB_HOST, // 這邊填 "mysql"(service 名稱)
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
// 測試資料庫連線
db.connect(err => {
if (err) {
console.error('資料庫連線失敗:', err);
return;
}
console.log('資料庫連線成功!');
});
// 路由
app.get('/', (req, res) => {
db.query('SELECT NOW() AS now', (err, results) => {
if (err) throw err;
res.send(`Database time: ${results[0].now}`);
});
});
// 啟動 Server
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
Step4: 在 docker-node-mysql/下新增: docker-compose.yml
檔案內容如下:
services:
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: testdb
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3307:3306"
backend:
build: ./backend
ports:
- "3000:3000"
depends_on:
- mysql
volumes:
mysql_data:
服務 | 說明 |
---|---|
mysql |
用官方mysql:5.7 image |
backend |
用自己寫的 Node.js(從 backend 資料夾裡 build) |
depends_on |
backend 一定會在 mysql 之後才啟動 |
volumes |
把 MySQL 資料存起來 |
ports |
對外開放 port3307給MySQL 和 port3000給Web Server |
Step4: 在 backend/ 資料夾下再新增: Dockerfile,內容如下:
FROM node:18
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
備註: 跟之前的很像,唯一差別是這次是給 backend/ 使用的
Step5: 在 Terminal 先 cd 到 docker-node-mysql,輸入:docker-compose up -d
-> 會自動用 MySQL image、build backend image、啟動 backend+mysql、建立 Volume
打開瀏覽器輸入http://localhost:3000 驗證成果,成功的話會顯示當下資料庫的時間,這表示 Node.js 有成功連線到 MySQL 並查詢資料回來,畫面如下:
這邊的操作簡單帶過~
Step1: 到 GitHub Repository 新增一個 New repository,叫 docker-node-mysql
提醒: 要選 Public,因為 Render 免費版只支援 Public
Step2: 把專案 push 到 GitHub
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/你的GitHub帳號/docker-node-mysql.git
git push -u origin main
Step1: 先去登入或註冊 Render帳號 (用GitHub註冊或登入)
Step2: 創建 Web Service,點 New -> Web Service -> 連接到你的 GitHub -> 用 docker-node-mysql repo
設置畫面如下:
設置 | 內容 |
---|---|
Name |
docker-node-mysql-backend |
Language |
Docker |
Branch |
main |
Region |
Singapore (Southeast Asia) |
Root Directory |
backend (因為剛剛把 Dockerfile 放在 backend 資料夾裡) |
Instance Type |
Free |
Environment Variables |
DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USER(這些Key的Value等等填 |
Render 現在免費版只有支援 PostgreSQL!,為了能免費做完,我們現在需要去 Railway 註冊帳號
Step1: 點選 new project -> Deploy MySQL ( 接下來就可以把剛剛 render 裡面的沒設完的 Value 填完)
railway deploy mysql 完畫面應該長這樣:
Environment Variables | 剛 Deploy 的 MySQL 裡的 variables 對照填入 |
---|---|
DB_HOST |
MYSQL_PUBLIC_URL 注意要複製的是中間那段 @中間: |
DB_NAME |
MYSQLDATABASE |
DB_PASSWORD |
MYSQLPASSWORD |
DB_PORT |
MYSQL_PUBLIC_URL 注意要複製冒號後面的數字 |
DB_USER |
MYSQLUSER |
Last Step: 回 Render 點 Deploy Web Service (Render 就會自動 clone 你的 repo,用backend/Dockerfile build,並啟動一個 Node.js server)
部署完成可以根據 Render 給的公開網址連看看!
成功的話,表示有顯示資料庫現在的時間,代表 Node.js 成功連到 Railway 的 MySQL 資料庫了!畫面如下:
有到這邊的應該都快發瘋了,這套流程就像公司專案會使用的標準了,恭喜!!下次再來做一個更加進階完整功能的專案,期待一下哈哈
[上一篇] Day2
[下一篇] Day4
docker compose的version應該都拿掉囉~
image可以記得加上tag,不然都會被帶上latest。
好的我還在學習,謝謝提醒!!
馬上修改