⚡ 개요
내부 테스트 서버에 구축 및 배포를 할때, 기존에는 docker 위에 tomcat을 올리고 serveice를 구축하는 방식을 사용 했었다. 하지만 jar 파일로 빌드를 하고 jenkins를 통해서 자동 배포 및 자동 실행을 하려고 하면서 리눅스 서버를 구축하고 그위에 서비스를 구축하는 방식으로 작업을 진행했다.
구축을 진행한 내용 및 문제가 발생했던 부분에 대한 내용을 정리해 놓으려고 한다.
⚡ Spring Boot Server 구축 가이드 내용 정리
일단 기본적으로 Docker는 구축이 되어있다는 가정하에 가이드 내용을 정리 했다.
기본적으로 Window에서 Docker를 설치하는 방법은 Desktop 전용 및 Daemon만을 실행해서 하는 두가지 방법이 존재한다. Desktop의 경우는 메모리 반환이 잘 되지않는 메모리 이슈가 있으면 현재까지도 Docker github에서 이슈로 올라가 있다. 그래서 나는 테스트단계에서는 Desktop을 사용하고 실제 구동 단계에서는 daemon으로 사용하고 있다.
👉구축 스팩
- Docker Version 20.10.22 (최신 버전에서도 동일하게 동작 하는 부분은 확인 했다.)
- Centos 7.8.2003 (최신 버전을 사용해도 상관이 없다.)
- JAVA 17
👉 구축 가이드 내용 정리
DockerFile을 사용해서 이미지를 만들고 컨테이너를 구동하는 방법이 있지만 아직 DockerFile을 만드는게 익숙하지 않아서 여기서는 순서대로 구축했던 내용을 정리 하려고 한다.
# 이미지 생성
docker pull centos:7.8.2003
# 컨테이너 등록 및 shell 접속
# ssh 포트 (기본 -> 22) (다른 포트를 사용해도 상관 없음)
# 11030, 11033 포트는 외부로 열어놓을 포트 (다른 포트도 상관 없음)
# 서비스를 두개 올려야해서 두개의 외부 포트를 열어 놓았다.
### 밑의 내용중 sbin/init를 백그라운드로 구동을 시키는데 저렇게 하지않으면 리눅스 기본 명령어 사용시 권한 문제가 생김. (다른 방법은 찾지 못함)
# --privileged
# 기본적으로 docker는 Unprivileged 모드로 실행이 되면 이 모드에서는 시스템의 주요 자원에 접근할 수 있는 권한이 부족하기 때문에 모든 장치 접근 및 커널 기능 사용을 위해서 위의 모드를 사용 한다.
# (일반적으로 생성되는 Container는 Host에서 독립된 Linux namespace 영역을 가지고 있어서 Host 시스템의 주요자원에 접근할 수 있는 권한이 없음)
# (컨테이너 구동시, 특정 권한만을 따로 줄수도 있음)
docker run --privileged -it -d --name nh80server -p 22:22 -p 11030:11030 -p 11033:11033 -e TZ=Asia/Seoul centos:7.8.2003 /usr/sbin/init
# 구동 이후 bash에서 systemctl 과 같은 리눅스 기본 명령어가 정상 동작 하는지 확인 필요하다.
도커를 사용해봤다면 기본적인 image 생성 및 컨테이너를 구동하는 방법이다.
세부적으로 설정한 부분의 경우 위에 내용을 좀 더 자세히 적어 놓았다.
❗ sbin/init를 백그라운드로 구동시키지 않으면 리눅스 기본 명령어를 사용하지 못하는데 도커의 기본적인 메커니즘으로 인해서 사용을 하지 못하는게 맞는건지 아니면 다른 방법이 있는데 안되는것인지는 잘 모르겠다. 이부분에 대해서는 도커의 기본 동작 방식 및 래퍼런스를 좀 더 찾아보고 있는중이다.
# 기본적인 centos 7.8 image에는 내용이 아무것도 없다.
# 필요한 내용들을 install 해줘야함.
# yum install
yum -y update
#압축 해제를 위한 unzip install
yum -y install unzip
# ssh 포트 사용 관련 install
yum install -y openssh-server
# 포트 설정
### 기본 포트를 사용하는 경우 22번을 그대로 열어도 되고 아니면 커스텀된 ssh 포트를 사용 해도됨
### 권한 및 보안 관련 내용을 따로 정리 하지 않음.
vi /etc/ssh/sshd_config
# openSSH 구동 및 상태 체크
systemctl start sshd
systemctl status sshd
# root 계정 패스워드 설정
passwd
# 이부분까지 기본 설정이라고 볼수 있다.
# (여기를 기준으로 docker image를 commit 해서 사용해도 된다.)
위의 내용 처럼 기본적으로 centos 7 버전 이미지에는 아무것도 없다. docker hub에 가서 보면 사용 버전안에 있는 패키지 정보를 볼수 있으니, 자신이 필요한게 없다면 install 해줘야한다.
포트 설정의 경우 현재 22번으로 설정 했지만, 회사 내부에서는 특정 포트로 커스텀해서 사용중이다. 그래서 해당 설정 파일을 통해 포트를 커스텀 해주었다 보안적인 측면서 설정하는 방법도 있지만 이부분의 경우 내용이 복잡해져서 여기서는 설명하지 않는다.
# Spring boot 구축 (세부적인 내용은 바뀔수 있음)
# jdk 17 설치
# centos 7 기준으로 11까지밖에 설치가 안됨 외부 17.tar 파일을 옮겨서 설치해야함.
# yum list java*jdk-devel (확인 명령어)
# window -> docker -> container 순으로 파일을 옮겨야함.
docker cp "docker 내부 17.tar 경로(파일 포함)" "컨테이너명 또는 컨테이너ID":"내부 경로"
Spring Boot 서비스를 구축하는 부분이다.
centos 7 기준으로 JDK 가 11 버전까지 밖에 지원하지 않아서 외부 open JDK 17.tar 파일을 옮겨서 설치를 했다.
아마 최신 버전을 사용하는 경우 17까지 지원하는것으로 파악하고 있다. (혹시 모르니 설치 가능 여부를 파악 해봐야 한다.)
# 서비스 등록 #
# system 이동
cd /usr/lib/systemd/system/
# service1
vi ./service1.service
# 밑의 내용 등록
[Unit]
Description= service1 !!
After=network.target syslog.target
[Service]
type=forking
User=root
ExecStart= 'start.sh 까지의 경로'
ExecStop= 'shutdown.sh'
WorkingDirectory='jar 파일 위치의 경로'
[Install]
WantedBy=multi-user.target
# 등록이 되었는지는 grep을 통해서 서비스를 캐치 해주면 된다.
# 등록이 된 이후 서비스 구동 및 상태 확인
systemctl start service1.service
systemctl status service1.service
서비스로 등록하고 실행을 하면 정상 동작 해서 서비스가 구동 되는것을 볼수 있다.
중간 중간 자신이 구축한 내용을 기준으로 docker image commit 명령어를 통해서 현재 컨테이너 상태까지 이미지로 만들어서 사용을 해도된다. docker에서는 image를 private 상태로 저장할수 있도록 제공을 해주기 때문에 문제없이 사용이 가능하다.
⚡ 이슈 사항 정리
내가 구축을 하면서 겪은 이슈 사항에 대해서 간략하게 정리를 하려고한다.
docker(container) systemctl 명령 사용시 D-Bus 연결 실패 에러가 나오는 경우 ❗
컨테이너 구동시, --privileged 및 /sbin 설정을 안했을 경우에 발생한다. 만약 설정을 하지 않은 경우 컨터이너를 설정 및 구동을 하면 된다.
파일을 옮기거나 설정할때 권한 에러가 나오는 경우 ❗
chmod 명령어를 통해서 권한을 부여하고, 다시 명령어를 실행하는 경우 정상 동작 한다
(이부분은 내가 윈도우 환경에 너무 익숙해져 있어서 리눅스 환경에서는 권한을 잘 확인 해야 한다는 것을 간과한것이다. )
centos 시간이 이상하게 나오는 경우 ❗
만약 컨테이너를 구동시, 날짜 설정을 하지 않은 경우, centos내에 구축된 서비스를 실행하고 LocalTime을 조회하는 부분이 있다면 시간이 이상하게 나오는 경우가 있다. 이부분의 경우 기본 설정 되어있는 타임존이 맞지 않아서 생기는 문제이다.
이렇게 시간존이 맞지 않는 경우 centos 내부에서 타임존을 변경하는것으로 날짜를 맞출수 있다. (원하는 시간대 설정)
# timezone 확인
timedatectl
# timezone list 에서 Seoul 또는 Asia 로 찾는다.
timedatectl list-timezones | grep Seoul
# 변경
timedatectl set-timezone Asia/Seoul
⚡생각
처음 리눅스 및 boot 서비스를 구축할때 엄청 쉽게 생각을 하고 구축을 시작 했다. 하지만 권한 부터 시작해서 ssh 포트 설정, 파일을 옮기는 과정 등등 여러가지의 이슈를 발견하면서 많이 배우고 성장했다고 생각을 한다.
이 과정을 몇주, 몇달이 지나면 까먹을 가능성이 매우 높아서 정리를 해놓으려고 한다. 중간 중간에 설명을 빼놓은 부분도 있을것이다. 무지성으로 따라서 쳐보고 안되네 다른거 찾아 봐야지 하지말고 안됬을때 이슈를 보고 찾아가는 과정에서 배우는것이 있었으면 좋겠다.
'DevOps' 카테고리의 다른 글
[git] 태그와 릴리즈(Tag & Release) 관리 (0) | 2024.02.23 |
---|---|
Jenkins 에서 SSH Server 등록 및 Spring Boot 서비스 배포 관련 내용 정리 (0) | 2023.05.29 |
nssm으로 jar 파일 window service 등록 하기 (0) | 2023.05.15 |
사용중인 Intellij 플러그인 정리 (0) | 2023.03.12 |
[Git] 자주 사용하는 명령어 정리 (0) | 2022.11.11 |