개발환경과 운영환경의 차이로 인해 다양한 환경에서의 라이브러리 버전, 설정 값, OS 차이 등 호환성 문제가 발생함.
Docker 는 APP 과 환경을 함께 묶어서 하나의 이미지
를 배포하며 모든 환경에서의 동일한 설정과 종속성을 유지함.
기존 가상화 기술(VMware, VirtualBox)은 APP을 격리된 환경에서 사용할 수 있지만, 각 가상머신마다 OS 전체를 구동해야 하기 때문에 많은 자원(CPU, Memory)를 소비함.
Docker 는 OS 레벨에서 격리된 컨테이너
를 사용하여 기존의 가상화 기술보다 더 가볍고 빠르게 APP을 실행 할 수 있게 함.
S/W 개발에서 MSA(MicroService Architecture) 가 주목받으며, 각기 독립적인 서비스로 나눠야 하는 APP의 관리 및 배포 중요성이 증가함.
Docker 는 MSA 환경에서 독립적으로 배포 및 관리될 수 있는 최적의 환경을 제공함.
모듈 식 Container
로 패키징 함.Container
가 실행되더라도 성능에 영향을 받지않고 독립적으로 실행됨.
Image
는 Container
를 정의하는 읽기 전용 템플릿으로 Container 가 실행되기위해 필요한 라이브러리 및 종속성에 대한 정의가 포함되어 있음.
하나의 Image 로 여러 Container 가 생성 될 수 있으며, Container 상태가 변경되더라도 Image 는 변하지 않음. 추가로 변경되는 값은 Container 에 저장됨.
Container 는 인스턴스화(실행된) Docker의 이미지임. 서버를 확장해야하는 경우에도 Image 와 Container 생성을 통해 쉽게 서버의 확장이 가능함
docker
설치 페이지로 이동한다.$ docker --version # 설치된 docker 버전 확인
$ docker pull imgeName # imgeName 의 image 를 다운로드
사용할 프로젝트 위치 최상단폴더에 docker-compose.yml
파일을 작성하여 해당 컨테이너 환경을 설정한다.
아래에서는 프로젝트 팀원끼리 DataBase 환경을 공유하기 위하여 MySQL
컨테이너 환경을 설정했다.
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: # 데이터를 호스트에 저장하여 데이터 영속성 유지
spring.datasource.url=jdbc:mysql://localhost:3307/DataBaseName # MySQL 연결 URL
spring.datasource.username=admin # DB 사용자 이름
spring.datasource.password=admin # DB 사용자 패스워드
$ docker-compose up -d # docker-compose.yml 에 설정된 모든 컨테이너 실행
-d
: 컨테이너를 백그라운드 환경에서 실행, 터미널을 종료하더라도 사용 가능.
--build
: 변경된 파일이 있을 경우, 이미지를 재 빌드 및 컨테이너 실행.
$ docker-compose down # 실행 중인 모든 컨테이너와 연결 종료
해당 명령을 실행해도 데이터는 삭제되지 않으며, 볼륨과 이미지는 유지 된다.
-v
: 연결되있는 볼륨까지 모두 중지하고 싶을시 사용.
stop
: 실행중인 컨테이너를 중지
시키고 싶을때 사용.
CLI, GUI 모두 컨테이너가 실행 된 모습을 확인 가능하다.
$ docker ps # 현재 실행중인 모든 컨테이너 확인
$ docker logs {ContainerName} # 해당 컨테이너 로그 확인
-f
: 로그를 실시간으로 확인--tail {Number}
: Number 만큼 로그 출력$ docker exec -it {ContainerName OR ID} {Command} # 실행중인 컨테이너 내부 명령어 실행
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]
show databases
: 접근하려는 DB가 존재하는지 확인 한다.docker exec -it {DataBaseName}{imageName} -u root -p
: 해당 컨테이너 MySQL 에 root 권한자로 접근 한다.GRANT ALL PRIVILEGES ON {DataBaseName}.* TO '{UserName}'@'%'
명령어를 통해 사용자에게 권한을 부여해준다모든 권한
을 부여FLUSH PRIVILEGES
: 권한을 갱신한다.GRANT ALL PRIVILEGES ON *.* TO '{UserName}'@'%';
모든 DataBase
에 모든 권한
을 부여.GRANT ALL PRIVILEGES ON {DataBaseName}.* TO '{UserName}'@'{IP NumBer}';
IP NumBer
의 IP 로만 접속이 가능하다.SHOW GRANTS FOR '{UserName}'@'{HostName}';
REVOKE ALL PRIVILEGES ON {DataBaseName}.* FROM '{UserName}'@'{HostName}';
Docker
및 Docker Desktop
설치Repository Clone
및 docker-compose.yml
파일 PullDocker Compose
로 MySQL 컨테이너 실행Spring Boot
의 application.properties
파일과 동일하게 DataBase 프로퍼티 설정.