k8s/docker

Docker 3tier Arc with nodejs&mysql&nginx

부엉이사장 2023. 11. 2. 20:05

# 기본 명령어들

웹 빌드 : docker build -t web_muzzi:1.0 -f ./web_Dockerfile .
와스 빌드 : docker build -t was_muzzi:1.0 -f ./was_Dockerfile .
db 빌드 : docker build -t db_muzzi:1.0 -f ./db_Dockerfile .

웹 런 : docker run -dp 8989:80 -v /muzziweb/web_volume:/usr/share/nginx/html --link was --link db --name web web_muzzi:1.0
와스 런 : docker run -d -v /muzziweb/was_volume/server.js:/app/server.js -v /muzziweb/was_volume/package.json:/app/package.json --link db --name was was_muzzi:1.0
디비 런 : docker run -d --name db db_muzzi:1.0 --default-authentication-plugin=mysql_native_password

 

순서는 db => was => web순으로 하시길..

 

# web_Dockerfile

FROM nginx:latest
RUN apt update
RUN apt-get install -y vim systemd iproute2 iputils-ping net-tools
WORKDIR /usr/share/nginx/html/
ADD ./web_volume/index.html ./index.html
WORKDIR /etc/nginx/conf.d/
ADD ./web_defaultconf ./default.conf

 

 

# was_Dockerfile

FROM node:latest
COPY ./was_volume/ /app
ENV DB_USER=muzzi
ENV DB_PASSWORD=dori
ENV DB_DATABASE=muzzidb
WORKDIR /app
RUN npm install express
RUN npm install mysql
RUN npm -g install
CMD ["npm","start"]

 

# db_Dockerfile

FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD=test123

ENV MYSQL_DATABASE=muzzidb
ENV MYSQL_USER=muzzi
ENV MYSQL_PASSWORD=dori

EXPOSE 3306

 

 

# web_defaultconf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /db {
        proxy_pass   http://was:3000;
    }

    location /was {
        proxy_pass   http://was:3000;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

 

 

# web_volume/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
    <button id="dori">was btn</button>


    <button id="muzzi">db btn</button>
    <script>
        console.log('hello index')
        document.getElementById("muzzi").addEventListener("click",()=>{axios.get('/db').then((res)=>{
            alert(JSON.stringify(res.data))
        })})
        document.getElementById("dori").addEventListener("click",()=>{axios.get('/was').then((res)=>{
            alert(res.data)
        })})

    </script>


</body>
</html>

 

 

 

# was_volume/package.json

{
  "name": "b",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.2",
    "mysql": "^2.18.1",
    "nodemon": "^3.0.1"
  }
}

 

 

# was_volume/server.js

const express = require("express");
const app = express();
const mysql = require('mysql')
const cors = require('cors')

let corsOptions = {
    origin: '*',
    credential: true,
  }


app.use(cors(corsOptions))

let env = process.env;
const connection = mysql.createConnection({
    host     : 'db',
    user     : env.DB_USER,
    password : env.DB_PASSWORD,
    database : env.DB_DATABASE
  });

app.get("/was", (req, res)=> {
    res.send('was연결됐음')
});


app.get("/db", (req, res)=> {
    connection.query('show databases;', (error, rows, fields) => {
        if (error) throw error;
        res.send(JSON.stringify(rows));
      });

});

app.listen(3000, ()=> {
  console.log("서버가동");
})