This repository is for learning how to use nginx with docker
a website sample with nginx
FROM node:20.10.0-alpine
WORKDIR /app
COPY server.js .
COPY index.html .
COPY images ./images
COPY package.json .
RUN npm i --production
EXPOSE 3000
USER node
ENTRYPOINT [ "node", "./server.js" ]docker build -t myapp:1.0 .docker images | grep myappdocker run -p --name=myapp -e APP_NAME=node-app 3000:3000 myapp:1.0 services:
node-app-1:
container_name: node-app-1
build:
context: .
dockerfile: ./Dockerfile
image: node-app
ports:
- 3001:3000
environment:
- APP_NAME=node-app-1
networks:
- node-app
node-app-2:
container_name: node-app-2
build:
context: .
dockerfile: ./Dockerfile
image: node-app
ports:
- 3002:3000
environment:
- APP_NAME=node-app-2
networks:
- node-app
node-app-3:
container_name: node-app-3
build:
context: .
dockerfile: ./Dockerfile
image: node-app
ports:
- 3003:3000
environment:
- APP_NAME=node-app-3
networks:
- node-app
networks:
node-app:
name: node-app
driver: bridgeconcept of nginx
for demo, we generate self-signed certificate
- create certificate folder
mkdir nginx-certs- create certficate
cd nginx-certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crtworker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
upstream nodejs_cluster {
least_conn;
server node-app-1:3000;
server node-app-2:3000;
server node-app-3:3000;
}
server {
listen 443 ssl;
server_name nginx;
ssl_certificate /nginx-certs/nginx-selfsigned.crt;
ssl_certificate_key /nginx-certs/nginx-selfsigned.key;
location / {
proxy_pass http://nodejs_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
services:
node-app-1:
container_name: node-app-1
build:
context: .
dockerfile: ./Dockerfile
image: node-app
environment:
- APP_NAME=node-app-1
networks:
- node-app
node-app-2:
container_name: node-app-2
build:
context: .
dockerfile: ./Dockerfile
image: node-app
environment:
- APP_NAME=node-app-2
networks:
- node-app
node-app-3:
container_name: node-app-3
build:
context: .
dockerfile: ./Dockerfile
image: node-app
environment:
- APP_NAME=node-app-3
networks:
- node-app
nginx:
container_name: nginx
image: nginx
ports:
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx-certs:/nginx-certs
restart: always
networks:
- node-app
depends_on:
- node-app-1
- node-app-2
- node-app-3
networks:
node-app:
name: node-app
driver: bridgecurrent only could access through https://localhost:443
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
upstream nodejs_cluster {
least_conn;
server node-app-1:3000;
server node-app-2:3000;
server node-app-3:3000;
}
server {
listen 443 ssl;
server_name nginx;
ssl_certificate /nginx-certs/nginx-selfsigned.crt;
ssl_certificate_key /nginx-certs/nginx-selfsigned.key;
location / {
proxy_pass http://nodejs_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name nginx;
location / {
return 301 https://$host$request_uri;
}
}
}






