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 명령어 입력
- 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 | 컨테이너 상태 확인 방법 정의 |
'docker' 카테고리의 다른 글
[Docker]WSL2,DockerDesktop Docker 정보 동기화가 안되는 경우 (0) | 2024.09.22 |
---|---|
[Docker]도커 컨테이너에 WAS 설치 후 배포해보기 (1) | 2024.09.18 |
[Docker]System has not been booted with systemd as init system (PID 1). Can't operate.Failed to connect to bus: Host is down 에러 해결방 (0) | 2024.09.18 |
[Docker]Window 환경에서 Docker 실행하기 (1) | 2024.09.18 |