본문 바로가기
Development(Web, Server, Cloud)/22) LINUX - Cloud

클라우드 프로젝트 1-2 - docker, react, express, mysql, k8s, ansible 이게 모냐...

by tonyhan18 2022. 3. 30.
728x90

아직도 못죽었다... 언제 죽냐

 

이번에는 React와 Node.js 를 묶어서 하나의 이미지 파일로 만드어야 한다.

 

FROM node:16.14.1
WORKDIR /app
COPY . .
RUN yarn install

WORKDIR /app/client
RUN npm install --silent
RUN npm install react-scripts@5.0.0 -g --silent

WORKDIR /app/server
RUN npm install --silent

EXPOSE 3000

WORKDIR /app
CMD ["yarn", "dev"]

 

docker build -t tonyhan18/react-node-mysql

 

문제는 여기에서 발생했다.

 

처음에 server는 그냥 docker image ip를 따라가면 되었는데 image build가 되니까 이게 안된다.

그래서 server 가 바라보는 db의 주소를 바꾸어주었다.

 

 

이번에는 또 node 버전 문제가 발생했다. 그냥 node:alpine을 설치하기로 했다.

 

version: "3.1"
services:
  mysql:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=TEst!234

  adminer:
    image: adminer
    restart: always
    network_mode: host
    ports:
      - 8080:8080

  react-node-mysql:
    image: tonyhan18/react-node-mysql
    container_name: react-node-mysql
    restart: always
    ports:
      - 3000:3000
    network_mode: host

 

docker compose에 이미지들을 추가해주고 다시 시작하려고 했는데

 

docker.errors.InvalidArgument: “host” network_mode is incompatible with port_bindings

 

라는 에러가뜬다.

 

---

 

const express = require("express");
const bodyParser = require("body-parser");
const mysql = require("mysql");

const app = express();
const port = process.env.PORT || 5000;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

const connection = mysql.createConnection({
  connectionLimit: 10,
  host: "mysql",
  user: "root",
  password: "TEst!234",
  database: "myapp",
});
connection.connect();

// connection.pool.query(
//   `CREATE TABLE table1 (
//    name CHAR(10),
//    PRIMARY KEY (name)
// )`,
//   (err, results, fields) => {
//     console.log("results", results);
//   }
// );

app.get("/api/db", (req, res) => {
  let sql = "select * from table1";
  connection.query(sql, (err, rows) => {
    if (err) {
      res.send("Opps. Error\n");
    } else {
      res.send(rows);
    }
  });
});

app.get("/api/delete", (req, res) => {
  let sql = "delete from table1";
  connection.query(sql, (err, rows) => {
    if (err) {
      res.send("삭제가 실패했습니다.\n");
    } else {
      res.send("모든 데이터가 삭제되었습니다.");
    }
  });
});

// API 라우팅 !!!
app.post("/api/insert", (req, res) => {
  let sql = `insert into table1 (name) value ('${req.body.post}');`;
  connection.query(sql, (err, rows) => {
    if (err) {
      res.send("삽입이 실패했습니다.");
    } else {
      res.send("삽입이 완료 되었습니다.");
    }
  });
});

app.listen(port, () => console.log(`Listening on port ${port}`));

위와같이 수정했다.

 

mysql

FROM mysql:5.7

#mysql내 my.cnf 설정을 my.cnf 파일로 덧씌운다. 
ADD ./my.cnf /etc/mysql/conf.d/my.cnf

Dockerfile

 

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8

my.cnf

DROP DATABASE IF EXISTS myapp;

CREATE DATABASE myapp;
USE myapp;

CREATE TABLE table1(
    name CHAR(20),
    PRIMARY KEY (name)
)

sqls/initialize.sql

 

 

version: "3.7"

services:
  mysql:
    build: ./mysql
    restart: unless-stopped
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/sqls/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_USER: user1
      MYSQL_ROOT_PASSWORD: TEst!234
      MYSQL_DATABASE: myapp
      MYSQL_TCP_PORT: 3306

  react-node-app-with-mysql:
    image: tonyhan18/react-node-mysql:1.2
    container_name: react-node-app
    restart: always
    ports:
      - 3000:3000

docker-compose.yml

 

지랄맞다. 이건 또 뭔 에러냐

 

안되겠다. 안타깝지만 프로젝트 1,2 에서 다룬것은 포기하고

docker-compose.yml만 가지고서 k8s와 ansible을 붙여야 할거 같다.

728x90