[Docker] 도커 볼륨

참고

  • 시작하세요! 도커/쿠버네티스: 친절한 설명으로 쉽게 이해하는 컨테이너 관리


소개

  • 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장해서 각 컨테이너의 정보를 보존합니다.
  • 이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일 시스템 등을 저장합니다.
  • 이미지에 mysel을 실행하는 데 필요한 애플리케이션 파일이 들어 있다면 컨테이너 계층에는 워드프레스에서 쓴 로그인 정보나 게시글 등과 같이 데이터베이스를 운용하면서 쌓이는 데이터가 저장됩니다.
  • 그러나 위의 내용에는 치명적인 단점이 있습니다.
  • mysql 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 데이터베이스의 정보도 삭제된다는 점입니다.
  • 도커의 컨테이너는 생성과 삭제가 매우 쉬우므로 실수로 컨테이너를 삭제하면 데이터를 복수 할 수 없습니다.
  • 이를 방지하기 위해 컨테이너의 데이터를 영속적 데이터로 활용할 수 있는 방법이 몇 가지 있습니다.
  • 그 중 가장 확실하고 쉬운 방법이 볼륨 을 활용하는 방법 입니다.


호스트 볼륨 공유하기

  • 도커 볼륨 첫 번째 학습으로, 호스트 볼륨 공유하는 방법에 대해서 실습해 보도록 하겠습니다.
  • 아래 명령어를 입력해 mysql 데이터베이스 컨테이너와 워드프레스 웹 서버 컨테이너를 생성합니다.
docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /home/wordpress_db:/var/lib/mysql mysql:5.7

8ac61576bb78a2ba2becaae57d2db3eee79b1eaf6c08f123381ee3ceaeeae4d7
docker run -d -e WORDPRESS_DB_PASSWORD=password --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress

ea124996d1c3ab77bf3f1056eaba8063e18323855be5574dc4265aa05d9a2c8a
  • 위에서 워드프레스 컨테이너에 -p 옵션으로 컨테이너의 80번 포트를 외부에 노출했습니다.
  • docker ps 명령어에서 확인한 wordpress_hostvolume 컨테이너의 호스트 포트로 워드프레스 컨테이너에 접속할 수 있습니다.
  • 위에서 핵심은 -v 옵션을 추가 했고, /home/wordpress_db:/var/lib/mysql 로 설정한 것입니다.
  • 이는 호스트의 /home/wordpress_db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 공유한다는 의미입니다.
  • 즉, [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리] 형태 입니다.

    컨테이너의 /var/lib/mysql 디렉터리는 MySql이 데이터베이스의 데이터를 저장하는 기본 디렉토리 입니다.
    미리 /home/wordpress_db 디렉터리를 호스트에 생성하지 않았어도 도커는 자동으로 이를 생성해 줍니다.

ls /home/wordpress_db


    디렉터리: C:\home\wordpress_db


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----      2021-11-04   오후 7:48                mysql
d-----      2021-11-04   오후 7:48                performance_schema
d-----      2021-11-04   오후 7:48                sys
d-----      2021-11-04   오후 7:48                wordpress
-a----      2021-11-04   오후 7:48             56 auto.cnf
-a----      2021-11-04   오후 7:48           1676 ca-key.pem
-a----      2021-11-04   오후 7:48           1112 ca.pem
-a----      2021-11-04   오후 7:48           1112 client-cert.pem
-a----      2021-11-04   오후 7:48           1676 client-key.pem
-a----      2021-11-04   오후 7:48       79691776 ibdata1
-a----      2021-11-04   오후 7:48       12582912 ibtmp1
-a----      2021-11-04   오후 7:48           1359 ib_buffer_pool
-a----      2021-11-04   오후 7:48       50331648 ib_logfile0
-a----      2021-11-04   오후 7:48       50331648 ib_logfile1
-a----      2021-11-04   오후 7:48           1676 private_key.pem
-a----      2021-11-04   오후 7:48            452 public_key.pem
-a----      2021-11-04   오후 7:48           1112 server-cert.pem
-a----      2021-11-04   오후 7:48           1676 server-key.pem

  • 위와 같이 mysql을 구동하는 데 필요한 각종 파일들이 공유 되었습니다.
  • mysql, performance_schema, sys, wordpress 디렉토리는 mysql에 존재하는 실제 데이터베이스에 대응됩니다.
  • 그럼 실제로 컨테이너를 삭제하여 데이터베이스의 데이터가 보존되는지 확인해 보도록 하겠습니다.
  • 아래와 같이 명령어를 입력하여 2개의 컨테이너를 삭제해 줍니다.
# docker stop wordpress_hostvolume wordpressdb_hostvolume

# docker rm wordpress_hostvolume wordpressdb_hostvolume
  • 다시 /home/wordpress_db 경로를 확인해 보고, mysql 컨테이너가 사용한 데이터가 그대로 남은것을 확인합니다.
 ls /home/wordpress_db


    디렉터리: C:\home\wordpress_db


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----      2021-11-04   오후 7:48                mysql
d-----      2021-11-04   오후 7:48                performance_schema
d-----      2021-11-04   오후 7:48                sys
d-----      2021-11-04   오후 7:48                wordpress
-a----      2021-11-04   오후 7:48             56 auto.cnf
-a----      2021-11-04   오후 7:48           1676 ca-key.pem
-a----      2021-11-04   오후 7:48           1112 ca.pem
-a----      2021-11-04   오후 7:48           1112 client-cert.pem
-a----      2021-11-04   오후 7:48           1676 client-key.pem
-a----      2021-11-04   오후 7:48       79691776 ibdata1
-a----      2021-11-04   오후 7:48       12582912 ibtmp1
-a----      2021-11-04   오후 7:48           1359 ib_buffer_pool
-a----      2021-11-04   오후 7:48       50331648 ib_logfile0
-a----      2021-11-04   오후 7:48       50331648 ib_logfile1
-a----      2021-11-04   오후 7:48           1676 private_key.pem
-a----      2021-11-04   오후 7:48            452 public_key.pem
-a----      2021-11-04   오후 7:48           1112 server-cert.pem
-a----      2021-11-04   오후 7:48           1676 server-key.pem
  • 확인 결과, 그대로 데이터가 유지된 것을 확인할 수 있습니다.
  • 참고로, /var/lib/mysql 디렉터리는 호스트의 /home/wordpress_db 디렉토리는 동기화 되는 것이 아니라 완전히 같은 디렉토리 입니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY