회사 사람들과 사이드 프로젝트로 평소 사용하던 개발 서버 환경을 놀고 있는 서버(CentOS 7)에 구축해보기로 했다.
1차 목표는 nginx - front - backend 구동 환경을 도커 내에 구축해보기 였다. (2차는 쿠버네티스, CI/CD 환경 구축 ..)
진행 순서는 아래와 같다
- centos 7 버전의 도커 이미지 받기 & 컨테이너로 띄우기
- 컨테이너 내에 백엔드 환경 구축
- 컨테이너 내에 프론트 환경 구축(nginx 설정)
- 포트포워딩 및 테스트
물론 백엔드 환경 , nginx 환경을 구축하여 도커 허브에 올라와 있는 이미지도 있겠지만
나는 실습을 위해 centos 만 깔려있는 도커 이미지 내에 구축하기로 했다.
$ docker search centos
$ docker image pull centos:7
$ 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를 설치해놓고 마운트하여 사용하는게 좋다 (추후 바깥으로 뺄 예정 )
# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel
/usr/bin/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
# 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)
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
# yum install MariaDB
# mariadb --version
# systemctl start mariadb
아래와 같이 입력하고 root에 대한 password를 재설정 한다.
# /usr/bin/mysqladmin -u root password
# netstat -anp | grep 3306
만약 오류난다면 아래 net-tools을 설치해주고 다시 진행한다.
# yum install net-tools
# 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
# systemctl is-enabled mariadb
# systemctl enable mariadb
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 |
MariaDB [(none)]> use neos_1234;
각자 사용하고 있는 테이블 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'
);
기존 캐릭터 셋 확인
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이 아니라면 아래의 세가지 파일에 캐릭터 셋을 설정한다 (없다면 파일 생성)
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
위와 같이 설정하고 mariaDB를 재기동 한다.
# systemctl restart mariadb
(참고로 설정하기 전에 만들어놓은 테이블 , 데이터는 적용이 안된다고 한다)
나는 호스트의 /home/upload 경로에 SFTP 툴(mobaxterm)을 사용하여 옮겼다.
현재 기동중인 컨테이너에 마운트 옵션을 추가하거나, 포트포워딩을 설정하는 방법은 구글링한 결과 없어서
기존 컨테이너에 마운트 옵션을 추가한 새로운 이미지를 생성하였다
※ 주의, 컨테이너를 삭제하고 이미지를 다시 컨테이너로 띄우면, 위의 과정까지 진행한 설정이 모두 삭제된다 ※
# docker stop mkone1
# 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
도커 내에서 리액트 환경을 구축하기 위해서 아래 순서로 진행한다.
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 경로 설정
server {
listen 81; // nginx 포트
...
location / { // / 루트 경로에 대한 설정
root /home/upload/frontend/build; // 프론트 빌드파일이 마운트된 경로
index index.html index.htm; // 80/ 경로의 index 페이지
try_files $uri $uri/ /index.html;
}
...
}
# 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.
개발서버(호스트)에서 도커 내부의 백엔드 / 프론트 서버에 접근하기 위해서 컨테이너에 대한 포트포워딩을 지정해야 한다.
위의 호스트 볼륨 마운트 작업과 동일하게, 기존 컨테이너를 복사하여 신규 컨테이너로 등록해야하며 포트포워딩을 해야한다. (기동중인 컨테이너에 포트포워딩 불가)
# docker stop mkone2
현재 상태를 기록한 이미지를 생성
# docker commit mkone2 mkone3
-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
본인 IP에서 마지막 1번으로 변경해서 웹 브라우저로 접속 (iptime)
관리도구 클릭