인프라

10. 도커 스토리지

오늘의 나1 2021. 4. 4. 21:38
출처: youtu.be/EWoOzcfpP-w

도커 컨테이너에 파일을 저장할 때의 문제점

  • 컨테이너가 죽으면 파일도 같이 사라짐
  • 컨테이너 안의 파일을 도커 밖에서 가져오기 힘듦
  • 컨테이너의 writable layer가 호스트 머신과 강하게 결합되어 있어서, 데이터를 옮기기 힘듦
  • 컨테이너의 writable layer에 쓰는 것은 스토리지 드라이버를 필요로 하는 데, 성능이 좋지 않음

 

  • => 데이터를 도커 컨테이너의 외부에서 관리하는 것이 좋음

호스트 머신에 파일 저장하는 방법

  • Volumes: 호스트 머신의 파일 시스템 중 도커에 의해 관리되는 영역에 저장
  • Bind mounts: 호스트 머신의 파일 시스템 아무곳에나 저장
  • 기타: tmpfs mounts, named pipe 등 

https://docs.docker.com/storage

 

Volumes

  • 도커에 의해 관리되는 호스트 컴퓨터의 파일 시스템에 저장
    • Linux에서는 /var/lib/docker/volumes
    • 도커가 아닌 프로세스는 이 파일을 수정하면 안 됨
    • 도커에서 데이터를 유지하는 가장 좋은 방법
  • 새로운 디렉토리가 호스트 컴퓨터의 도커 스토리지 영역에 생김
    • 도커는 해당 디렉토리의 컨텐츠를 관리
    • 이름이 있을 수도 있고, 없을 수도 있음
  • 볼륨의 특징
    • 하나의 볼륨은 여러 개의 컨테이너에 동시에 마운트될 수 있음
    • 볼륨을 사용하는 컨테이너가 없어도 볼륨은 여전히 도커에서 사용할 수 있고 자동으로 지워지지 않음
    • 볼륨 드라이버를 사용하여 리모트 호스트나 클라우드 프로바이더에 데이터를 저장할 수 있음
    • 커맨드를 통해 생성할 수도 있고, 컨테이너가 서비스를 생성할 때 도커가 생성하기도 함
  • 볼륨과 관련된 커맨드
    • docker volume create
    • docker volume prune

Bind Mounts

  • 호스트 컴퓨터의 어느 곳에나 저장할 수 있음
    • 중요한 시스템 파일이나 디렉토리인 경우 Bind Mounts 방식을 써야 하는 경우가 있음
    • 도커가 아닌 프로세스, 또는 도커 컨테이너가 언제든 수정할 수 있음
  • 호스트 컴퓨터의 파일이나 디렉터리가 컨테이너로 마운트됨
    • 도커 컴퓨터에 없으면 도커가 알아서 만들어줌
  • 도커 명령어를 사용할 수 없음
  • 볼륨에 비해 제한된 기능
    • 호스트 머신의 파일이나 디렉터리는 컨테이너로 마운트 됨
    • 파일이나 디렉터리는 절대 또는 상대 경로로 참조됨
  • 민감한 파일에 접근을 허용함
    • 컨테이너 안에서 실행되는 프로세스에서 호스트의 파일 시스템을 수정할 수 있음

참고

  • —mount 플래그 사용을 권장함

실습

Step1: 볼륨 생성

  • docker volume —help
  • docker volume create myvol-1: 볼륨 생성
  • docker volume ls: 볼륨 목록 조회

Step2: 볼륨 속성 보기

  • docker volume inspect myvol-1

Step3: Jenkins 설치

  • docker pull jekins/jenkins:2.138.4 

Step4: Jenkins를 Volume이랑 같이 실행하기

  • docker run -p 8080:8080 -p 50000:50000 -v myvol-1:/var/jenkins_home jenkins/jenkins:2.138.4

Step5~9: 설치 확인하기

  • localhost:8080으로 이동하여 설치 중에 나오는 어드민 비밀번호를 입력하여 suggested plugin 설치를 한다

Jenkins 비번: youjung-hong / jenkins

 

Step10: 젠킨스 업그레이드

  • docker run -p 8080:8080 -p 50000:50000 -v myvol-1:/var/jenkins_home jenkins/jenkins:2.277.1

Step11: 젠킨스 재실행 

  • localhost:8080으로 이동

Step12: Job 생성하고 실행하기

  • 빌드 명령어, 빌드 조건 등을 입력하여 CI/CD 할 수 있음

Step13: 또다른 젠킨스 실행하기

  • 똑같은 볼륨을 공유하는 다른 젠킨스를 띠운다.
  • docker run --name jenkins-production-copy -d -p 50001:50000 -p 8081:8080 -v myvol-1:/var/jenkins_home jenkins/jenkins:2.190.1

Step14: 볼륨 삭제

 

  • docker volume ls
  • docker volume rm {volume name}
  • docker volume prune

 

Step15: 도커 컴포즈 파일로 볼륨 관리하기

```yml

services:

  jenkins:

    image: jenkins/jenkins:2.277.1

    ports:

      - 8080:8080

      - 50000:50000

    volumes:

      - myvol-1:/var/jenkins_home

 

volumes:

  myvol-1: # [docker-compose.yml 있는 디렉터리]_myvol-1 이라는 볼륨이 생성됨

```

'인프라' 카테고리의 다른 글

카프카 클러스터 구성하기  (0) 2023.09.17
13. 도커 스웜-1  (0) 2021.04.19
11. Docker Compose  (0) 2021.04.03
10. 도커 이미지 빌드 & 푸시 실습  (0) 2021.03.30
8. 도커 이미지 배포  (0) 2021.03.30