본문 바로가기

프로그래밍

사이드 프로젝트 vm 배포 해보기

0. 웨..?

  • 원래는 AWS로 사이드 프로젝트 배포를 해보려고 했는데, 비용 문제로 어떻게 유지할 지 궁금해서 멘토님께 여쭤봤더니 redis는 따로 올리는 게 보편적이고(ElastiCache), ec2 하나로 서버랑 redis랑.. 등등을 한꺼번에 배포 하려면 메모리 사용량 초과해서 과금이 될 수도..ㅎ라고 답변을 주셨다... 개인 PC 메모리 충분하면 virtualBox로 vm 만들어서 배포해보는 것도 네트워크나 리눅스 공부가 될 것 같다고 추천해주셔서, 도전해본다. chatGPT와 함께하는... 여행...ㅋ
  • PC 메모리가 16G, 프로젝트 띄우기만 하면 메모리 6G 정도가 필요하고, 기본적으로 2G를 사용하고 있으니.. 8G 정도 남는데... 안되면 노트북도 있으니 어떻게든 되지 않을지,,?ㅋ

1. 환경 구성

  • VM은 VirtualBox라고 지정을 해주셨으니, 난 여기에 따를 것이고
  • OS는 지금까지는 CentOS만 써봐서 CentOS로 할까 했는데.. 찾아보니 최근에는 Ubuntu를 많이 사용하고 커뮤니티도 더 잘 활성화 되어 있다고 해서 Ubuntu를 선택한다

기본 설정

DB 서버 (MySQL)

  • 기본 메모리 : 5G
  • 프로세서 : 3개
  • 디스크 크기 : 35G

API (Application, Kafka)

  • 기본 메모리 : 4G
  • 프로세서 : 2개
  • 디스크 크기 : 35G

Ubuntu에 Docker 및 Docker-compose 설치

# apt-get 업데이트
$ sudo apt-get update

# https 관련 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# Docker GPG 키 추가
$ curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo apt-key add 

# Docker apt 저장소 추가
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 시스템 패키지 업데이트
$ sudo apt-get update

# Docker 설치
$ sudo apt install docker.io
$ sudo snap install docker

# Docker 설치 확인
$ docker --version

# docker group 생성 (기본적으로 생성됨)
$ sudo groupadd docker

# docker group에 해당 유저 추가
$ sudo usermod -aG docker $USER

# docker-compose 설치 (최신 버전 확인 : https://github.com/docker/compose/releases)
$ sudo curl -L "https://github.com/docker/compose/releases/download/v[version]/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 권한 부여
$ sudo chmod +x /usr/local/bin/docker-compose

# 심볼릭 링크(바로가기?) 설정
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# Docker 로그 확인
$ docker logs --tail 50 --follow --timestamps [container]

MySQL 무한 재실행 에러 발생

  • 에러문
2024-07-02 13:26:04+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.4.0-1.el9 started. 
2024-07-02 13:26:05+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 
2024-07-02 13:26:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.4.0-1.el9 started. 
2024-07-02 13:26:05+00:00 [Note] [Entrypoint]: Initializing database files mysqld: Can't create directory '/var/lib/mysql/' (OS errno 17 - File exists) 
2024-07-02T13:26:05.414556Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 
2024-07-02T13:26:05.415590Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.4.0) initializing of server in progress as process 81 
2024-07-02T13:26:05.416958Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it. 
2024-07-02T13:26:05.416974Z 0 [ERROR] [MY-010119] [Server] Aborting 
2024-07-02T13:26:05.417371Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
  • 문제 발생
    ㅎㅎ 개발할 때 작성한 docker-compose 그대로 사용해서 한 번에 될 거라 생각 안했지만.. MySQL 컨테이너가 제대로 시작되지 않고 위의 에러를 뿜어내며 계속 재실행이 되풀이 됐다..
  • 해결 방법

docker-compose.yml


services:
  mysql:
    image: mysql:8.4.0
    container_name: mungstore-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mungstore
    ports:
      - 3306:3306
    volumes:
      - /home/db_data:/var/lib/mysql  # 1. /home/db_data 부분이 원래는 공유 폴더 였는데, 경로를 바꿔줌
                                        # 2. 도커를 실행 중인 사용자에게 /bome/db_data의 접근권한을 줌(아래 명령어 실행)
    networks:
      - mungstore

아래 명령어 실행

$ sudo chown $(whoami) /home/db_data 
$ sudo chgrp $(whoami) /home/db_data

docker-compose down 시 permission denied 에러 발생

  • 에러문
Error response from daemon: cannot stop container: CONTAINER ID: permission denied
  • 해결 방법

아래 명령어 실행

$ sudo aa-remove-unknown

외부에서 vm MySQL 접속하기

ERROR :: Can't connect to server on '192.168.137.1' (10061)

  • 접속이 안되는 것.. mysql이 꺼져있거나(설마)
  • ip가 틀렸거나
  • port가 틀렸거나

ERROR :: Lost connection to server at 'handshake': reading initial communication packet', system error: 0

  • GG..
  • bind-address 추가 건에 대하여..............
    • my.cnf를 수정해야 하는데... vi, vim도 안먹힘
    • apt, apt-get, yum도 안먹힘ㅠㅠ
    • docker bash apt-get, yum, dnf command not found 참고해서 vim 깔기 성공 ! $ microdnf install -y vim
    • 대부분의 글에서는 /etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 0.0.0.0를 추가하라고 설명해 주는데
    • 나는 /etc/my.cnf였음 (mysql 8.4.0)
    • 그리고 당연히 vm 터미널이 아니라 docker에 실행 중인 mysql 터미널에 있다는 것을.. ㅎㅎ(몰랐음)

docker-compose.yml


services:
  mysql:
    image: mysql:8.4.0
    container_name: mungstore-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mungstore
    ports:
      - 13306:3306  # [vm docker에서 mysql에 할당해 줄 port] : [접속할 때 사용할 port]
    volumes:
      - /home/mysql/db_data:/var/lib/mysql
    networks:
      - mungstore

가상 머신 포트 포워딩 설정

  • 머신 > 설정 > 네트워크 > 고급 > 포트 포워딩(P)

IP 주소 설정

  • 파일 > 도구 > 네트워크 관리자

가상 머신 간 통신하기

EEROR : Table 'db.table' doesn't exist. But it does (or it should)

ERROR : Error Code : 1030 Got error 168 - 'Unknown (generic) error from engine' from storage engine

  • DB 파일 꼬이거나 권한이 없거나 할 때 발생하는 듯
  • 파일 따로 생성해줘서 해결
2024-07-04 16:56:13 SQL State  : HY000
2024-07-04 16:56:13 Error Code : 1030
2024-07-04 16:56:13 Message    : Got error 168 - 'Unknown (generic) error from engine' from storage engine
2024-07-04 16:56:13 Location   : db/migration/V2__alter_table_member.sql (/deploy/nested:/deploy/api.jar/!BOOT-INF/classes/!/db/migration/V2__alter_table_member.sql)
2024-07-04 16:56:13 Line       : 1
2024-07-04 16:56:13 Statement  : ALTER TABLE MEMBER
2024-07-04 16:56:13 MODIFY LOGIN_FAIL_COUNT INTEGER NOT NULL DEFAULT 0

접속 성공~

'프로그래밍' 카테고리의 다른 글

정규표현식(Regular Expression)  (0) 2021.07.09