docker 데이터 활용 - bind mount(1)
docker를 사용하여 많은 서버를 운영하곤합니다.
docker를 사용하는 이유는 windows는 좀 아닐 수 있지만 host 환경에
크게 영향을 받지 않고 서버를 운영 배포할 수 있다는 장점 때문일 것입니다.
많은 기능을 사용해보지는 않았지만 docker를 사용하면서 현재까지 가장 큰 이슈는
docker container를 삭제하게 되면 docker 안에서 저장하고 있었던 data도 모두 손실되게 된다는 점입니다.
database나 상태를 가지고 있는 서버들은 부득이하게 서버를 재구동하거나 삭제를 하여도
기존의 data를 보존해야합니다.
container 영역의 data를 존하기 위해서는 세가지 방법이 존재합니다.
각각의 방법은 container의 데이터를 어디에 존재하는지 입니다.
1. bind mount : container의 데이터를 임의의 host 경로에 연결
2. volume : container의 데이터를 host에 /var/lib/volume이라는 특정 경로에 저장
3. tmpfs : host에 memory에 저장
이번 포스팅에서는 bind mount를 사용하여 container의 데이터를 host에 저장해볼 것입니다.
bind mount
1. bind mount 방식은 데이터가 host의 어디든 저장이 될 수 있다는 특징을 가지고 있습니다.
2. bind mount 방식은 host의 파일 또는 디렉터리를 container에 mount 시키는 방식입니다.
예제는 linux 18.04LTS 환경에서 진행됩니다.
기본적으로 사용하는 docker와 docker-compose 파일을 사용하는
두가지 방식으로 진행하겠습니다.
예제를 진행하기 전에 먼저 기본적으로 docker가 설치되어있어야 합니다.
docker 명령어 방식
docker 이미지 중 nodejs 이미지를 사용하겠습니다.
1. docker nodejs 이미지를 받아온다.
docker pull node:latest
2. docker nodejs를 사용하여 container를 생성한다.
docker run -d -it --name app-server node:latest
3. docker 이미지안에 들어가서 / 디렉터리 확인하기
$ docker exec -it app-server bash
root@88a858f7540b:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
docker 이미지 안에 들어가면 위와같은 폴더가 있습니다.
이제 host에 test용 디렉터리를 만들어서 container안에 넣어보겠습니다.
4. docker bind mount 사용하여 image안에 mount하기
# 도커 이미지 stop, rm
$ docker stop $(docker ps -qa) && docker rm $(docker ps -qa)
# host에서 /home/ubuntu/test 폴더를 만들고 test.txt 파일 만들기
$ cd $HOME
$ mkdir test
$ cd test
$ touch test
# docker bind mount를 사용하여 test 폴더 mount하여 container 시작
$ docker run -d -it --name app-server -v /home/ubuntu/test:/test node:latest
# docker container 안에서 test 폴더 확인
$ docker exec -it app-server bash
root@91ee18b1436b:/# ls
bin dev home lib64 mnt proc run srv test usr
boot etc lib media opt root sbin sys tmp var
root@91ee18b1436b:/# cd test
root@91ee18b1436b:/test# ls
test
host의 test 경로와 연결된 container 안의 test 경로는 연결이 되어있는 상태입니다.
다시말해 container 안에서 연결된 경로 이하로 변경사항이 발생하면 host 경로에도 적용이 되고
그 반대도 됩니다.
이번에는 docker-compose를 사용하여 bind mount를 해보겠습니다. 원리는 같습니다.
docker-compose 방식
1. docker-compose 파일 작성
# docker-compose.yaml 파일의 내용입니다.
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '3.4'
networks:
basic:
services:
mariadb:
container_name: mariadb
image: mariadb:latest
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_USER=test
- MYSQL_PASSWORD=1234
- TZ="Asia/Seoul"
ports:
- 3306:3306
networks:
- basic
2. docker-compose를 활용한 container 생성
docker-compose -f docker-compose.yaml up -d
3. docker container 안의 mount 된 경로 확인
$ docker exec -it mariadb bash
root@d1a84b4eb760:/# ls
bin docker-entrypoint-initdb.d home media proc sbin test var
boot docker-entrypoint.sh lib mnt root srv tmp
dev etc lib64 opt run sys usr
root@d1a84b4eb760:/# cd test
root@d1a84b4eb760:/test# ls
test
docker를 사용하다 보면 일반적으로 host os에서 사용하던 것과 헷갈리는 점이 많았습니다.
아직도 공부해야할 부분이 많아 하나씩 공부한 것을 정리해가는 과정입니다.
다음 포스팅에서는 host의 지정한 경로에 파일을 저장하는 것이 아닌
docker가 지정하는 경로에 저장하는 방식을 사용해보도록 하겠습니다.