Docker

Docker volume

끈끈 2023. 6. 1. 01:02

 

  • docker 컨테이너는 컨테이너가 종료될 때 변경된 데이터는 모두 초기화 됨
  • volume 옵션을 사용해 데이터를 보존시키는 방법을 알아보자

 

volume을 사용하지 않으면?

 

  • docker container 내부로 접근해서 테스트용으로 띄운 컨테이너에 접속했을 때 보여지는 문구를 변경해보기

 

컨테이너 접속

 

sudo docker exec -it example /bin/bash
>> docker container에 접속할 때 container id 대신 container name을 사용할 수도 있다

echo "test" /usr/local/apache2/htdocs/index.html

 

 

 

 

exit 명령어로 컨테이너에서 나간 후

$ sudo docker compose down

$ sudo docker compose up -d

컨테이너를 재시작 시키면, 조금 전 추가한 test라는 문구가 사라진 것을 확인 가능

 

 

 

 


 

volume이 해주는 역할

 

  • 컨테이너에 저장되는 데이터의 일부를 host와 공유해 주는 역할
  • 사용자가 직접 삭제하지 않는 이상 계속해서 유지되며 컨테이너가 종료된다 하더라도 데이터는 유실되지 않음

 

docker volume 종류

 

 

docker volume

  • docker 엔진이 관리하는 volume을 생성하는 방식
  • docker volume 방식을 사용해 생성된 volume은 host의 /var/lib/docker/volumes/ 경로에 저장
  • docker에서 가장 권장하는 방식

bind mount

  • docker volume 방식과 매우 유사함
  • docker container를 생성할 때 사용자가 지정한 경로에 데이터가 저장
  • docker 엔진의 관리를 받지 않는 영역이기 때문에 사용자가 직접 파일을 추가/수정/삭제 할 수 있다

tmpfs mount

  • 기존의 방식들이 ssd 혹은 hdd와 같은 저장장치에 데이터를 저장한다면, tmpfs mount 방식은 휘발성 메모리인 RAM에 데이터를 저장
  • 파일로 저장하면 안 되는 민감한 정보를 다룰 때 사용

언제 어떤 방식의 volume을 사용해야 할까?

  • docker volume은 주로 컨테이너간 파일을 공유하거나 중요도가 높은 파일들을 사용자가 쉽게 수정/삭제 하지 못하도록 할 때 주로 사용
  • bind mount는 설정파일 혹은 소스코드를 프로젝트와 서버가 공유할 때 주로 사용
  • tmpfs mount는 많은 양의 데이터를 임시로 저장할 때, 혹은 보안적으로 중요한 데이터를 저장할 때 주로 사용

 

https://docs.docker.com/storage/#good-use-cases-for-volumes

 

Manage data in Docker

 

docs.docker.com

 


 

docker-compose.yml (bind mount)

 

version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

services:
  example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
    container_name: example # 컨테이너 이름을 지정합니다.
    image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
    ports: # 포트포워딩을 설정해줍니다.
      - 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
    volumes: # volume을 성정해줍니다.
      - ./example_http_code/:/usr/local/apache2/htdocs/ # 정의한 volume의 mount할 경로를 지정합니다.
    restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.

 

 

 

docker-compose.yml (docker volume)

 

version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.

volumes:
  example_http_code: {} # docker volume을 정의합니다.

services:
  example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
    container_name: example # 컨테이너 이름을 지정합니다.
    image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
    ports: # 포트포워딩을 설정해줍니다.
      - 80:80 # 외부에서 80 포트로 접속했을 때 컨테이너의 80 포트로 연결해줍니다.
    volumes: # volume을 성정해줍니다.
      - example_http_code:/usr/local/apache2/htdocs/ # 정의한 volume의 mount할 경로를 지정합니다.
    restart: always # 컨테이너가 종료됐을 때 다시 실행시켜 줍니다.

 

 


 

volume 설정 확인하기

 

sudo docker volume ls : volume 목록 보기

sudo docker volume inspect {volume_name} : volume의 이름으로 설정 정보 확인하기

sudo docker volume prune : 사용하지 않는 docker volume 삭제하기

 

 

 

'Docker' 카테고리의 다른 글

Docker entrypoint  (1) 2023.06.01
Dockerfile 이미지 빌드하기  (2) 2023.06.01
Docker compose, port forwarding  (2) 2023.05.31
Docker 설치 및 docker container  (2) 2023.05.31
Linux Ubuntu 환경 구성하기  (1) 2023.05.31