Devops

Docker 시작하기 - 2 프로젝트 적용

maxwithjude 2025. 1. 19. 20:43

2025.01.07 - [Devops] - Docker 시작하기 - 1

 

Docker 시작하기 - 1

Docker 시작하기 시작하려면 일단 도커 데스크톱을 다운받아야한다.Why DOCKER?이식성때문이다. 애플리케이션 버전 차이로 인한 충돌이나 버그 등을 방지하여 내 컴퓨터에선 잘 되는데 서버에서는

maxwithjude.tistory.com

 

전 글에서 이어집니다

 

 

볼륨

Docker에서 권장하는 데이터 지속 관리 방법으로, Docker가 관리하는 디렉토리에 데이터를 저장한다. 볼륨은 컨테이너와 독립적으로 관리되므로, 컨테이너가 삭제되더라도 데이터는 유지된다.

 

docker volume create my-volume  
docker run --name my-container -v my-volume:/data -d nginx:latest  

docker run --rm -v my-volume:data bustbox ls /data

-- 첫째 줄부터
-- my-volume이라는 볼륨을 생성
-- my=volume 볼륨을 /data 디렉토리에 마운트하여 my-container 컨테이너를 실행
-- busybox 컨테이너를 실행하여 my-volume 볼륨의 내용을 확인한다. -rm 옵션은
-- 컨테이너가 종료될 때 자동으로 삭제되도록 한다.

 

바인드 마운트

호스트 시스템의 특정 디렉토리를 컨테이너에 마운트하는 방법이다. 개발 환경에서 소스 코드를 공유하거나 로그 파일을 관리하는데 유용하다. 

 

docker run --name my-container -v/host/data:/data -d nginx:latest

-- 호스트 시스템의 /host/data 디렉토리를 컨테이너의 /data 디렉토리에 마운트하여 my-container 컨테이너를 
-- 실행. 컨테이너 내부에서 /data 디렉토리에 저장된 데이터는 호스트 시스템의 /host/data 디렉토리에 저장된다.

 

tmpfs 마운트

tmpfs 마운트는 데이터를 호스트 시스템의 메모리에 저장한다. 임시 데이터를 저장하거나, 높은 I/O 성능이 필요한 경우 사용된다. 그러나 컨테이너가 중지되면 데이터가 사라져, 영구적 데이터 저장에는 적합하지 않다.

 

docker run --name my-container --tmpfs /data -d nginx:latest

-- 컨테이너의 /data 디렉토리를 tmpfs로 마운트하여 my-container 컨테이너를 실행한다. 이제 
-- /data 디렉토리에 저장된 데이터는 메모리에 저장되며, 컨테이너가 중지되면 사라진다.

 

데이터 백업과 복원

볼륨의 데이터 백업

docker run --rm -v my-volume:/data -v /backup:/backup busybox tar cvf /backup/backup.tar /data

-- 볼륨의 데이터를 백업

 


빠르게 프로젝트에 적용하기 위해

데이터 영속성과 명령어들에 대한 학습은 좋지만 프로젝트 기간은 시작되었으므로 실습을 하는게 구조에 대한 이해 속도가 더 빠를 것이라고 판단했다. 

 

준비되면 좋은 것: vscode에 yaml 이라는 extension을 깔면 yml 파일을 작성할 때 도움을 준다. (추천!)

추가로, yaml validator를 이용하면 유효성 검사도 하여 yml 양식 오류로 인한 미작동을 방지한다. 

 

 

docker-compose.yml 파일을 작성하고 docker-compose up -d 를 치면 

 

localhost:80으로 접속했을 때 아무것도 뜨지 않았다!

 

처음했을 때는 hello, docker compose가 나타나지 않았는데, docker-compose logs -f web 으로 실시간 로그 추적을 해보니 이런 로그가 떴다.

 

브라우저가 보통 즐겨찾기나 탭에 표시될 아이콘을 가져오려고 favicon.ico를 요청해서 발생한 문제이다. 이 요청이 처리되지 않으면 오류 로그만 남을 뿐이지만, 파일을 제공하면 로그가 깔끔해지고 브라우저도 더 만족스럽게 작동한다.

 

해결과정 : web폴더에 favicon.ico 폴더를 만들어주기만 했다.

 

docker-compose.yml 파일 상단의 version은 더 이상 권장되지 않으며, 무시된다.

 

해결 후 

 

잘 렌더 되는 것을 볼 수 있다!

중지는 docker-compose down 명령어로 실행되며, 네트워크와 볼륨을 포함한 모든 리소스를 정리한다.

 

근데 볼륨은 데이터 영속성을 지원하기 위해 나온 개념인데 정리하면 어떡하지?

docker-compose down은 명시적으로 설정된 볼륨은 제외하고 정리한다.

그럼, 명시적으로 선언한 db-data 경로가 아닌 것 볼륨은 docker-compose down 하면 삭제되는 것인가?

 

아니다, 정리하면, web: 안의 볼륨은 호스트의 파일을 이용한 바인드 마운트

 

 

바인드 마운트란?

  • 바인드 마운트는 호스트 시스템의 디렉터리나 파일을 컨테이너의 특정 경로에 연결하는 방식입니다.
  • 도커 볼륨(docker volume ls)에서 나타나지 않고, 호스트 파일 시스템의 데이터를 직접 사용합니다.
  • 예:여기서:
    • ./web: 호스트 머신(로컬)의 디렉토리
    • /usr/share/nginx/html: 컨테이너 내의 디렉토리
    컨테이너가 이 경로에 접근하면 로컬 파일이 사용됩니다.
  • yaml
    코드 복사
    volumes: - ./web:/usr/share/nginx/html

바인드 마운트와 볼륨의 차이점

특징바인드 마운트도커 볼륨 (명시적 또는 익명 볼륨)
데이터 저장 위치 호스트 파일 시스템의 지정된 경로 도커 관리 디렉토리 (/var/lib/docker/volumes/)
데이터 접근성 호스트와 컨테이너에서 동시에 접근 가능 컨테이너를 통해서만 접근 가능
컨테이너 삭제 시 데이터 데이터 유지 (호스트 디렉토리에 남아 있음) 익명 볼륨은 삭제, 명시적 볼륨은 유지
사용 용도 개발 중 파일 동기화가 필요할 때 데이터베이스나 영구 데이터 저장 시 사용

 

프로젝트 적용

원래 계획 : docker-compose파일을 쉽게 k8s 문서로 변환해주는 kompose 툴을 이용해 AWS ECR에 푸시하고, AWS EKS를 적용해보려 했으나 오버엔지니어링 문제와 비용문제로 적용하기에 타당하지 않다고 판단했다. 

 

가용한 자원 : 다니고 있는 부트캠프에서 1주일 후에 EC2 xlarge(lightsail) 인스턴스를 지원한다고 했다. lightsail 구글링해보니 쉽게 소규모의 프로젝트에 적용할 수 있는 컴퓨팅 자원이라고 한다. 단점으로는 수평적 확장 등 확장성이 부족한 점이 있다.

 

무엇을 적용할 수 있고 적용 불가능한지 (확장성 측면에서) 판단하는게 중요해보인다.

2025.01.19 기준 lightsail에서 지원하는 내역이다

고정ip 주소, 서버 모니터링 등을 제공한다고 써있는데, EC2 사용 시 고정 IP 만드는 수고 정도를 더는 장점으로 보인다.

 

 

부트캠프에서 지원하는 인스턴스가 월 80달러(4cpu, 16gb 메모리) 상당 컴퓨팅 서비스라 lightsail을 쓰는 것이 좋아보인다.

추가적으로, AWS CODEDEPLOY 등 서비스를 이용하지 못한다.