[CentOS] 도커로 웹서비스 환경 구축해보기 (Docker, SpringBoot, React, Nginx, MariaDB)

이종현·2023년 9월 11일
1

OS

목록 보기
2/2

개요

회사 사람들과 사이드 프로젝트로 평소 사용하던 개발 서버 환경을 놀고 있는 서버(CentOS 7)에 구축해보기로 했다.

1차 목표는 nginx - front - backend 구동 환경을 도커 내에 구축해보기 였다. (2차는 쿠버네티스, CI/CD 환경 구축 ..)

진행 순서는 아래와 같다

  1. centos 7 버전의 도커 이미지 받기 & 컨테이너로 띄우기
  2. 컨테이너 내에 백엔드 환경 구축
  3. 컨테이너 내에 프론트 환경 구축(nginx 설정)
  4. 포트포워딩 및 테스트

물론 백엔드 환경 , nginx 환경을 구축하여 도커 허브에 올라와 있는 이미지도 있겠지만

나는 실습을 위해 centos 만 깔려있는 도커 이미지 내에 구축하기로 했다.


CentOS 7 도커 이미지 생성하기

1) docker hub에서 centos 7 버전으로 이미지를 pull 받는다.

$ docker search centos
$ docker image pull centos:7

2) centos7 이미지로 컨테이너를 띄운다.

  • -privileged 옵션 : 호스트의 주요 자원(네트워크 등)에 접근 가능하도록 하는 옵션
  • -name : 컨테이너 명칭
  • d : 컨테이너가 백그라운드에서 실행하도록 하는 옵션
$ docker run --privileged --name mkone1 -d centos:7 /sbin/init

3) 도커 내부 접근해보기

$ docker exec -it mkone1 /bin/bash

도커 컨테이너에 백엔드 환경 구축

현재 컨테이너 내부는 centos 만 깔려있는 깡통 서버이다.

여기에 spring boot 서버가 구동 될 수 있게 (jar파일이 실행될 수 있게) java 설치, mariaDB 설치 및 세팅, 호스트 볼륨 마운트 작업을 진행한다

단, 실습 편의를 위해서 DB를 도커 내부에 설치하지만 컨테이너 삭제시 다 날라가기 때문에  !!

호스트에 DB를 설치해놓고 마운트하여 사용하는게 좋다 (추후 바깥으로 뺄 예정 )

JAVA 설치

1) java 설치

# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel

2) 환경 변수 등록

/usr/bin/java 경로에는 심볼릭 링크가 걸려있기 때문에 실제 경로를 찾아서 환경변수에 등록해줘야 한다.

  • java 실제 경로 찾기
# readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java
  • 환경 변수 등록 ( JAVA_HOME 다음에 위의 경로 입력)
# vi ~/.bashrc
...
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH
  • 환경 변수 바로 적용 (재진입 안해도 됨)
source ~/.bashrc

위와 같이 진행하면 자바 설치 및 환경 변수 적용이 끝난다.

  • 설치 확인하기
# echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java

# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)

MariaDB 설치

1) mariaDB 에 대한 yum repository 저장소를 추가

yum을 통해 패키지를 설치할 때는 yum repository에서 찾아서 설치하기 때문에, mariaDB에 대한 repository가 없다면 설치할 수 없다.

# vi /etc/yum.repos.d/MariaDB.repo

[mariadb]
name = MariaDB
baseurl = <http://yum.mariadb.org/10.4/centos7-amd64>
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

2) mariaDB 설치

# yum install MariaDB
# mariadb --version

3) mariaDB 실행

# systemctl start mariadb

4) root계정의 password 초기화 시키기

아래와 같이 입력하고 root에 대한 password를 재설정 한다.

# /usr/bin/mysqladmin -u root password

5) 포트 확인

# netstat -anp | grep 3306

만약 오류난다면 아래 net-tools을 설치해주고 다시 진행한다.

# yum install net-tools

6) DB 접속 확인

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \\g.
Your MariaDB connection id is 5
Server version: 10.1.30-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

MariaDB [(none)]> quit
Bye

7) 도커 부팅 시 자동시작 설정

  • 현재 설정값 확인
# systemctl is-enabled mariadb
  • disable 상태라면 아래 명령어 입력
# systemctl enable mariadb

MariaDB 세팅

1) 데이터베이스 생성 (db 접속한 상태여야 함)

MariaDB [(none)]> create database neos_1234;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| neos_1234          |
| performance_schema |
| test               |

2) 데이터베이스 접근

MariaDB [(none)]> use neos_1234;

3) 테이블 생성

각자 사용하고 있는 테이블 DDL 문을 복사 붙여넣기 하면 된다.

MariaDB [(neos_1234)]>  create table interlockmig_upload_excel_data_doc
(
    data_seq          int auto_increment
        primary key,
    file_seq          int                      null comment '업로드 파일 SEQ',
    mig_type          char                     not null comment '이관 유형',
    mig_key           varchar(46)              not null comment '이관 키',
    type              varchar(10)              null comment '엑셀 시트 타입',
    c_dikeycode       varchar(46)              not null comment '문서키코드',
    c_tikeycode       varchar(30)              null comment '양식키코드',
    c_didocflag       varchar(3)               null comment '문서구분',
    c_dititle         varchar(200)             null comment '문서제목',
    c_likeycode       varchar(30)              null comment '일괄문서관리번호',
    c_diflag          varchar(1) default '1'   null comment '전자비전자구분 (엑셀 업로드 X, 비전자(1)로 고정)',
    file_id           varchar(30)              null comment '문서 파일아이디',
    c_difiletype      varchar(5)               null comment '파일확장자',
    c_disummarycheck  varchar(1) default 'N'   null comment '요약여부 (엑셀 업로드 X)',
    register_emp_nm   varchar(100)             null,
    register_dept_nm  varchar(100)             null,
    register_comp_nm  varchar(100)             null,
    register_group_nm varchar(100)             null,
    owner_emp_nm      varchar(100)             null,
    owner_dept_nm     varchar(100)             null,
    owner_comp_nm     varchar(100)             null,
    draft_cnt         int        default 0     null,
    attach_cnt        int        default 0     null,
    winame            varchar(200)             null,
    aititle           varchar(200)             null,
    upload_type       int                      null comment '업로드 유형',
    upload_fail_log   mediumtext               null comment '실패로그',
    upload_state      varchar(3) default '000' not null comment '업로드 진행 상태 (000 : 대기, 001 : 진행중, 002 : 성공, 003 : MIG_KEY 유효성 검사 실패, 004 : 조직도 유효성 검사 실패(사원SEQ), 005 : 조직도 유효성 검사 실패(부서SEQ) , 006 : 조직도 유효성 검사 실패(회사SEQ), 007 : 조직도 유효성 검사 실패(그룹SEQ))',
    insert_dt         datetime                 null comment '생성일자',
    insert_seq        varchar(32)              null comment '생성자 사원SEQ',
    modify_dt         datetime                 null comment '수정일자',
    modify_seq        varchar(32)              null comment '수정자 사원SEQ'
);

3) DB 캐릭터 셋 설정

기존 캐릭터 셋 확인

MariaDB[neos_1234]> show variables like 'c%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci            |
| collation_database       | latin1_swedish_ci          |
| collation_server         | latin1_swedish_ci          |
| completion_type          | NO_CHAIN                   |
| concurrent_insert        | AUTO                       |
| connect_timeout          | 10                         |
+--------------------------+----------------------------+

utf8이 아니라면 아래의 세가지 파일에 캐릭터 셋을 설정한다 (없다면 파일 생성)

  • /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8
  • /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8
  • /etc/my.cnf.d/server.cnf
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

위와 같이 설정하고 mariaDB를 재기동 한다.

# systemctl restart mariadb

(참고로 설정하기 전에 만들어놓은 테이블 , 데이터는 적용이 안된다고 한다)

호스트에 위치한 백엔드 서버(Jar 파일) 실행시키기

1) 로컬 PC에서 spring boot 서버 jar파일 생성하기

2) 호스트 서버에 jar 파일, config 파일(application.yml) , log4j2.xml 파일을 업로드한다.

나는 호스트의 /home/upload 경로에 SFTP 툴(mobaxterm)을 사용하여 옮겼다.

3) 현재 컨테이너 기준으로 호스트 마운트하는 이미지를 새로 생성

현재 기동중인 컨테이너에 마운트 옵션을 추가하거나, 포트포워딩을 설정하는 방법은 구글링한 결과 없어서

기존 컨테이너에 마운트 옵션을 추가한 새로운 이미지를 생성하였다

※ 주의, 컨테이너를 삭제하고 이미지를 다시 컨테이너로 띄우면, 위의 과정까지 진행한 설정이 모두 삭제된다 ※

  • 기동중인 컨테이너 중지
# docker stop mkone1
  • 중지한 컨테이너를 도커 이미지로 복사하기 (commit)
# docker commit mkone1 mkone2
  • 복사한 이미지 마운트 옵션을 추가하여 실행

-v [마운트하고자 하는 호스트 경로]:[도커 내부의 경로]

# docker run --privileged --name mkone2 -v /home/upload:/home/upload -v /etc/init.d:/etc/init.d -d mkone:1.0 /sbin/init

참고로 이미 기동중인 컨테이너에 파일 / 폴더를 단순히 복사하고자 하는 경우에는 아래와 같이 진행한다.

# docker cp /home/upload mkone:/home/upload

4. 백엔드 서버 기동

도커 내부에서 jar 파일을 실행 시킨다.

# java -Xms1024m -Xmx1024m -jar /home/upload/backend/interlockmigBoot/interlockmig.jar

도커 컨테이너에 프론트 환경 구축

도커 내에서 리액트 환경을 구축하기 위해서 아래 순서로 진행한다.

1) 로컬에서 리액트 프로젝트 빌드

2) 빌드된 파일을 도커-호스트 마운트 경로에 업로드

3) 컨테이너에 nginx 설치

mariaDB 설치할때와 동일하게 nginx 설치하기 위해 repository를 추가해준다.

# cd etc/yum.repos.d/
# vi nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

nginx 설치

# yum install -y nginx

포트포워딩 설정

# cd /etc/nginx/conf.d
# vi default.conf

default.conf 파일의 nginx 경로 설정

  • 기존 [location /] 경로에 대한 설정을 주석 처리 또는 삭제하고 아래와 같이 추가해 넣는다
  • 도커 빌드 할 때, 포트포워딩 포트를 아래의 서버 포트로 맞춰야 한다.
  • 아래 설정은 외부에서 nginx 포트의 [ / ] 경로를 호출하면 [/home/upload/frontend/build] 경로의 index.html 페이지로 매핑시켜주는 의미.
server {
    listen       81;  // nginx 포트

    ...

    location / {   //  / 루트 경로에 대한 설정
        root   /home/upload/frontend/build;  // 프론트 빌드파일이 마운트된 경로
        index  index.html index.htm;     // 80/ 경로의 index 페이지
        try_files $uri $uri/ /index.html;
    }

...
}
  • nginx 시작
# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

포트포워딩

개발서버(호스트)에서 도커 내부의 백엔드 / 프론트 서버에 접근하기 위해서 컨테이너에 대한 포트포워딩을 지정해야 한다.

위의 호스트 볼륨 마운트 작업과 동일하게, 기존 컨테이너를 복사하여 신규 컨테이너로 등록해야하며 포트포워딩을 해야한다. (기동중인 컨테이너에 포트포워딩 불가)

1) 구동중인 컨테이너 중지

# docker stop mkone2

2) 백엔드/프론트 세팅된 컨테이너 commit

현재 상태를 기록한 이미지를 생성

# docker commit mkone2 mkone3

3) 포트포워딩 설정을 추가하여 컨테이너 기동

-p [호스트 포트]:[도커 포트]

  • 82 : 81 ⇒ Nginx 포트포워딩 [호스트포트] : [도커 내부 포트(default.conf의 서버 포트와 동일하게 설정)]
  • 9098:8098 ⇒ 백엔드 서버 포트포워딩 [호스트포트] : [도커 내부 포트]
# docker run --privileged --name mkone3 -v /home/upload:/home/upload -v /etc/init.d:/etc/init.d -p 9098:8098 -p 82:81 -d mkone3 /sbin/init

테스트

1) 프론트 접속 확인

  • 로컬 웹 브라우저에서 192.168.0.139:82 입력 후 아래와 같은 결과 확인
  • 82번 포트가 도커 컨테이너의 81번 포트로 연결되어 index.html 조회

2) 백엔드 연동 확인


+ 추가, 외부로 서비스하기

  • 위의 과정은 내부망을 사용하고 있는 사용자만 도커 내부로 접근이 가능하다
  • 외부 사용자에게 서비스하기 위해 공유기 자체에 포트포워딩을 진행한다
  • 아래 순서는 nginx 기준이고, 백엔드 서버 포트포워딩도 동일하게 진행하면 됨

1) 공유기 설정 페이지 로그인

본인 IP에서 마지막 1번으로 변경해서 웹 브라우저로 접속 (iptime)

2) 포트포워딩 페이지로 접속

관리도구 클릭

[고급 설정 > NAT/라우터 관리 > 포트포워드 설정] 접속

3) 신규 포트포워딩 설정 추가

  1. 규칙이름 설정
  2. 내부 IP 주소 설정 (개발 서버 IP 입력)
  3. 외부 포트 / 내부포트 설정
    • 외부 포트 : 외부에서 접근하는 포트
    • 내부 포트 : 도커 Nginx와 포트포워딩 되어있는 포트
  4. 적용 클릭
profile
백엔드 개발자의 소소한 개발 기록.

0개의 댓글