
Intro
안녕하세요. 환이s입니다 👋
오늘은 Docker 기반 Rocky Linux 9 환경에서 Java 8, MariaDB, Tomcat을 설치하고 설정하는 방법을 정리해 보려고 합니다.
보통 실무에서는 VM 기반 CentOS/Rocky Linux를 많이 사용하지만, 테스트 환경이나 로컬 개발 환경에서는 Docker가 훨씬 빠르고 편리합니다. 특히 컨테이너는 “매번 동일한 환경을 쉽게 재현”할 수 있기 때문에, 서버 설정 실습이나 개발 테스트 환경 구축에 매우 유용하죠.
그래서 이번 글은 “VM 없이 Docker만으로 Rocky Linux 개발 환경 만들기”를 목표로 작성했습니다.
처음 Rocky Linux 환경을 구성하는 분들도 부담 없이 따라올 수 있도록 명령어와 설정 파일까지 모두 정리해 두었어요.
1. Docker에서 Rocky Linux 9 이미지 준비하기
Docker로 Rocky Linux를 준비하는 과정은 매우 간단합니다.
운영환경에서는 Rocky Linux를 VM이나 물리 서버로 운영하지만, Docker를 이용하면 몇 초 만에 새로운 Rocky Linux 환경을 만들고 폐기할 수 있다는 큰 장점이 있습니다.
1️⃣ 이미지 검색
docker search rockylinux

이미지 검색을 해보면 위 사진처럼 "rockylinux" 키워드를 사용하여 검색된 사용 가능한 이미지 목록을 확인할 수 있습니다.
2️⃣ 이미지 다운로드
docker pull rockylinux:9
검색을 통해 원하는 이미지를 찾았다면, docker pull 명령어로 로컬 시스템에 다운로드합니다.
- 기능: Docker Registry에서 지정된 이름과 태그( :9)를 가진 이미지를 로컬 컴퓨터의 이미지 저장소로 가져옵니다.
- Rocky Linux:9의 의미
- rockylinux : 이미지 이름(Repository)
- :9 : 이미지 태그(Tag). Rocky Linux의 주요 버전 9를 명확히 지정하여 다운로드하겠다는 의미입니다.(태그를 생략하면 기본값인 :latest가 적용됩니다.)
- 활용: 이 명령을 실행하면 Docker Hub에서 Rocky Linux 9 버전 이미지 레이어들을 순차적으로 다운로드합니다. 반대로 이미 로컬에 있다면 아래 사진과 동일한 "Image is up to date" 메시지가 출력됩니다.

3️⃣ 이미지 목록 확인
docker images
다운로드가 완료된 후, 내 컴퓨터에 어떤 이미지들이 저장되어 있는지 확인하는 명령어입니다.

2. Docker 컨테이너 실행하기
초기 실행에서는 SSH가 설정되지 않기 때문에 "/bin/bash"로 먼저 진입해 환경을 준비하는 방식으로 시작합니다.
그리고 SSH 환경을 구성한 뒤에는 해당 상태를 snapshot처럼 저장해 두었다가 이후에는 완성된 이미지로 컨테이너를 띄우는 방식이 훨씬 효율적입니다.
1️⃣ 초기 컨테이너 실행
docker run -it -d --name t_linux01 rockylinux:9 /bin/bash

초기 컨테이너가 성공적으로 실행되면 위 사진과 동일하게 해시값을 확인할 수 있습니다.
2️⃣ 컨테이너 상태 확인
docker ps
docker ps -al

ps와 ps -al의 차이는 ps가 현재 실행 중인 컨테이너(활성화된 서비스)만 출력하는 반면, ps -al은 종료된 컨테이너를 포함한 모든 컨테이너 목록을 출력한다는 점입니다. 상황에 맞춰 전체 목록을 확인할지, 아니면 현재 구동 중인 서비스만 확인할지 선택하여 출력하시면 됩니다.
현재 위 사진에서는 이번 포스팅에서 생성한 컨테이너만 있는 상태라서 동일한 출력 결과를 확인할 수 있습니다.
3️⃣ 컨테이너 내부 접속
초기 컨테이너가 성공적으로 실행되었다면, 이제 SSH 환경을 설정하기 위해 컨테이너 내부로 진입할 차례입니다.
사용하는 명령어는 다음과 같습니다.
docker exec -it t_linux01 /bin/bash

3. SSH 설치 및 기본 설정
여기서부터는 Rocky Linux 컨테이너 내부에서 작업합니다.
SSH를 설정하는 이유는 단순히 접속을 위해서가 아니라, 실제 서버 환경처럼 운영하기 위한 구조를 맞추기 위해서입니다.
또한 IDE(VSCode,IntelliJ)에서 원격 호스트처럼 연결하는 데도 필요하죠.
1️⃣ SSH 설치
dnf install -y openssh-server sudo

2️⃣ 기본 도구 설치
dnf install -y vim-enhanced
vim --version
dnf install -y ncurses # clear 명령 정상화


4. ROOT 패스워드 & 사용자 계정 생성
컨테이너라고 해도 보안 설정은 실 환경과 동일하게 구성하는 것이 좋습니다.
root 계정의 SSH 접속을 막고 별도 유저로 접속하는 방식은 실제 서버에서도 기본 보안 규칙입니다.
1️⃣ root 패스워드 설정
passwd

2️⃣ 사용자 생성
useradd test1
passwd test1
이번 포스팅을 위해 "test1" 이라는 사용자 계정을 만들어봅니다.

패스워드까지 설정 완료 했다면, 계정이 제대로 생성되었는지, 계정 및 그룹을 확인해 봅니다.
3️⃣ 계정/그룹 확인
cat /etc/passwd
cat /etc/group


5. Docker 스냅샷(커밋) 저장
여기까지 설정했다면 컨테이너는 거의 "Rocky Linux 초기 서버 구성 완료" 상태입니다.
이 시점에서 snapshot을 남기면 앞으로는 매번 이 과정을 반복하지 않아도 됩니다.
1️⃣ 스냅샷 저장
docker commit t_linux01 t_rocky9:0.1
docker stop t_linux01
docker rm t_linux01

- docker commit t_linux01 t_rocky9:0.1
- 컨테이너를 이미지로 저장하는 명령어입니다.
- t_linux01 : 스냅샷을 찍을 현재 실행 중인 컨테이너 이름입니다.
- t_rocky9:0.1 : 새로 생성될 이미지 이름과 태그(버전). t_rocky9는 Repository 명, :0.1은 첫 번째 버전을 의미합니다. 이제 이 이미지는 "Rocky Linux 초기 서버 구성 완료" 상태를 반영합니다.
- docker stop t_linux01
- 현재 실행 중이던 컨테이너를 중지합니다.
- 커밋 후에는 이 컨테이너는 더 이상 필요 없으며, 새로운 이미지로 다시 시작할 준비를 합니다.
- docker rm t_linux01
- 중지된 컨테이너를 삭제합니다.
- 이미지(t_rocky9:0.1)는 남아있으므로, 이 컨테이너 인스턴스만 제거해도 작업 내역은 안전하게 보존됩니다.
2️⃣ 완성본 실행(run)
docker run --privileged -it -d --name t_linux01 -p 2222:1022 t_rocky9:0.1 /sbin/init
앞서 커밋하여 저장한 t_rocky9:0.1 이미지를 사용하여 새로운 컨테이너를 실행하고, 필요한 모든 설정을 적용하는 최종 명령어입니다.
초기에는 sshd를 설정이 안 되어 있어서 호스트 시스템에 대한 광범위한 접근 권한 및 포트번호 매핑 설정을 안 했었는데, 완성본 실행할 때는 추가하셔야 합니다.
해당 명령어에 대해 간단하게 설명하자면 다음과 같습니다.
| 옵션 | 설명 |
| docker run | 새로운 컨테이너를 생성하고 실행하는 기본 명령어입니다. |
| --privileged | 특권 모드로 컨테이너를 실행합니다. systemd와 같은 복잡한 초기화 및 서비스 관리자가 컨테이너 내부에서 정상적으로 작동하려면 호스트 시스템에 대한 광범위한 접근 권한이 필요합니다. |
| -p 2222:1022 | 외부에서 접속할 수 있도록 호스트의 포트(2222)와 컨테이너 내부의 SSHD 포트(1022)를 연결(매핑)하는 설정이 추가되었습니다. |
| /sbin/init | 1.Rocky Linux는 systemd라는 시스템 및 서비스 관리자를 사용합니다. 컨테이너 내부에서 systemd의 시작 프로그램인 /sbin/init을 실행함으로써 일반적인 리눅스 서버처럼 부팅하게 만듭니다. 2. init 프로세스가 실행되어야 설치된 SSHD 서비스를 시작하고, 이 서비스가 계속 실행 상태를 유지할 수 있습니다. |

6. SSH 설정(sshd_config) 변경
컨테이너를 생성했다면 다시 진입해서 SSHD 설정 변경을 진행해야 합니다.
이 단계는 컨테이너에 SSH(Secure Shell) 서비스를 설정하고, 외부 접속을 안전하게 관리하기 위한 핵심 보안 설정을 적용하는 과정입니다.
1️⃣ SSHD 서비스 활성화
systemctl enable sshd
systemctl start sshd
systemctl status sshd

⚠️ 만약 systemctl 명령어가 작동하지 않는다면,
컨테이너 이미지에 systemd가 설치되지 않았을 수 있습니다. 그럴 땐 당황하지 말고 systemd 패키지를 다시 install 하시면 됩니다.
2️⃣ sshd_config 수정
vi /etc/ssh/sshd_config
:set nu
SSH 설정 파일인 "/etc/ssh/sshd_config"를 수정하여 기본 보안을 강화하고 접속 환경을 조정합니다.
- vi /etc/ssh/sshd_config: SSH 설정 파일을 vi 편집기로 엽니다.
- :set nu : 편집기 내에서 줄 번호를 표시하여 수정할 부분을 찾기 쉽게 합니다.
✔ SSH 포트 변경 (Port 1022)
대부분의 공격 시도는 기본 SSH 포트인 22번을 대상으로 합니다.
이를 비표준 포트(1022)로 변경하는 것은 가장 기본적인 보안 조치입니다.
# Before
# Port 22
# After
Port 1022

✔ Root 로그인 차단 (PermitRootLogin no)
root 계정은 시스템에 대한 절대 권한을 가지므로, 외부에서 직접 root 계정으로 접속하는 것을 차단해야 합니다. 일반 계정으로 접속한 후 필요할 때만 "su" 또는 "sudo"를 사용하여 권한을 상승시키는 것이 안전합니다.
# Before
# PermitRootLogin yes
# After
PermitRootLogin no

✔ 패스워드 인증 허용 (PasswordAuthentication yes)
초기 서버 설정 단계에서는 SSH 키 페어 설정이 복잡할 수 있습니다.
사용자 이름과 비밀번호를 통한 인증을 허용하도록 설정하여 접속의 편의성을 확보합니다.
# Before
# PasswordAuthentication yes (주석 제거 필요)
# After
PasswordAuthentication yes

✔ 변경 후 SSHD 서비스 재시작
설정 파일을 수정한 후에는 반드시 서비스를 재시작해야 변경 사항이 반영됩니다.
systemctl restart sshd

이제 포트 1022를 통해 일반 사용자 계정으로만 접속이 가능해집니다.
이 설정까지 완료하면 컨테이너는 이제 외부 접속이 가능한 보안이 강화된 서버 초기 상태가 됩니다.
(현재 작업까지 완료했다면, Docker 중간 스냅샷을 진행합니다.)
글쓴이는 중간 커밋을 진행하고 현재 사용하고 있는 컨테이너를 제거 후 다시 컨테이너를 "run" 시켰습니다.

위 이미지를 보시면 포트 번호를 더 추가했는데, 그 이유는 서버의 목적은 단순히 접속하는 것을 넘어, 그 위에서 특정 애플리케이션을 구동하는 것입니다.
추가된 포트 매핑 옵션들을 분석해 보면 컨테이너의 역할이 웹/DB 서버로 확장되었음을 알 수 있습니다.
7. DB 구축
이전 단계에서 SSH 설정을 통해 컨테이너에 접속 경로를 확보했고, Docker "run" 명령으로 웹 서비스(8080)와 DB 서비스(3306)를 위한 포트까지 외부에 노출했습니다. 이제 그 핵심인 데이터베이스 서버(DB Server)를 구축할 차례입니다.
본 서버 환경에서는 MariaDB를 설치하고, 특히 접근성과 한글/다국어 처리, 그리고 동시 접속 처리에 초점을 맞춘 핵심 설정을 적용하겠습니다.
SSHD 설정을 끝내서 이제 편의성을 위해 mobaxterm으로 진행하겠습니다.
그리고 모든 작업은 이번 포스팅에서 사용자 계정으로 생성한 "test1"로 진행하겠습니다.
1️⃣ MariaDB 패키지 설치
"dnf" 패키지 관리자를 사용하여 MariaDB 데이터베이스 서버와 클라이언트를 설치합니다.
sudo dnf install -y mariadb mariadb-server
"sudo" 명령어를 사용해서 다운로드를 진행하려면, 먼저 앞서 설정한 root 패스워드를 입력해서 진행하시면 됩니다.
만약, "sudo" 명령어가 없다고 나오면
dnf install -y sudo
"sudo" 패키지를 설치해서 다시 진행해 보시길 바랍니다. 그러면 아래와 같은 메시지가 입력되는 걸 확인할 수 있습니다.

해당 메시지는 사용자 "test1" 계정이 "sudo" 명령을 사용할 권한이 없기 때문에 발생했습니다.
이는 시스템 관리자가 일반적으로 보안을 위해 sudoers 파일에 명시된 사용자나 그룹에게만 관리자 권한(root 권한)을 일시적으로 위임하도록 설정했기 때문입니다.
이럴 때는 "test1" 계정을 "wheel" 그룹에 추가해 주시면 됩니다.
Red Hat 계열(CentOS, Fedora 등) 리눅스에서는 "wheel" 이라는 그룹에 속한 사용자에게 "sudo" 권한을 부여하는 것이 일반적입니다. root 계정으로 전환한 후, "usermod" 명령을 사용하여 test1 사용자를 "wheel" 그룹에 추가합니다.
# root 셸에서 실행
usermod -aG wheel test1

그리고 다시 MariaDB 설치 명령어를 입력하시면 정상적으로 설치되는 걸 확인할 수 있습니다.


2️⃣ 설정 파일 수정
MariaDB 서버의 동작 방식을 제어하는 설정 파일 수정은 개발 환경뿐만 아니라 운영 환경의 안정성을 위해 매우 중요합니다.
주요 설정은 "/etc/my.cnf.d/mariadb-server.cnf" 파일에 적용됩니다.
sudo vi /etc/my.cnf.d/mariadb-server.cnf
파일을 열고 [mysqld] 섹션에 아래와 같이 필수 설정을 추가합니다.
| 설정 항목 | 값 | 설명 및 중요성 |
| bind-address | 0.0.0.0 | 외부 접속 허용: 기본값은 127.0.0.1로 설정되어 외부 접속을 차단합니다. 이를 0.0.0.0으로 변경해야 Docker 포트 매핑(33106:3306)을 통해 외부에서 DB 접속이 가능해집니다. |
| character-set-server | utf8mb4 | 문자셋 설정: 데이터베이스에 저장될 때 사용할 문자 인코딩을 UTF-8 (4바이트)로 지정합니다. 이모지(Emoji)를 포함한 대부분의 다국어를 완벽하게 지원하기 위해 utf8mb4를 사용합니다. |
| collation-server | utf8mb4_general_ci | 정렬 방식 설정: 문자열 데이터의 비교 및 정렬 규칙을 정의합니다. "_ci"는 Case Insensitive(대소문자 구분 없음)를 의미합니다. |
| init_connect | SET NAMES utf8mb4 | 접속 시 문자셋: 클라이언트가 DB에 연결될 때마다 실행되어, 통신에 사용할 문자셋을 utf8mb4로 지정합니다. |
| skip-character-set-client-handshake | (옵션) | 클라이언트와 서버 간의 불필요한 문자셋 핸드셰이크를 건너뛰고, 서버의 문자셋 설정을 우선시하여 문자 깨짐을 방지합니다. |
| max_connections | 200 | 동시 접속 제한: 서버가 동시에 처리할 수 있는 최대 클라이언트 연결 수를 지정합니다. 서버의 사양과 예상되는 트래픽에 따라 적절히 설정합니다. (기본값은 151) |
[mysqld]
port=3306
bind-address=0.0.0.0
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect=SET NAMES utf8mb4
skip-character-set-client-handshake
max_connections=200

3️⃣ MariaDB 시작
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo systemctl status mariadb
설정 파일 수정 후에는 서비스를 활성화하고 시작해야 합니다.
- systemctl enable mariadb: 시스템 부팅 시 MariaDB가 자동 실행되도록 설정합니다.
- systemctl start mariadb: MariaDB 서비스를 즉시 시작합니다.
- systemctl status mariadb: 서비스가 정상적으로 실행 중인지 확인합니다.

4️⃣ DB 계정 생성 및 권한 부여 (접속 환경 구축)
초기 설치 후에는 root 계정만 존재하며 비밀번호가 설정되어 있지 않습니다.
실제 애플리케이션에서 사용할 전용 계정을 생성하고, 모든 곳에서 접속할 수 있는 권한을 부여하여 외부 접속을 준비합니다.
# 1. root로 MariaDB에 접속 (초기에는 비밀번호가 없거나 설정되어 있지 않음)
mysql -u root -p
# 2. 새로운 사용자 계정 생성 ('본인ID' 사용자, 비밀번호 'passwd', 모든 호스트 '%'에서 접근 허용)
CREATE USER '본인ID'@'%' IDENTIFIED BY 'passwd';
# 3. 새로 생성한 사용자에게 모든 데이터베이스와 테이블에 대한 모든 권한 부여
GRANT ALL PRIVILEGES ON *.* TO '본인ID'@'%' WITH GRANT OPTION;
# 4. 권한 변경 사항을 즉시 적용
FLUSH PRIVILEGES;

제 계정으로는 'drg2524' 로 애플리케이션 접속 계정으로 사용할 수 있게 했습니다.
이제 외부에서 SSH 포트(2222)를 통해 서버에 접속할 수 있고, DB 클라이언트 툴을 사용하여 33106 포트로 MariaDB에 접속할 수 있는 환경이 완벽하게 구축되었습니다.

DBeaver 툴에서 데이터베이스 연결을 확인해 봤고, 위 사진처럼 정상적으로 커넥션되는 것을 확인할 수 있었습니다.
8. Java 설치 및 환경변수 설정
다음으로는 Java 설치를 하고 환경변수 설정을 해보겠습니다.
JAVA_HOME 환경 변수를 명확하게 설정해야 Tomcat과 같은 미들웨어 서버나 다른 애플리케이션들이 올바른 Java 버전을 인식하고 사용할 수 있습니다.
1️⃣ Java 설치
sudo dnf install -y java-1.8.0-openjdk-devel


2️⃣ Java 설치 경로 확인
시스템에 설치된 Java 버전 중 현재 활성화된 버전과 해당 경로를 확인합니다. 이 경로는 환경 변수 설정에 사용됩니다.
sudo update-alternatives --config java

출력되는 내용 중 "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-2.el8_9.x86_64/jre/bin/java"와 유사한 경로의 상위 디렉터리인 /usr/lib/jvm/java-1.8.0-openjdk 형태를 JAVA_HOME으로 사용합니다.
3️⃣ 환경 변수 설정 (JAVA_HOME 지정)
JAVA_HOME과 PATH를 시스템 전체에 적용하기 위해 "/etc/profile.d" 디렉터리에 스크립트 파일을 생성합니다.
sudo vi /etc/profile.d/java.sh
텍스트 편집기(vi)를 사용하여 java.sh 파일을 생성하고 다음 내용을 추가합니다.
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH

💡 주의: JAVA_HOME 경로는 2단계에서 확인한 실제 경로와 정확히 일치해야 합니다.
java.sh 파일에 추가한 내용을 저장하고 스크립트를 현재 셸 환경에 즉시 적용합니다.
source /etc/profile.d/java.sh
source 명령어 자체는 어떤 계정이든 사용할 수 있지만, 시스템 전체에 영향을 미치는 환경 변수를 설정하는 것이 목표이므로 일반적으로 root 권한으로 파일 작업을 하는 것이 맞기 때문입니다.

4️⃣ 설치 및 설정 확인
Java 설치 및 환경 변수 설정이 성공적으로 완료되었는지 최종 확인합니다.
echo $JAVA_HOME
java -version

위 이미지에 보이는 대로 Java 8 설치 및 환경 변수 설정이 완료되었습니다.
이 환경 변수를 사용하여 이제 Tomcat과 같은 서버를 설치하고 구동할 수 있습니다.
9. Apache Tomcat 9 설치 및 서비스 등록
이제 마지막으로 웹 애플리케이션을 구동할 Apache Tomcat 서버를 설치할 차례입니다.
단순히 Tomcat을 실행하는 것을 그치지 않고, Systemd 서비스로 등록하여 운영 환경과 동일하게 systemctl 명령으로 서버를 쉽게 관리하고 자동 재시작(Restart) 기능을 활성화할 것입니다.
1️⃣ wget 설치 (다운로드 준비)
Tomcat을 인터넷에서 다운로드하기 위해 wget 명령어가 필요합니다
sudo dnf install -y wget

- wget : 웹 서버로부터 파일을 다운로드하는 명령어입니다.
2️⃣ Tomcat 다운로드 및 압축 해제
Tomcat 서버를 설치할 표준 경로인 "/opt" 디렉터리로 이동하여 최신 안정 버전의 Tomcat 9 소스 파일을 다운로드하고 압축을 해제합니다.
cd /opt
sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.112/bin/apache-tomcat-9.0.112.tar.gz
sudo tar -xvf apache-tomcat-9.0.112.tar.gz
sudo mv apache-tomcat-9.0.112 tomcat9

- cd /opt : 소프트웨어 설치 시 관례적으로 사용하는 "/opt" (Optional software) 디렉터리로 이동합니다.
- wget ...: Tomcat 9의 특정 버전(예: v9.0.112)을 다운로드합니다.
- tar -xvf ...: 다운로드된 .tar.gz 파일의 압축을 해제합니다.
- mv apache-tomcat-9.0.112 tomcat9: 압축 해제 후 생성된 긴 디렉터리 이름을 tomcat9와 같이 짧고 명확하게 변경하여 관리 편의성을 높입니다.
3️⃣ 권한 설정
Tomcat이 정상적으로 작동하고 셸 스크립트(.sh)를 실행할 수 있도록 권한을 설정합니다.
sudo chown -R root:root /opt/tomcat9
sudo chmod +x /opt/tomcat9/bin/*.sh
- chown -R root:root /opt/tomcat9: "/opt/tomcat9" 디렉터리와 그 하위 모든 파일/디렉터리의 소유자(User)와 그룹(Group)을 root로 설정합니다.
- chmod +x /opt/tomcat9/bin/*.sh: Tomcat의 실행 스크립트(startup.sh, shutdown.sh 등)에 실행 권한(+x)을 부여합니다.
현재 tomcat9 디렉터리가 root로 설정되어 있어서 패스하고 chmod 실행 권한은 root 계정으로 설정해 주고 지금부터는 root 계정으로 진행하겠습니다.
실무에서는 각 소유자 설정을 하고 해당 소유자 권한에 맞춰서 진행하시면 될 거 같습니다.

4️⃣ Tomcat 환경 변수 설정
앞서 Java 환경 변수를 설정했던 것과 마찬가지로, Tomcat의 설치 경로를 CATALINA_HOME 환경 변수에 지정하여 다른 프로세스나 스크립트에서 이 경로를 쉽게 참조할 수 있도록 합니다.
1.환경 변수 파일 생성
sudo vi /etc/profile.d/tomcat.sh
2.tomcat.sh 내용
export CATALINA_HOME=/opt/tomcat9
export PATH=$CATALINA_HOME/bin:$PATH

3. 환경 변수 적용
source /etc/profile.d/tomcat.sh

- CATALINA_HOME: Tomcat의 홈 디렉터리를 지정하는 표준 환경 변수입니다.
- PATH에 추가: tomcat9/bin 경로를 PATH에 추가하여, 어느 디렉터리에서든 startup.sh나 shutdown.sh 같은 Tomcat 실행 스크립트를 직접 실행할 수 있게 합니다.
5️⃣ Tomcat Systemd 서비스 등록
Tomcat을 백그라운드 서비스로 안정적으로 관리하기 위해 Systemd에 등록합니다. 이는 서버 재부팅 시 자동 시작, 오류 발생 시 자동 재시작 등의 기능을 가능하게 합니다.
"/etc/systemd/system/tomcat.service" 경로에 서비스 정의 파일을 생성합니다.
sudo vi /etc/systemd/system/tomcat.service
파일을 생성해서 해당 내용을 다음과 같이 설정합니다.
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
Environment=CATALINA_PID=/opt/tomcat9/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat9
Environment=CATALINA_BASE=/opt/tomcat9
ExecStart=/opt/tomcat9/bin/startup.sh
ExecStop=/opt/tomcat9/bin/shutdown.sh
User=root
Group=root
Restart=always
[Install]
WantedBy=multi-user.target

- [Unit]: 서비스에 대한 기본 정보 정의 (네트워크 시작 후 실행되도록 설정)
- [Service]:
- Type=forking: Tomcat이 백그라운드 프로세스로 실행됨을 명시합니다.
- Environment=...: Java 및 Tomcat 경로 환경 변수를 명시적으로 지정하여 서비스 실행 환경을 명확히 합니다.
- ExecStart, ExecStop: Tomcat의 시작/종료 셸 스크립트를 지정합니다.
- Restart=always: 매우 중요합니다. 서비스에 오류가 발생하거나 예기치 않게 종료될 경우 항상 자동으로 재시작하도록 설정하여 안정성을 높입니다.
- [Install]: 서버 부팅 시 서비스가 시작되도록 설정합니다.
서비스 파일을 생성했다면, Systemd 시스템에 이를 인식시키고 서비스를 활성화 및 시작합니다.
sudo systemctl daemon-reload # Systemd에게 새 서비스 파일을 알림
sudo systemctl enable tomcat # 서버 부팅 시 자동 시작 설정
sudo systemctl start tomcat # 서비스 즉시 시작
sudo systemctl status tomcat # 서비스 상태 확인

"systemctl status tomcat" 명령을 통해 서비스 상태가 Active: active (running)으로 표시되는 것을 확인하면, 모든 서버 구성 작업이 성공적으로 완료된 것입니다.
마지막으로 로컬 브라우저에서 Tomcat의 기본 화면이 정상적으로 나타난다면 Tomcat 설치 및 Systemd 서비스 등록이 성공적으로 완료된 거라고 보시면 됩니다.

📝 마무리
오늘은 Docker 기반 Rocky Linux 9 환경에서
✔ MariaDB
✔ Java 8
✔ Tomcat
까지 설치하고 기본 환경을 구성하는 전체 과정을 정리해 보았습니다.
이번 글은 단순히 “설치 방법만 나열하는 가이드”라기보다는,
실제 운영 환경과 최대한 유사한 구조를 로컬에서 구성해 보는 흐름을 설명하는 데에 초점을 맞췄습니다.
이 과정을 통해 앞으로 어떤 서비스를 구축하더라도 기반 환경을 자신 있게 세팅할 수 있을 거예요.
궁금한 점이나 추가적으로 다뤄줬으면 하는 내용이 있다면 언제든지 편하게 말씀해 주세요! 🙌😊
'[ Infra ] > Linux · Docker' 카테고리의 다른 글
| [ Linux ] Docker 기반 Ubuntu – 웹 서버 환경 구축 가이드 (MariaDB · Java 8 · Tomcat) (0) | 2025.12.24 |
|---|