[Docker] Docker Compose로 개발환경 설정하기

SJ.CHO·2024년 11월 8일
0
post-thumbnail

개발 배경

  • 기존 S/W 배포방식의 한계

    • 개발환경과 운영환경의 차이로 인해 다양한 환경에서의 라이브러리 버전, 설정 값, OS 차이 등 호환성 문제가 발생함.

    • Docker 는 APP 과 환경을 함께 묶어서 하나의 이미지 를 배포하며 모든 환경에서의 동일한 설정과 종속성을 유지함.

  • 가상화의 대한 높은 자원소모

    • 기존 가상화 기술(VMware, VirtualBox)은 APP을 격리된 환경에서 사용할 수 있지만, 각 가상머신마다 OS 전체를 구동해야 하기 때문에 많은 자원(CPU, Memory)를 소비함.

    • Docker 는 OS 레벨에서 격리된 컨테이너 를 사용하여 기존의 가상화 기술보다 더 가볍고 빠르게 APP을 실행 할 수 있게 함.

  • MSA의 부상

    • S/W 개발에서 MSA(MicroService Architecture) 가 주목받으며, 각기 독립적인 서비스로 나눠야 하는 APP의 관리 및 배포 중요성이 증가함.

    • Docker 는 MSA 환경에서 독립적으로 배포 및 관리될 수 있는 최적의 환경을 제공함.


개요

  • 컨테이너 기반 가상화 기술

    • Docker 는 프로세스 단위의 격리를 통해 APP 및 종속성을 모듈 식 Container 로 패키징 함.
    • 이로 인해 VM이 필요하지 않으며 각각의 APP은 OS 리소스를 서로 공유하고 CPU 나 Memory를 필요한 만큼만 할당하여 성능 손실이 적음.
    • 하나의 서버에서도 여러개의 Container 가 실행되더라도 성능에 영향을 받지않고 독립적으로 실행됨.

  • Image 와 Container 구조

    • ImageContainer 를 정의하는 읽기 전용 템플릿으로 Container 가 실행되기위해 필요한 라이브러리 및 종속성에 대한 정의가 포함되어 있음.

    • 하나의 Image 로 여러 Container 가 생성 될 수 있으며, Container 상태가 변경되더라도 Image 는 변하지 않음. 추가로 변경되는 값은 Container 에 저장됨.

    • Container 는 인스턴스화(실행된) Docker의 이미지임. 서버를 확장해야하는 경우에도 Image 와 Container 생성을 통해 쉽게 서버의 확장이 가능함


설치 가이드

설치 링크

  • 해당 텍스트를 클릭하여 docker 설치 페이지로 이동한다.

  • 자신의 OS 버전과 일치한 파일을 받고 실행/설치를 진행한다.
    • 리눅스사용자에 경우 별도의 설치가이드 공식문서 참조.

$ docker --version					# 설치된 docker 버전 확인

  • 설치 버전 확인
    • 자신의 터미널에 해당 명령어를 입력하여 설치 여부 및 버전을 확인 해 준다.

이미지 설치

설치링크

  • GUI 환경에서는 위 링크로 들어가서 해당 APP의 Image 를 다운로드 받을 수 있다.
  • MySQL 외에도 다양한 이미지들이 존재한다!

$ docker pull imgeName					# imgeName 의 image 를 다운로드
  • GUI 가 아닌 CLI 환경에서도 설치가 가능하다.

설정하기

  • 사용할 프로젝트 위치 최상단폴더에 docker-compose.yml 파일을 작성하여 해당 컨테이너 환경을 설정한다.

  • 아래에서는 프로젝트 팀원끼리 DataBase 환경을 공유하기 위하여 MySQL 컨테이너 환경을 설정했다.

  • docker-compose.yml

services:
  mysql:  
    image: mysql:8.0 						# 생성 이미지 이름 : 버전
    container_name: {ContainerName}			# 생성 할 컨테이너 이름
    environment:							# DB 환경 변수
      MYSQL_ROOT_PASSWORD: {admin}			# root 계정 비밀번호
      MYSQL_DATABASE: {DataBaseName}		# 생성 할 DB 이름
      MYSQL_USER: {admin}					# DB 를 사용할 유저 이름
      MYSQL_PASSWORD: {admin}				# DB 를 사용할 유저 비밀번호
    ports:
      - "3307:3306"							# 포트번호 host:docker 로컬 포트에 도커포드를 마운트
    volumes:
      - db-data:/var/lib/mysql				# 로컬 저장경로 : 도커 저장경로 / 컨테이너가 삭제되도 호스트에 데이터가 남게된다.
    networks:
      - app-network							# 컨테이너가 연결될 네트워크
    healthcheck:							# MySQL 의 서비스 상태 확인
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
      timeout: 20s
      retries: 10
    restart: always							# 컨테이너 비정상 종료시 재시작

networks:									# bridge 드라이버를 통해 컨테이너가 네트워크 통신 가능
  app-network:
    driver: bridge
volumes:									# 독립적으로 관리 되는 볼륨으로 데이터 보존을 위해 사용.
  db-data:									# 데이터를 호스트에 저장하여 데이터 영속성 유지
  • application.properties

spring.datasource.url=jdbc:mysql://localhost:3307/DataBaseName				# MySQL 연결 URL
spring.datasource.username=admin											# DB 사용자 이름
spring.datasource.password=admin											# DB 사용자 패스워드
  • spring.datasource.url, username, password: docker-compose.yml 의 enviroment 값과 일치하도록 설정하는 것이 중요하다.

  • IntelliJ 의 Database 프로퍼티 또한 동일하게 작성해준다.

실행

  • 실행 전 yml 파일을 생성한 디렉토리 경로로 이동 해준다.
  • Container 실행

$ docker-compose up -d				# docker-compose.yml 에 설정된 모든 컨테이너 실행
  • -d : 컨테이너를 백그라운드 환경에서 실행, 터미널을 종료하더라도 사용 가능.

  • --build : 변경된 파일이 있을 경우, 이미지를 재 빌드 및 컨테이너 실행.

  • Container 종료

$ docker-compose down				# 실행 중인 모든 컨테이너와 연결 종료
  • 해당 명령을 실행해도 데이터는 삭제되지 않으며, 볼륨과 이미지는 유지 된다.

  • -v : 연결되있는 볼륨까지 모두 중지하고 싶을시 사용.

  • stop : 실행중인 컨테이너를 중지 시키고 싶을때 사용.

  • CLI, GUI 모두 컨테이너가 실행 된 모습을 확인 가능하다.

  • Docker의 컨테이너를 Down 하였다가 다시 Up 하더라도 DB의 데이터 영속성은 보장된다.

그 외 주요 명령어

$ docker ps				# 현재 실행중인 모든 컨테이너 확인			
  • STATUS
    • Up : 실행 중
    • Exited : 종료
    • Created : 생성/실행대기
    • Paused : 일시정지
    • Restartung : 자동 재시작
    • Dead : 비정상 종료상태
$ docker logs {ContainerName}		# 해당 컨테이너 로그 확인			
  • -f : 로그를 실시간으로 확인
  • --tail {Number} : Number 만큼 로그 출력
$ docker exec -it {ContainerName OR ID} {Command}  # 실행중인 컨테이너 내부 명령어 실행 
  • Ex) docker exec -it {ContainerName} /bin/bash : bash 쉘에 접속

권한 부여

org.hibernate.exception.GenericJDBCException: unable to obtain isolated JDBC connection [Access denied for user 'admin'@'localhost' (using password: YES)] [n/a]
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:63) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
  • 기존의 개발환경에서는 Local DB 에 root 사용자로써 DB의 접근 권한설정이 배제되었지만 Docker 는 기존유저를 만들어서 접근하기에 권한설정이 필요할 때가 있다.

  • show databases : 접근하려는 DB가 존재하는지 확인 한다.

  • docker exec -it {DataBaseName}{imageName} -u root -p : 해당 컨테이너 MySQL 에 root 권한자로 접근 한다.

  • GRANT ALL PRIVILEGES ON {DataBaseName}.* TO '{UserName}'@'%' 명령어를 통해 사용자에게 권한을 부여해준다
    • 해당 명령어는 DataBaseName 의 DataBase에 모든 권한을 부여
  • FLUSH PRIVILEGES : 권한을 갱신한다.
GRANT ALL PRIVILEGES ON *.* TO '{UserName}'@'%';
  • 모든 DataBase모든 권한 을 부여.
GRANT ALL PRIVILEGES ON {DataBaseName}.* TO '{UserName}'@'{IP NumBer}';
  • DataBaseName 의 모든 권한을 갖지만 IP NumBer 의 IP 로만 접속이 가능하다.
SHOW GRANTS FOR '{UserName}'@'{HostName}';
  • 사용자가 가지고 있는 권한 확인.
REVOKE ALL PRIVILEGES ON {DataBaseName}.* FROM '{UserName}'@'{HostName}';
  • 사용자가 가지고 있는 모든 권한 철회.

팀원이 GitHub를 통해서 설정을 받아 사용하기.

  1. DockerDocker Desktop 설치
  2. Repository Clonedocker-compose.yml 파일 Pull
  3. Docker Compose로 MySQL 컨테이너 실행
  4. Spring Bootapplication.properties 파일과 동일하게 DataBase 프로퍼티 설정.
profile
70살까지 개발하고싶은 개발자

0개의 댓글