docker

[Docker]Dockerfile,Docker-compose을 이용해 Tomcat, DB 컨테이너 생성

joje* 2024. 9. 23. 18:22

Dockerfile과 Docker-compose를 이용해 Tomcat, DB 컨테이너를 생성해 로컬에 띄워보는 실습을 시도해보았다.
 
1. Docker image 생성을 위해 프로젝트에 DockerFile을 추가 후 관련된 내용을 작성한다.
2. 생성된 Docker image를 바탕으로 Docker-compose를 이용해 Tomcat 컨테이너를 생성한다.
3. postgresql 이미지를 내려받아 Docker-compose를 이용해  DB 컨테이너를 생성한다.
4. 기타 설정
 
- 프로젝트 정보
springboot 3.3.4
openJDK 17
gradle 8.10.1
 
1. Dockerfile 작성
프로젝트 바로 아래에 Dokcerfile을 생성하고 아래와 같이 작성해준다.

 
FROM : 베이스 이미지를 설정해준다. 여기서는 리눅스 ubuntu 20.04 배포판을 base로 하는 이미지를 생성해준다.
 
RUN: 실행계획을 적어준다.순서대로 설명해보면,
 
apt-get 패키저를 update 한다. 
원격으로 Tomcat 파일을 받아야 하므로, wget을 설치해준다.
openjdk17버전과 Tomcat 10.1.30 버전을 각각 서버에서 다운로드 해준다.
Tomcat tar 파일의 압축을 풀어준다.
 
WORKDIR: 베이스 이미지로 구축된 환경에서의 작업디렉토리 경로를 나타낸다.
여기서는 최상위 디렉토리로 설정하였다.
 
EXPOSE: 컨테이너 내부에서 외부와 통신할 수 있도록 열어주는 포트를 의미한다.
Tomcat 기본 포트인 8080으로 설정하였다.
 
LABEL:  도커 컨테이너에 LABEL을 붙여, 컨테이너 조작을 더욱 손 쉽게 만들어준다.
(컨테이너 실행 후 'docker inspect <컨테이너명>'을 통해 확인가능하다.)
여기서는 간단히 test라 지었다.
 
ENTRYPOINT: 컨테이너가 실행되었을 때 실행될 스크립트를 작성해준다.
여기서는 톰캣을 실행하는 명령을 실행한다.
 
- 결과확인
Dockerfile 위에서 우클릭하여 실행 후  'docker images' 명령어를 이용해 보면 2개의 이미지가 생성되었음을 확인할 수 있고, 'docker ps' 명령어를 이용해 현재 실행중인 컨테이너를 확인 시 만들어진 임의의 이미지를 바탕으로 컨테이너가 생성되어 실행되고 있음을 확인해 볼 수 있다.

 
(** 내부 컨테이너 포트는 열어줬지만 host 포트를 설정해주지 않았으므로 당연히  'localhost:8080'으로 접속 시 접속은 되지 않는다.)
 
2. 생성된 Docker image를 바탕으로 Docker-compose를 이용해 Tomcat 컨테이너를 생성한다.
Docker-compose 파일을 생성하고 아래와 같이 작성해준다.

 

  • container_name: 생성될 컨테이너 이름을 적어준다.
  • build-context: 빌드에 사용될 파일이 있는 경로를 적어준다.(root경로(프로젝트) 기준이라고 생각하고 적어준다.)
  • build-dockerfile: 컨테이너 생성 시 사용될 이미지를 만들어주기 위해 작성한 Dockerfile의 이름을 적어준다.
  • ports: <host 포트: 컨테이너 내부 포트> 형식으로 포트포워딩 할 포트를 적어준다.
  • depends_on: 컨테이너 생성 순서를 결정해준다. 'DB' 서비스를 먼저 작업하고 이후에 'web' 서비스를 실행해 컨테이너를 생성한다.

 
3. postgresql 이미지를 내려받아 Docker-compose를 이용해  DB 컨테이너를 생성한다.

 

  • image: 생성될 컨테이너에서 이용될 이미지 파일의 이름과 버전을 적어준다.
  • ports: 포트 포워딩할 포트를 지정해준다. <host 포트: 컨테이너 내부 포트> 
  • container_name: 생성될 컨테이너 이름을 적어준다.
  • enviroment-TZ: 데이터베이스의 TimeZone을 지정해준다.
  • enviroment-POSTGRES_USER: 데이터베이스 사용자를 지정해준다.
  • enviroment-POSTGRES_PASSWORD: 접속 시 사용할 암호를 지정해준다.
  • enviroment-POSTGRES_DB: 데이터베이스명을 적어준다.
  • volumes: 도커 컨테이너의 경우, 컨테이너 종료와 함께 내부의 정보가 휘발되어 사라지므로, 데이터베이스의 데이터를 영구적으로 저장하기 위해 volume 기능을 활용해 데이터 경로를 로컬에 마운트 해준다.<로컬 디렉토리: 컨테이너 내부 디렉토리>

 
작성된 내용의 의미는 다음과 같다.
 
./DB:/var/lib/postgresql/data
: 컨테이너 내부 /var/lib/postgresql/data 경로에 있는 파일들을 로컬의 ./DB(프로젝트 아래 DB 폴더 내부) 경로에 마운팅 해준다.
 
 ./ddl/user.sql:/docker-entrypoint-initdb.d/user.sql
: 컨테이너 생성과 동시에 특정 ddl문을 실행해 데이터베이스에 스키마를 생성하도록 한다.
user.sql sql문 파일을 컨테이너 생성 시 같이 실행되도록 한다.
 

  • restart: 컨테이너 재시작 정책을 설정한다. 여기서는 always로 컨테이너가 종료되면 항상 재시작 할 수 있도록 설정해준다.

 
4. 기타설정
데이터베이스 컨테이너 생성 시 접속에 이용되는 사용자 정보들은 외부에 노출되지 않도록 해야하므로 루트 경로에 .env 파일을 생성 후 환경 변수를 이용하도록 한다.
(** 네트워크 서비스 설정의 경우 컨테이너 정보 확인 시 NetworkId 값이 같아 따로 설정할 필요가 없을 듯 해 설정안함.)
 
- 결과확인
실행:  docker-compose up -d
로그확인: docker-compose logs 
컨테이너 정보 확인: docker inspect <컨테이너 명>
 

프로젝트 구조

 
 
 
도커 데몬을 실행한 상태에서 터미널에서  docker-compose up -d 명령어 입력 

Docker-compose 파일 생성

 

컨테이너 생성 및 구동 확인
톰캣 접속 확인

 

데이터베이스에 스키마 생성 확인
테스트 데이터 INSERT 후 컨테이너 재구동 시 데이터 확인(volumes 결과 확인)

 
 
- Dockerfile 작성항목

항목 설명
FROM Docker Base Image (기반이 되는 이미지)
MAINTAINER 메인테이너 정보 (작성자 정보)
RUN Shell Script 또는 명령을 실행
CMD 컨테이너가 실행되었을 때 명령이 실행
LABEL 라벨 작성 (inspect 명령으로 label 확인 가능)
EXPOSE 호스트와 연결할 포트 번호를 설정
ENV 환경변수 설정
ADD 파일/디렉터리 추가
COPY 파일 복사
ENTRYPOINT 컨테이너가 시작되었을 때 실행할 스크립트
VOLUME 볼륨 마운트
USER 명령 실행할 사용자 권한 지정
WORKDIR 명령이 실행될 작업 디렉터리 설정
ARG Dockerfile 내부 변수
ONBUILD 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행
SHELL Default Shell 지정

 
- Dockercompose 작성항목

항목 설명
version docker-compose 파일의 버전 지정
services 컨테이너 서비스를 정의
image 사용할 Docker 이미지 지정
build 이미지 빌드 설정 (context, dockerfile)
ports 호스트와 컨테이너 간 포트 매핑
volumes 호스트와 컨테이너 간 파일 공유
networks 서비스 간의 네트워크 설정
depends_on 서비스 간의 의존성 설정
enviroment 환경 변수 설정
command 컨테이너 시작 시 실행할 명령어 지정
restart 재시작 정책 설정
healthcheck 컨테이너 상태 확인 방법 정의