728x90
반응형
728x90
반응형
728x90
반응형

이번에 내가 docker을 적용하면서 겪은 내용을 정리해 본다.
먼저 docker가 무엇이고 왜 사용하는지는 구글을 검색해보길 바란다.

ubuntu 서버 세팅은 아래 내 글을 참고하자.

[Oracle Cloud] ubuntu server setting

지난주 금요일 오후에 클라우드 서버에 수정된 내용을 반영하려고 보니 접속이 되지 않았다. 분명 전날까지 됐던것 같은데 안 되는 것이다. 무료 평가판이 종료되었다는 메일은 받았지만, 그래

deonggi.tistory.com


1. docker 설치 및 세팅은 이 글을 참고

Ubuntu 20.04 Docker 설치하기. - 달소씨의 하루

이번에는 Ubuntu 20.04 LTS Server 버전에서 Docker 설치를 한번 진행해보겠습니다. 설치방법은 매번 하던대로라서.. 크게 달라지지않지만 기록용으로 남겨봅니다. 설치하기전에 기본적으로 apt update & ap

blog.dalso.org

이 글을 따라면 docker를 설치할 수 있다.
그리고 해당글의 portainer는 docker의 이미지, 컨테이너, 네트워크 관리에서 유용하므로 설치하는 것을 추천한다.

2. 원하는 tomcat 이미지를 받자.
docker hub에 접속하여 원하는 이미지를 검색한다.
그리고 docker pull 이미지명 으로 이미지를 받는다.
이미지 명의 콜론(:) 버전을 구분하기 위한 태그다. 원하는 특정 버전을 설치한다면 태그를 입력해 줘야 한다.

docker images로 현재 가지고 있는 이미지를 확인할 수 있다.

3. 이미지로 컨테이너 생성 및 실행

docker run -d -it --name con_test -p 8080:8080 tomcat:8.5.78-jre8-temurin-focal
입력된 명령어를 정리하면
1) -d : 백그라운드로 실행, 터미널을 빠져나와도 여전히 컨테이너는 실행됨
2) -it : 컨테이너를 종료하지 않고 계속 터미널에 입력
3) --name : 컨테이너의 이름을 지정 (길어 잘렸는데 위 스샷에서 맨아래 붉은줄에서 오른쪽 끝에 해당 이름이 표시됨)
4) -p : 포트지정, docker host 포트:docker 컨테이너 내부 포트로 바인딩
외부에서 8080포트로 서버에 접근하면 컨테이너 내부의 톰캣 기본 포트인 8080으로 연결해 주겠다는 의미
5) 맨 뒤의 tomcat:8.5.78-jre8-temurin-focal 은 2번에서 받은 이미지로 컨테이너를 생성

4. 톰캣 실행 결과
위 4번에서 두번째 빨간줄 docker ps -a 명령어로 이미 실행중임이 확인되고 있다.
그런데 브라우저로 접속하면 아래와 같다.

404 에러가 나고 있는데 이는 톰캣의 응답으로 정상이다.
call에 응답할 있는 war 파일을 넣어주면 된다
그러려면 설치된 컨테이너에 war 파일을 어디에 위치하고, 어떻게 넣어줘야 할까?

명령어를 docker exec -it con_test bash 라고 입력해준다.
con_test 컨테이너로 접속하여 명령어를 입력하겠다는 의미다.
붉은색 박스를 보면 컨테이너로 접속된 것을 알 수 있다.
컨테이너에 접속된 위치가 tomcat이 설치된 것으로 보여지는데 ls -la로 확인하면 맞는것을 알 수 있다.
그러므로 con_test 컨테이너의 /usr/local/tomcat/webapps 폴더에 ROOT.war 라고 war 파일을 넣어주면 되는 것이다.

exit로 컨테이너에서 나오고, docker 컨테이너에 파일을 복사해 넣는다.
docker cp /opt/HelloWorld.war con_test:/usr/local/tomcat/webapps/ROOT.war
docker host의 /opt 폴더에 HelloWorld.war 파일이 있는데 이걸 con_test 컨테이너의 /usr/local/tomcat/webapps 폴더에 ROOT.war로 파일로 넣어준다는 의미다.
에러 없이 복사 되었는지 확인해 준다. 파일명이 잘못된거나 폴더가 잘못 되었다면 에러가 난다.
(반대로 하면 컨테이너 파일을 docker host로 복사할 수 있다.)

그리고 잠시 후 다시 8080 포트로 접속해 보면 아래와 같이 정상 적용되는 것을 확인할 수 있다.


테스트를 위해 간단히 만든 war 파일로 Hello World라고 표시하고 있다.

5. 톰캣 컨테이너 삭제

docker stop con_test (또는 container id) : 컨테이너를 정지
docker rm con_test (또는 container id) : 컨테이너 삭제

6. docker 이미지 삭제

docker rmi tomcat:8.5.78-jre8-temurin-focal (또는 image id)


728x90
반응형
728x90
반응형

tomcat version : 8.5.69.0

 

1. tomcat으로 war 배포하기

위치 : tomcat설치폴더\conf\server.xml 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Server>
 
  <!-- 생략 -->
 
  <Service name="SERVER1">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="0.0.0.0" secretRequired="false" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
      </Realm>
      <!-- war 파일 위치 지정-->
      <Host name="localhost"  appBase="C:\webapps" unpackWARs="true" autoDeploy="true">
        <!-- 해당되는 war 파일명 -->
        <Context docBase="server1" path="/" reloadable="true"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
cs

2개 이상의 war를 하나의 tomcat에서 배포시 아래 붉은색 텍스트 부분을 바꿔 등록하고,

  <Service name="SERVER1">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  </Service>

13번에 war파일 위치(위치는 수정가능), 15번 라인을 통해 해당되는 war 파일을 지정한다.

 

2. 가상 디렉토리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Server>
  <!-- 생략 -->
  <Service name="SERVER1">
    <!-- 생략 -->
    <Engine name="Catalina" defaultHost="localhost">
      <!-- 생략 -->
      <!-- war 파일 위치 지정-->
      <Host name="localhost"  appBase="C:\webapps" unpackWARs="true" autoDeploy="true">
        <!-- 해당되는 war 파일명 -->
        <Context docBase="server1" path="/" reloadable="true"/>
        <!-- virtual directory (ex. 이미지 url) : 물리위치과 맵핑되는 paht -->
        <Context docBase="c:\uploads\server1" path="/uploads/server1" reloadable="true"/>
        <!-- 생략 -->
      </Host>
    </Engine>
  </Service>
</Server>
cs

1번과 같이 세팅한 상태에서 12번 라인을 추가하면 된다.

이렇게 하면 서버의 c:\uploads\server1\image.jpgwebUrl/uploads/server1/image.jpg 로 접근이 가능해진다.

 

* 출처

 

[Tomcat] 톰캣 하나로 여러 개의 war파일 배포하기

[Tomcat] 톰캣 하나로 여러 개의 war파일 배포하기 자, 일단 tomcat과 war파일 일대일로 배포하는 방법은 안다고 가정하겠다. 모른다면 아래링크를 참고하자. [Java] Eclipse 웹프로젝트 war파일 배포하는

haenny.tistory.com

 

톰캣의 컨텍스트 외부로 경로 매핑하는 방법 - Nothing New Under the Sun

일반적으로 웹 프로젝트를 진행해보면 디자인은 디자인팀에서, 프로그램은 프로그램 개발팀에서 별개로 진행하게 되어 별개의 산출물이 만들어진다. 그래서 개발팀의 프로젝트 소스에 디자인

feeva.github.io

 

 

[CVE-2020-1938] apache tomcat 취약점에 따른 업데이트시 참고 사항 – 지락문화예술공작단

CVE-2020-1938 취약점 CVE : http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1938 KISA : https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35292APACHE : http://tomcat.apache.org/security-7.html#Fixed_in_Apache_Tomcat_7.0.100

jirak.net

 

분명한건 이전에 해보긴 했다.

문제는 남이 해 놓은거에 숫가락 얻기로 해봤다는거..

역시 모든 것은 역경과 고난(이라고 쓰고 간단히 삽질)을 거쳐야만 배우는걸까?     '') (먼산)

나란 사람 메뉴얼 보다는 무조건 부디쳐봐가며 한다는게 문제.

그래서 담에는 삽질 시간을 줄여보다는 마음으로 기록해둠.

 

* 관련글

[tomcat] memory leak 에러 : https://deonggi.tistory.com/26
[Tomcat] 실행에러 : https://deonggi.tistory.com/76
[Tomcat] java.lang.IllegalArgumentException: The main resource set specified [FOLDER_NAME] ... : https://deonggi.tistory.com/77

 

 

 

728x90
반응형
728x90
반응형

tomcat 8.5.41

gradle 프로젝트

 

The web application [projectName] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

 

tomcat에서 war 배포시 위와 같은 오류 메시지와 함께 창이 사라졌다.

다른 사람들은 무시해도 된다고 했든데 난 tomcat 창이 죽어버리니 미쳐버릴 노릇.

해결방법으로 제시된 것은 프로젝트의 lib 폴더에서 드라이버.jar 파일을 제거 후 war를 만들고,

tomat설치폴더/lib/ 에 드라이버.jar 파일을 넣으라는 것이다.

 

 

그래서 아래와 같이 해결

 

1. gradle의 mysql driver에 해당되는 것을 아래와 같이 변경한다.

compile("mysql:mysql-connector-java:5.1.13") => providedCompile("mysql:mysql-connector-java:5.1.13")

providedCompile 은 컴파일할때는 포함하고 war 생성시는 제외한다는 의미

 

2. gradle을 사용하고 있다면 아마도 드라이버.jar 파일이 없을테니 검색해서 다운로드 한다.

https://dev.mysql.com/downloads/connector/j/5.1.html

 

3. 다운로드 받은 드라이버.jar 파일을 tomcat 설치 폴더의 lib에 복사해 준다.

tomcat설치 폴더가 C:\apache-tomcat-8.5.41 라면 C:\apache-tomcat-8.5.41\lib 여기에

 

 

이렇게 해서 해결.

아.. 모르면 손발이 고생한다더니... ㅜ_ㅜ

 

 

 

Tip1 : tomcat 설치에 대한 정보는 아래 url 참조

https://zetawiki.com/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%ED%86%B0%EC%BA%A38_%EC%84%A4%EC%B9%98

 

Tip2 : tomcat 실행 후 창이 사라질 때

1. cmd 명령어로 창을 연다.

2. 1번창에서 tomcat 설치폴더의 startup.bat와 동일한 폴더로 이동한다.

tomcat설치 폴더가 C:\apache-tomcat-8.5.41 라면 C:\apache-tomcat-8.5.41\bin 여기

3. 2번 위치에서 catalina run 이라고 입력하고 엔터

4. tomcat 창이 사라질 에러까지 표시하고 다시 명령어를 입력하라는 커서가 깜빡이는 상태로 돌아간다.

5. 4번 상태에서 마지막에 표시되는 에러를 확인

 

 

* 관련글

[Tomcat] 실행에러 : https://deonggi.tistory.com/76
[Tomcat] java.lang.IllegalArgumentException: The main resource set specified [FOLDER_NAME] ... : https://deonggi.tistory.com/77
[tomcat] war 배포하기, 가상 디렉토리 : https://deonggi.tistory.com/126

 

728x90
반응형

+ Recent posts