Xây dựng Nodejs-ExpressJS với mysql sử dụng docker và docker-compose
Bài đăng này đã không được cập nhật trong 2 năm
Hí anh em. Bài viết này là kết quả của việc học tập sử dụng Docker sau bao ngày nghịch ngợm của mình.
Nếu anh em chưa biết docker là gì có thể xem qua một số bài viết để hiểu thêm docker nhé.
Hiểu sơ sơ thì nó là cái giúp chúng ta rút ngắn thời gian để cài đặt và cấu hình dự án
Cài đặt
Cài đặt docker và docker-compose
Ở Trang chủ của docker có nhiều sự lựa chọn cho chúng ta sử dụng và vì mình sử dụng ubuntu lên mình chỉ cài đặt câu lệnh thôi nhé. Cùng chạy câu lệnh dưới đây hoặc có thể vào trang chủ cài đặt trực tiếp để lấy bản mới nhất nhé !
sudo apt-get remove docker docker-engine docker.io containerd runc // xóa docker phiên bản cũ
Cài đặt kho lưu trữ cho docker
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Cài đặt docker và docker-compose
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
=> Đấy lấy từ docs đấy. anh em vào docs đọc cho tăng khả năng dịch ing lịch nhé .
Cài đặt và setup ExpressJS và mysql package
Đây là kết quả sau khi chúng ta cài đặt nhé.
Dockerfile
là dùng để tạo ra image nhé- docker-compose.yml là file giúp chúng ta định nghĩa và chạy chương trình
- Ngoài ra mình có cài một số package như :
Sequelize, sequelize-cli, dotenv, nodemon, mysql2
.
Cài đặt ExpressJS
tạo thư mục myapp
và truy cập vào file đó chạy câu lệnh.
npm init
npm install express
npx express-generator
sau khi chạy thành công thì chúng ta sẽ được thư mục có dạng như thế này nè .
Cài đặt package liên quan
Tiếp tục cài đặt các package nhé.
npm install --save sequelize
npm install --save mysql2
npm install --save-dev sequelize-cli
npx sequelize-cli init
npm install --save nodemon
npm install --save dotenv
Sequelize là package giúp chúng ta thao tác với cơ sở dữ liệu một cách nhanh chóng thuận tiện và dễ sử dụng, ngoài ra chúng còn có hỗ trợ kết nối với rất nhiều cơ sở dữ liệu nếu bạn thích có thể đọc qua docs nhé.
Mysql là package hỗ trợ kết nối tới mysql nhé.
Sequelize-cli giúp chúng ta tạo model, migrate, seed , giống như Laravel ý.
dotenv: Giúp chúng ta tạo ra biến môi trường và sử dụng nó ở mọi nơi. tạo file .env để sử dụng thôi nhé
nodemon: package này sẽ lắng nghe sự thay đổi của file và cập nhập chúng thay vì phải chạy lại ứng dụng bằng cơm .
chạy bằng cơm
nghĩa là nếu bạn thay đổi file nào đó thì sẽ phải chạy server thì mới có sửa đổi mới nhất.
thêm đoạn dưới đây vào package.json
nhé
"scripts": {
"start": "nodemon --inspect ./bin/www"
},
Mở file routes/index.js:
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.send('le dac khoan 3');
});
module.exports = router;
và kết quả cuối tùng sẽ là như thế này nè:
Cài đặt và cấu hình với docker nhé.
Ở phần này chúng ta cùng tìm hiểu qua dockerfile
và docker-compose.yml
.
dockerfile
giúp chúng ta tạo image sau đó chạydocker-compose.yml
được dùng để các service chạy cùng một môi trường đó (cụ thể là web và mysql)
Tạo dockerfile
tạo file docker ở trong thư mục myapp nhé.
FROM node:14
WORKDIR /app
COPY package.json .
COPY . .
RUN npm install
CMD npm start
- FROM là mình sẽ pull image của node có sẵn trên hub (cái này tuỳ thuộc bạn dùng phiên bản node nào nhé), bạn có thể tham khoả node ở đây.
- WORKDIR là tạo thư mục để chúng ta thiết lập các câu lệnh.
- COPY là chúng ta copy những thư mục vào thư mục ảo trong docker
- RUN câu lệnh này sẽ chạy trong lúc build image
- CMD là câu lệnh chạy sau khi build image thành công
Bạn có thể loại bỏ một số file không mong muốn khi chạy tiến trình copy thư mục bằng cách tạo file .dockerignore
Tạo docker-compose.yml
version: '3.7'
services:
mysql:
platform: linux/x86_64
image: mysql:5.7
container_name: mysql-nodejs
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: nodejs
ports:
- "3308:3306"
volumes:
# Mysql
- db:/var/lib/mysql
networks:
- nodejss
web:
depends_on:
- mysql
build: ./myapp
ports:
- "3000:3000"
volumes:
- ./myapp/:/app
restart: unless-stopped
container_name: nodejs
stdin_open: true
tty: true
networks:
- nodejss
volumes:
db:
networks:
nodejss:
- services được hiểu là các container mà bạn muốn cài đặt và ở đây mình khai báo mysql và web
- image chỉ ra image bạn muốn cài đặt
- container_name: tên con tainer
- platform: do dùng chip ARM nên bắt buộc phải dùng thì mới pull được image mysql
- volumes: giúp chúng ta lắng nghe sự thay đổi local để thay đổi docker.
- ports: mapping port docker và local
- depends_on : thiết lập sự phụ thuộc giữa các container với nhau
- build: chỉ ra chúng sẽ đi tìm file dockerfile để thực thi Các bạn có thể tham khảo docs của docker-compose để tham khảo nhiều option nhé :v
Giờ chạy terminal để xem nào anh em
docker-compose up
Cùng xem kết quả nào.
Tạo model migrate
để kiểm tra mysql đã hoạt động được chưa bằng cách tạo model và migrate nhé.
- Mở file config/config.json
{
"development": {
"username": "root",
"password": "123456",
"database": "nodejs",
"host": "mysql",
"dialect": "mysql",
"port": "3306"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql",
"port": "3307"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql",
"port": "3307"
}
}
Ở đây có 3 môi trường và môi trường mình sử dụng là development, chúng ta chỉ cần điền những gì chúng ta khai báo mysql
ở docker-compose.yml.
- Tạo model và migrate
docker-exec -it nodejs sh
npx sequelize-cli model:generate --name Student --attributes firstName:string,lastName:string,email:string
npx sequelize-cli db:migrate
- docker-exec: Đây là câu lệnh chạy command trong container
- npx sequelize-cli model:genarate dùng để tạo model migrate
- npx sequelize-cli db:migrate dùng để chạy các file ở trên.
Và kết quả là :
Lời kết
- Bài viết này là quá trình mình tìm hiểu docker và cũng là sản phẩm đầu tay do mình tự nghịch có thể còn nhiều sai sót
- Cảm ơn mọi người đã xem hết bài viết này của mình, mình luôn đón nhận những comment từ các bạn :3
- Bài viết này mình chưa sử dụng nginx để cân bằng tải :v. Mình sẽ sửa trong thời gian ngắn nhất
- link github.
All rights reserved