하이퍼바이저
는 가상머신을 구동할 수 있게 해주는 소프트웨이이다. 도커는 하이버바이저 구조를 토대로 등장했고 각 컨테이너 안에 다른 환경을 구축할 수 있다.도커 파일
: 도커 이미지를 구성하기 위해 필요한 의존성, 소스코드 등을 하나의 file로 기록하여 이미지화 시킬 명령 파일이다. 도커 파일의 명령을 기반으로 도커 이미지가 생성된다.
도커 이미지
: 도커 컨테이너 생성, 실행에 필요한 명령들을 가지고 있는 스크립트. 많이 사용되는 것들은 공식적으로 찾아서 사용할 수 있다.
도커 컴포즈
: Docker Compose란 여러개의 컨테이너로 이루어진 서비스를 구축 및 네트워크 연결, 실행 순서를 자동으로 관리하는 도구이다.bootJar {
archiveFileName = 'app.jar'
}
version: "3.8" # 도커 컴포즈의 버전, 도커버전과의 호환성을 고려
services: # 이 항목 밑에 실행하려는 컨테이너들을 정의
pharmacy-recommendation-redis: # container_name이 따로 설정되어 있지 않다면 이것과 비슷한 이름으로 컨테이너 이름이 설정됨
container_name: pharmacy-recommendation-redis # 컨테이너 명
build: # 도커 허브에서 기본이미지를 다운 받아서 사용하는 것이 아닌 Dockerfile로 이미지를 빌드하겠다.
dockerfile: Dockerfile
context: ./redis # dockerfile을 사용하는 폴더명(일반적으로 하위폴더명)
image: chaseungjun/pharmacy-recommendation-redis
ports:
- "6379:6379"
restart: always # 컨테이너가 다운되었을 경우 항상 재시작
pharmacy-recommendation-database:
container_name: pharmacy-recommendation-database
build:
dockerfile: Dockerfile
context: ./database
image: chaseungjun/pharmacy-recommendation-database
environment:
- MARIADB_DATABASE=pharmacy-recommendation
- MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
volumes:
- ./database/config:/etc/mysql/conf.d
- ./database/init:/docker-entrypoint-initdb.d
ports:
- "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
pharmacy-recommendation-app:
container_name: pharmacy-recommendation-app
build: . # 파일의 위치
depends_on: # database, redis 컨테이너가 생성,실행된 다음에 app컨테이너를 실행시킨다. (의존성을 생각하면 됨),
초기화까지 완료되어서 database,redis에서 사용가능한 상태가 되는 것은 별개임. 돌아가기만 한 상태에서 database가 접근하면 사용 불가능할 수도 있다.,
- pharmacy-recommendation-database
- pharmacy-recommendation-redis
image: chaseungjun/pharmacy-recommendation-app
environment: # .env 파일로 환경변수 설정
- SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- KAKAO_REST_API_KEY=${KAKAO_REST_API_KEY}
ports:
- "80:8080" # 브라우저의 기본 포트인 80 포트로 접근하면 스프링부트의 기본포트 인 8080 포트로 보낸다
restart: always # depends on은 실행 순서만 컨트롤 할뿐,
# 컨테이너 안의 서비스가 실행가능한 상태인지까지는 확인 하지 않기 때문에
# DB 또는 Redis가 아직 실행가능한 상태가 아니여서 실패하는 경우 재시작 하도록 설정
docker-compose -f docker-compose-local.yml up // 실행
docker-compose -f docker-compose-local.yml down // 중지 및 컨테이너 정리
한글이 깨지는 경우 아래 코드를 넣은 .cnf 파일
을 생성해서 적절한 위치에 넣어준다. 위치는 db마다 다르므로 찾아볼 것
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
환경 변수
정보 들을 분리하여 별도의 파일로 구성할.env
파일을 구성HashiCorp Vault
고려하자$ docker-compose config // .env 파일 자동 반영
$ docker-compose up // 이미지 없을 때 이미지 빌드 후 컨테이너 실행(이미지 존재하는 경우 해당 이미지 사용)
$ docker-compose up --build // 이미지가 있든 없든 재빌드 하여 컨테이너 실행
$ docker-compose stop // 현재 실행중인 컨테이너 종료
$ docker-compose down // dockerCompose에서 사용하는 컨테이너 삭제
따로 컨테이너 이름이나 아이디를 적지 않는 이유는
현재폴더에 있는 docker-compose파일을 대상으로 하기 때문이다
주의해야 할 것은 .env 는 도커 컴포즈가 실행될 때 참조하는 파일이므로 application.yml은 따로 환경변수를 설정해야한다는 것이다.
클라우드로 배포할 때는 컨테이너로 띄우기 때문에 .env파일을 참조하지만 로컬에서 개발할때는 application.yml를 참조한다.
-참고
패스트캠퍼스 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) 초격차 패키지 Online.