개인 블로그 만들기(6) : [서버구축] Oracle Cloud Docker Tomcat 구축 및 배포

2021. 9. 9. 15:34소소한 개발

개인 블로그 만들기(6) : [서버구축] Oracle Cloud Docker Tomcat  구축

 

* 기록용입니다.

* Ubuntu 버전은 20.04 입니다.

* 무료 프론티어를 사용하고 있습니다.

 


1. Docker Tomcat 이미지 Pull

> docker pull tomcat
(특정 버전을 다운로드 하고 싶으시다면 docker pull tomcat:(version) 하시면 됩니다.)

 

2. target 폴더 생성

war 파일로 배포하기 떄문에 war이 위치할 폴더를 따로 생성해 주었습니다.

 

 

3. Spring Boot Project 수정

Spring Boot는 기본적으로 embedded tomcat이 내장된 jar파일로 배포됩니다.

하지만 이번 프로젝트같은 경우 docker의 tomcat(외부 tomcat)을 이용하여 배포할 예정이기 때문에 war 파일로 배포를 해야 합니다.

war 파일로 패포하기 위해서는 외부 tomcat 설정이 추가적으로 필요한데 아래 코드를 추가 및 수정합니다.

(pom.xml)
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>
(java)
@SpringBootApplication
public class HomepageApplication extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(HomepageApplication.class, args);
	}

}

| dependency에 외부 tomcat관련을 추가해줍니다. @SpringBootApplication Class에 extends SpringBootServletInitializer을 해주셔야 합니다.

 

(war로 배포할 때 왜 SpringBootServletInitializer를 상속 받아야 할까?)

Servelt 3.0 이전에는 web.xml에 Application Context를 등록해야했는데 Apache Tomcat이 구동될 때 web.xml을 사용하기 때문인데 Serlvet 3.0 이상부터는 web.xml이 없어도 동작이 가능해 졌는데 web.xml 설정파일을 WebApplicationInitalizer 인터페이스를 구현하여 대신할 수 있게 되었습니다.

 

비슷한 맥락으로 web.xml이 없는 Spring Boot에서는 WebApplicationInitializer 인터페이스를 구현한 SpringBootServletInitializer를 상속을 받는 것이 필요합니다.

(참고 : http://t.ly/3LBL )

 

 

 

4. Maven Package 및 Ubuntu의 Target 폴더에 넣기

| Maven Package를 통해 war 파일을 생성합니다.

해당 war 파일을 Ubuntu의 2번에서 생성했던 target 폴더에 넣어주시면 됩니다.

 

 

 

 

5. docker-compose.yml 수정

version: '3.1'

services:
 mariadb:
  image: mariadb:latest
  container_name: mariadb # 컨테이너 이름 설정
  restart: always
  ports:
   - 3306:3306 # 외부포트:Docker포트
  volumes:
   - /home/ubuntu/mariadb/data:/var/lib/mysql # Docker가 삭제되어도 데이터 유지를 위한 Docker 외부로 데이터 백업
   - /home/ubuntu/mariadb/conf.d:/etc/mysql/conf.d
  environment:
    MYSQL_ROOT_PASSWORD: 1234
  command:
    - --character-set-server=utf8mb4 # 인코딩
    - --collation-server=utf8mb4_unicode_ci
 web:
  image: tomcat:latest
  ports:
   - "8080:8080"
  volumes:
   - /home/ubuntu/mariadb/target/homepage-0.0.1-SNAPSHOT.war:/usr/local/tomcat/webapps/ROOT.war
  restart: always

| 이전에 Docker에 MariaDB를 구축할 때 docker-compose.yml로 생성 및 실행했는데 해당 파일을 조금 수정하겠습니다.

web이라는 이름으로 tomcat:latest image를 사용할것입니다.

간단한 설정이라서 세세한 설정은 하지 않았으며 Docker Tomcat 내부의 webapps 폴더에 ROOT.war이름으로 파일을 쉽게 넣기 위해 volumes 설정을 추가해 주었습니다.

 

volumes:
   - /home/ubuntu/mariadb/target/homepage-0.0.1-SNAPSHOT.war:/usr/local/tomcat/webapps/ROOT.war

volumes:
   - (target 폴더 경로)/(maven package 파일명.war):/usr/local/tomcat/webapps/ROOT.war

 

 

6. docker-compose.yml down 및 up

$ docker-compose down
$ docker-compose up -d

| 잘 실행이 되었으면 2개의 Container가 있을겁니다. 하나는 MariaDB, 하나는 Tomcat이 실행되었을 텐데요.

Oracle 방화벽 설정에서 8080을 추가한 뒤, Oracle 주소 : 8080으로 접속 할 수 있습니다.

저같은 경우 RestController로 임시로 생성했는데요. 한번 확인해 봅시다.

 

 

7. 확인

| Oracle에 있는 공용IP:8080으로 접속하면 제대로 접속이 되는것을 확인할 수 있습니다.

DB와 Tomcat 모두 제 컴퓨터가 아닌 Oracle Cloud에 있는데요. 24시간 돌아가는Web Server가 완성이 되었습니다.

 

target 폴더에 업데이트된 war 파일을 넣게 되면 업데이트된 파일을 인식해서 자동으로 tomcat재부팅이 됩니다.

즉, tomcat을 수동으로 재부팅하지 않았도 되죠.