[Docker] Container storage 영구보존하기

제이브로·2024년 2월 22일
0

Docker

목록 보기
34/48
post-thumbnail

1. Docker container storage

Docker containerHost PCvolume에 지정하여, container가 삭제되더라도 영구 보존하는 방법이다.

  • 도커 컨테이너를 실행하다보면, 컨테이너를 실수로 지우거나 삭제되는 경우, 작성한 데이터를 잃을 수 있으므로, 컨테이너 외부volume을 지정하여 저장하는 방법이다.

Storage

  • -v {host path}:{container mount path}
  • 컨테이너 이미지는 readonly 이며, 컨테이너 실행시, 컨테이너는 readwrite 레이어가 추가된다
  • Union file system 혹은 overlay로 마치 하나의 시스템으로 보여지는 시스템

2. Example 1 : MySQL

MySQL 컨테이너를 생성하고, 데이터컨테이너 외부Host에 저장해보겠습니다.

  • MySQL container 동작시 환경변수로 필수적으로 비밀번호 설정을 해주어합니다.
  • -e MYSQL_ROOT_PASSWORD=pass : 환경변수 비밀번호 pass 설정

2.1 컨테이너 생성

  • -v /dbdata:/var/lib/mysql : {Host} PC의 /dbdatacontainer/var/lib/mysql에 연결
$ docker run -d -v /dbdata:/var/lib/mysql --name db -e MYSQL_ROOT_PASSWORD=pass mysql:latest
  • -v /dbdata에서 dbdata폴더가 없으면 자동생성되며, dbdata 폴더가 있을시 마운트 된다.

2.2 컨테이너 접속

MySQL 컨테이너에 접속

  • MySQL 컨테이너에서는 /var/lib/mysql/dbdata에 저장된다.
$ docker exec -it db /bin/bash

2.3 MySQL 접속

  • MySQLroot 계정의 비밀번호 passdb 접속 ( mysqld 데몬에 접속)
  • $ mysql -u root -ppass
// 현재 MySQL 컨테이너 안
$ mysql -u root -ppass

2.4 Database 확인

  • show databases : database 확인
// 현재 MySQL db 안
mysql> show databases

show database

2.5 Database table 생성

예시로 테이블을 생성해서, 컨테이너가 삭제되어도 테이블 데이터가 Host에 저장되어 있는지 확인해보자

// 현재 MySQL db 안
mysql> create database ttabae
mysql> show database
mysql> exit

show database2

2.6 Host에 데이터 확인

컨테이너 데이터가 Host에도 있는지 확인

  • 설정한 Host 저장경로 : /dbdata/
$ cd /dbdata/
$ ls

dbdata

2.7 컨테이너 삭제

컨테이너를 삭제한 후, Host에 데이터(ttabae)가 있는지 확인하자

$ docker rm -f db

docker rm -f db

  • 데이터가 그대로 보존되어 있다.

2.8 -v의 host경로 생략

-v에서 {host경로}를 생략할 경우, Host/var/lib/docker/volumes/{uuid}/_data에 저장된다.

volume uuid

2.9 Docker가 관리하는 volume

  • docker volume ls로 도커가 관리하는 볼륨을 확인
  • docker rm {volume ID} : 해당 볼륨 삭제

3. Volume 마운트 확인

docker inspect mysql을 통해서 마운트된 경로 확인

$ docker inspect mysql

"Mounts": [
    {
        "Type": "volume",
        "Name": "{name}",
        "Source": "/var/lib/docker/volumes/{id}/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }

4. Example 2 : 웹데이터 컨테이너 지원

Host에 있는 데이터를 컨테이너를 통해 유저가 서비스 지원 받는 구조

  • 컨테이너 데이터는 readonly

webdata

$ docker run -d --name web -p 80:80 -v /webdata:/usr/share/nginx/html:ro nginx:1.14
  • -p 80:80 포트 설정
  • -v /webdata:/usr/share/nginx/html:ro 호스트의 /webdata
  • nginx컨테이너/usr/share/nginx/htmlreadonly(ro) 설정

5. Example 3 :디스크 모니터링

디스크 사용량을 모니터링 결과를 10초마다 한번씩 웹에 보여주는 컨테이너

  • 컨테이너끼리 데이터 공유하여 결과 보여줌
  • df -h : 디스크 사용량을 모니터링 할때 사용

5.1 Shell 스크립트

10초마다 df -h 결과를 index.html로 만들어준다.

#!/bin/bash
mkdir -p /webdata
while true
do
  df -h > /webdata/index.html
  sleep 10
done

5.2 이미지 빌드

dockerfile 작성 후 이미지 빌드

  • dockerfile
FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]
  • 이미지 build
$ docker build -t jbro321/df:latest .

5.3 두 컨테이너 생성하여 데이터 공유

2개의 컨테이너를 생성하여 동일한 디렉토리의 데이터를 공유
1. -v /webdata:/webdata로 볼륨 지정하여 docker run하여 컨테이너 생성
2. nginx 컨테이너 생성하여 volume 지정

    1. webdata 컨테이너
$ docker run -d -v /webdata:/webdata --name df jbro321/df:latest
    1. nginx 컨테이너
$ docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:1.14
  • readonly 설정

webdata

6. References

  1. ttabae youtube
profile
기록하지 않으면 기록되지 않는다.

0개의 댓글