Docker

정재현·2022년 11월 1일
0

React

1) 프론트 프로젝트로 이동해 Dockerfile을 작성

FROM node:alpine
WORKDIR /FRONT
COPY package.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "run", "start"]

2) 이미지 생성

docker build -t front .


3) 이미지를 컨테이너로 실행

docker run --name hajwoing-front -d -p 3000:3000 hajwoing-front

Spring boot & DB

1) Dockerfile 작성

FROM adoptopenjdk/openjdk11
CMD ["./mvnw", "clean", "package"]
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Dspring.profiles.active=prod", "-jar", "app.jar"]

2) 이미지 생성

docker build -t hajwoing-back .

 ERROR [2/2] COPY target/*.jar app.jar  

=> 에러 발생 => build파일이 없었기 때문!!

./gradlew build

3) 이미지를 컨테이너로 실행

docker run -t hajwoing-back .

MySQL

1) Dockerfile작성

FROM mysql:5.7

ENV MYSQL_ROOT_PASSWORD=root

ENV MYSQL_DATABASE=hajwoing

2) 이미지 생성

docker build -t hajwoing-db -f DockerfileMySQL .

3) 이미지를 컨테이너로 실행

docker run -t hajwoing-db

결과

Docker Compose

=> 앞서 이미지를 생성, 빌드 과정을 일일이 하게된다면 프로젝트가 복잡해지면서 귀찮은 일이 될것이다.
=> Docker Compose를 활용해 과정을 통합

version: "3"

services:
  haejwoing-back: # 컨테이너 이름
    container_name:  hajwoing-back # 실행 컨테이너 이름
    build:
      context: .
      dockerfile: ./back/Dockerfile
    environment:
      SPRING_DATASOURCE_URL: "jdbc:mysql://localhost:3306/haejwoing?useUnicode=yes&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Seoul"
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
      SERVER_PORT: "8080"
    ports:
      - 8080:8080
    depends_on: # 이게 실행되어야 backend가 실행됨
      - haejwoing-mysql
    networks:
      - haejwoing_network
    restart: always
    command: "java -jar /app.jar"

  haejwoing-mysql:
    image: mysql:8.0.28
    cap_add:
      - SYS_NICE    #mbind: Operation not permitted 오류가 발생하지 않게 된다.

    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "hajwoing"
      MYSQL_USER: "root"
      MYSQL_PASSWORD: "root"
    command:
      [
          "--character-set-server=utf8mb4",
          "--collation-server=utf8mb4_unicode_ci"
      ]
    ports: # 내부의 3306포트가 외부의 3307포트로 연결됨. 외부에서 mysql에 요청하는건 없어서 신경 쓸 필요 없음. 포트 충돌떄문에 함
      - 3307:3306
    restart: always
    networks:
      - haejwoing_network

  haejwoing-front:
    container_name: haejwoing-front
    build:
      context: .
      dockerfile: ./front/DockerfileFront
    volumes:
      - '.:/app'
      - '/app/node_modules'
    ports:
      - 3001:3000
    environment:
      - NODE_ENV=development
      - CHOKIDAR_USEPOLLING=true



networks:
  haejwoing_network:
    driver: bridge

=> 이미지 생성되고 스프링 부트, 리액트, MySQL이 정상 실행된다.

profile
back end개발자로 성장하기

0개의 댓글

관련 채용 정보