Docker 배포 최적화 및 DB 유지 1.08GB -> 340MB

기존 Docker 이미지의 크기가 1.08 기가 정도로 너무 컸던 문제가 있었다.
그걸 개선하고 컨테이너를 재실행하더라도 Database 내용을 유지할수 있도록 개선하려고 한다.
이를통해 1.0GB -> 340MB 로 이미지 사이즈를 최적화 할수 있었고, 배포 실행속도도 엄청나게 빨라졌다.

기존 상태

Dockerfile

docker-compose.yml

version: '3.8'
services:
  web:
    image: nginx:latest
    volumes:
      - ./deploy/config/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./client/build:/usr/share/nginx/html
    depends_on:
      - app
    ports:
      - '80:80'

  app:
    build:
      context: .
      dockerfile: deploy/docker/server.Dockerfile
    depends_on:
      - db
    environment:
      TZ: 'Asia/Seoul'
    volumes:
      - ./server:/app
    working_dir: /app
    command: sh -c "yarn install && yarn build && pm2-runtime start dist/main.js"
    networks:
      default:
        aliases:
          - app

  db:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: 'store'
      MYSQL_USER: 'woowa'
      MYSQL_PASSWORD: 'woowa'
      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
      TZ: 'Asia/Seoul'
    networks:
      default:
        aliases:
          - db

Dockerfile 개선

multi-stage 방식으로 Dockerfile 을 개선했다. 겸사겸사 파일명도 Dockerfile 로 변경했다.

docker-compose.yml 개선

volumes 매칭을 삭제하고, command 실행은 Dockerfile 에서 수행한다.
변경된 부분

  app:
    build:
      context: .
      dockerfile: deploy/docker/Dockerfile
    depends_on:
      - db
    environment:
      TZ: 'Asia/Seoul'
    networks:
      default:
        aliases:
          - app

여기까지 진행했을 때, 1.08GB 였던 app 이미지파일이 340MB 로 약 3분의 1로 축소됐다. 그리고 실행속도 또한 엄청나게 빨라졌다.

Database 개선

docker 컨테이너를 재실행해도 db 데이터가 남아있을 수 있도록 volume 마운트를 추가하고, mbind 에러를 방지하기 위해
cap_add: SYS_NICE 를 추가했다.
그리고, 임시로 workbench 를 통해 확인할수 있도록 ports를 개방했다. 또한, mysql latest로 된걸 현재 돌아가는 버전으로 명시하도록 변경했다.
아래 코드를 보면 cap_add: - SYS_NICE가 있다.
https://data-engineer-tech.tistory.com/27
이 옵션이 없었을 때 mbind: Operation not permitted 라는 경고메시지가 계속 출력되서 해결방안을 찾아봤다.
위 글을 보면 mbind는 리눅스 명령어로 메모리 범위에 대한 메모리 정책설정을 뜻하는데, 권한이 없어서 생기는 문제라고 예상한다고 한다. 그래서 그것에 대한 권한을 추가해준다.
변경된 부분

db:
  image: mysql:8.0.26
  environment:
    MYSQL_DATABASE: 'store'
    MYSQL_USER: 'woowa'
    MYSQL_PASSWORD: 'woowa'
    MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
    TZ: 'Asia/Seoul'
  cap_add:
    - SYS_NICE
  volumes:
    - ./deploy/data/mysql:/var/lib/mysql
  ports:
    - '33061:3306'
  networks:
    default:
      aliases:
        - db

좋은 웹페이지 즐겨찾기