- 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
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 |