Mục tiêu
Trong bài viết này chúng ta sẽ tiến hành cấu hình môi trường để deploy ứng dụng React với Nginx trong Docker
.
Tiến hành
1. Init project
Trước tiên để có thể deploy ứng dụng thì ta cần 1 project, ở đây mình sẽ bắt đầu với project cơ bản nhất của React.
npx create-react-app my-app
Sau khi init project xong, chúng ta sẽ có 1 cấu trúc dự án như sau
├── package.json
├── public
│ ├── ...
│ └── robots.txt
├── README.md
├── src
│ ├── ...
│ └── App.js
└── yarn.lock
2. Setup Docker
Tiếp đó ta thêm 1 vài file config sau
+ ├── docker-compose.yml
+ ├── Dockerfile
+ ├── .dockerignore
+ ├── .nginx
+ │ └── nginx.conf ├── package.json ├── public │ ├── ... │ └── robots.txt ├── README.md ├── src │ ├── ... │ └── App.js └── yarn.lock
2.1. .dockerignore
Nó sẽ ignore các file chúng ta không muốn copy vào trong image, từ đó giúp cho giảm kích thước của image tối đa.
node_modules
npm-debug.log
build
.dockerignore
**/.git
**/.DS_Store
**/node_modules
2.2. Folder .nginx
Đây sẽ folder để config nginx
File nginx.conf
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri /index.html =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
listen 80
:nginx
sẽ listen port 80 trong container để hiển thị app.try_files
: Đối với React sẽ là single page, tức là chỉ có 1 route duy nhất để hiển thị toàn bộ app. Với thứ tựtry_files
như trên nginx sẽ duyệt lần lượt theo thứ tự$uri > /index.html > 404(not found page)
để kiểm tra, nếu k hợp lệ thì sẽ chuyển đến route tiếp theo để kiểm tra và hiển thị.error_page
: một vào route lỗi hiển thị mặc định.
2.3. File Dockerfile
# 1. For build React app FROM node:lts AS development # Set working directory WORKDIR /app # COPY package.json /app/package.json COPY package-lock.json /app/package-lock.json # Same as npm install RUN npm ci COPY . /app ENV CI=true ENV PORT=3000 CMD [ "npm", "start" ] FROM development AS build RUN npm run build # 2. For Nginx setup FROM nginx:alpine # Copy config nginx COPY --from=build /app/.nginx/nginx.conf /etc/nginx/conf.d/default.conf WORKDIR /usr/share/nginx/html # Remove default nginx static assets RUN rm -rf ./* # Copy static assets from builder stage COPY --from=build /app/build . # Containers run nginx with global directives and daemon off ENTRYPOINT ["nginx", "-g", "daemon off;"]
2.4. Folder docker-compose.yml
Để đơn giản cho việc run Docker và tích hợp với nhiều service khác, ta sẽ viết thêm docker-compose.yml
version: "3.7" services: frontend: build: context: . container_name: frontend ports: - "3000:80" # map 80 in container => 3000 in local
3. Run Docker
- Start container
$ docker-compose up -d Building frontend Sending build context to Docker daemon 1.49MB Step 1/17 : FROM node:lts AS development ---> 9153ee3e2ced Step 2/17 : WORKDIR /app ---> Using cache ---> a7909d92148a Step 3/17 : COPY package.json /app/package.json ---> 2e690dfe99b2 Step 4/17 : COPY package-lock.json /app/package-lock.json ---> dd0132803f43 ..... Step 16/17 : COPY --from=build /app/build . ---> Using cache ---> 447488bdf601 Step 17/17 : ENTRYPOINT ["nginx", "-g", "daemon off;"] ---> Using cache ---> 6372a67cf86f Successfully built 6372a67cf86f Successfully tagged react-nginx_frontend:latest
Sau khi run xong chúng ta xem ứng dụng ở http://localhost:3000
- Stop container
$ docker-compose down Stopping frontend ... done Removing frontend ... done Removing network react-nginx_default
3. Tổng kết
Trên đây là hướng dẫn cấu hình để triển khai 1 ứng dụng React, Nginx trong Docker
.
Các bạn có thể xem code tại đây github