- [Network | Docker] 볼륨2024년 07월 02일 23시 53분 14초에 업로드 된 글입니다.작성자: 이주여이
0. 볼륨이란?
- 컨테이너의 데이터를 영속적으로 활용할 수 있는 방법으로 방식에는 호스트 볼륨 공유, 볼륨 컨테이너, 도커 볼륨 방식 총 3가지가 있다.
- 컨테이너는 생성 & 삭제가 간편하므로 데이터 보존에 있어 위험에 노출되어 있다. 볼륨은 컨테이너를 삭제하더라도 해당 컨테이너에서 만들어진 파일들을 특정 호스트 디렉토리 혹은 볼륨에 저장시킬 수 있기 때문에 많이 사용된다.
- 컨테이너가 아닌 외부에 데이터를 저장시키기 때문에
스테이트리스(stateless)
하다. - 스테이트리스한 컨테이너 설계는 도커를 사용할 때 매우 바람직한 설계 방법 …
1. 호스트 볼륨 공유 방식
# mysql 컨테이너 생성 > docker run -d \ # 백그라운드 실행(detached) > -e MYSQL_ROOT_PASSWORD=${password } \ > -e MYSQL_DATABASE=wordpress \ # DB 생성 **> -v /home/wordpress_db:/var/lib/mysql \ # 볼륨 설정(아래 설명 참고)** > --name wordpressdb_volume \ # 컨테이너 이름 지정 > mysql:5.7 # 이미지 설정 # wordpress 컨테이너 생성 > docker run -d \ > -e WORDPRESS_DB_HOST=mysql \ # 데이터베이스 연결 시 link에 참조된 이름과 일치해야 함 > -e WORDPRESS_DB_USER=root \ > -e WORDPRESS_DB_PASSWORD=${password} \ > --name wordpress_volume \ **> --link wordpressdb_volume:mysql \ # 링크 설정(아래 설명 참고)** > -p 80 \ # 80 포트와 연결 > wordpress [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2820c729f256 wordpress "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:32781->80/tcp, :::32781->80/tcp wordpress_volume 34dd147e9e76 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp wordpressdb_volume f0aea5c53e3a mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 3306/tcp, 33060/tcp mysql 3d3ebab72926 rockylinux/rockylinux "/usr/sbin/init" 10 hours ago Up 2 hours 0.0.0.0:8081->80/tcp, :::8081->80/tcp rockylinux
- -v /home/wordpress_db:/var/lib/mysql
- -v 라는 명령어를 통해 호스트의 디렉토리와 컨테이너 내 디렉토리를 공유한다.
- -v
/home/mysql
:/var/lib/mysql
- -v
${호스트의 공유 디렉토리 }
:${컨테이너의 공유 디렉토리 }
- 💡 /var/lib/mysql 디렉터리는 MYSQL이 데이터베이스 데이터를 저장하는 기본 디렉터리이다.
- --link wordpressdb_volume:mysql
- 🌟 위에서 만든 mysql 컨테이너를 현재 생성 중인 컨테이너 내에서 mysql이라는 별칭으로 지정한다. wordpress라는 name을 가진 컨테이너는 --link 옵션의 사용으로 wordpressdb_volume의 ip를 알고있지 않아도 mysql이라는 별칭으로 지정해 사용 가능한 것이다. 해당 별칭은 `-e WORDPRESS_DB_HOST` 에서 사용되었다.
1-2. 컨테이너 삭제 후 데이터 보존 확인
[root@localhost ~]# cd /home [root@localhost home]# ls user wordpress_db [root@localhost home]# cd wordpress_db/ [root@localhost wordpress_db]# ls auto.cnf client-key.pem ibdata1 performance_schema server-key.pem ca-key.pem ib_buffer_pool ibtmp1 private_key.pem sys ca.pem ib_logfile0 mysql public_key.pem wordpress client-cert.pem ib_logfile1 mysql.sock server-cert.pem [root@localhost wordpress_db]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2820c729f256 wordpress "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:32781->80/tcp, :::32781->80/tcp wordpress_volume 34dd147e9e76 mysql:5.7 "docker-entrypoint.s…" 3 hours ago Up 3 hours 3306/tcp, 33060/tcp wordpressdb_volume f0aea5c53e3a mysql:5.7 "docker-entrypoint.s…" 4 hours ago Up 4 hours 3306/tcp, 33060/tcp mysql 3d3ebab72926 rockylinux/rockylinux "/usr/sbin/init" 13 hours ago Up 5 hours 0.0.0.0:8081->80/tcp, :::8081->80/tcp rockylinux [root@localhost wordpress_db]# docker stop 34dd 34dd [root@localhost wordpress_db]# docker rm 34dd 34dd [root@localhost wordpress_db]# ls auto.cnf client-key.pem ibdata1 private_key.pem sys ca-key.pem ib_buffer_pool mysql public_key.pem wordpress ca.pem ib_logfile0 mysql.sock server-cert.pem client-cert.pem ib_logfile1 performance_schema server-key.pem
wordpressdb_volume 컨테이너를 삭제해도 mysql 컨테이너가 사용한 데이터가 그대로 남아있는 것을 확인할 수 있다.
2. 도커 볼륨 방식
- 도커 자체에서 제공하는 볼륨 기능으로 볼륨 생성 시 플러그인을 통해 여러 종류의 스토리지 백엔드를 사용할 수 있다.
- 볼륨을 다루는 명령어는
docker volume
으로 시작하며docker volume create
명령어로 볼륨을 생성한다.
> docker volume create \ > --name myvolume myvolume > docker volume ls DRIVER VOLUME NAME local myvolume
볼륨 생성 시 플러그인을 통해 여러 종류의 스토리지 백엔드를 사용할 수 있다.
해당 예제에서는 기본적으로 제공되는 드라이버인 local을 사용하며 해당 볼륨은 로컬 호스트에 저장되고 도커 엔진에 의해 생성 & 삭제된다.
[root@localhost ~]# docker run -it \ > --name myvolume1 \ # myvolume(위에서 만든 도커 볼륨):/root(컨테이너 내 공유 디렉터리 지정) > -v myvolume:/root/ \ > rockylinux/rockylinux # 이미지 # echo - 인자로 받은 문자열을 출력 # >> - 출력 리다이렉션 연산자로 파일 생성 / 수정 시 파일이 이미 존재한다면 해당 파일의 끝에 내용을 추가한다. [root@320480a4fbe0 /]# echo hello world! >> /root/volume [root@320480a4fbe0 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@320480a4fbe0 /]# cd root [root@320480a4fbe0 ~]# ls anaconda-ks.cfg anaconda-post.log original-ks.cfg volume [root@320480a4fbe0 ~]# cat volume hello world!
호스트 볼륨 방식과는 다르게 도커 볼륨 방식은 아래와 같이 입력한다.
호스트 볼륨 공유 방식: -v
${호스트의 공유 디렉토리 }
:${컨테이너의 공유 디렉토리 }
도커 볼륨 방식: -v
${볼륨 이름 }
:${컨테이너의 공유 디렉토리 }
도커 볼륨 방식은 볼륨을 컨테이너의 공유 디렉토리에 마운트한다. 따라서 myvolume1 컨테이너 내부의 /root 경로에 파일을 생성하면 생성된 파일은 myvolume 볼륨에 저장되는 것이다.
만약 같은 볼륨 컨테이너를 가진 컨테이너를 생성하면 파일이 어떻게 들어있을까?
[root@localhost ~]# docker run -it \ > --name myvolume2 \ > -v myvolume:/root/ \ > rockylinux/rockylinux [root@2a9c1a285496 /]# ls root anaconda-ks.cfg anaconda-post.log original-ks.cfg volume [root@2a9c1a285496 /]# cat root/volume hello world!
생성된 컨테이너의 root 경로에 들어가면 myvolume1에서 생성했던 volume 텍스트 파일이 그대로 존재한다. 도커 볼륨은 여러 개의 컨테이너에 의해 공유할 수 있다는 것을 알 수 있다.
볼륨은 디렉터리 하나에 상응하는 단위로써 도커 엔진에서 관리한다. 도커 볼륨도 호스트 볼륨 공유와 마찬가지로 호스트에 저장함으로써 데이터를 보존하지만 파일이 실제로 어디에 저장되는지 사용자는 알 필요가 없다.
만약 알고 싶다면 아래와 같이
docker inspect
명령어를 사용해 알 수 있다.[root@localhost ~]# docker inspect --type volume myvolume [ { "CreatedAt": "2024-07-01T08:05:31+09:00", "Driver": "local", # 볼륨이 사용하는 드라이버 "Labels": null, # 볼륨 구분 라벨 "Mountpoint": "/var/lib/docker/volumes/myvolume/_data", # 실제 호스트 저장 경로 "Name": "myvolume", # 볼륨 이름 "Options": null, "Scope": "local" } ]
✅ 도커 볼륨을 사용 중인 컨테이너를 삭제할 경우 볼륨은 삭제되지 않는다. 필요없는 볼륨들을 한꺼번에 지울 때는 `docker volume prune` 명령어를 통해 삭제 가능하다.
'Network > Docker' 카테고리의 다른 글
[Network | Docker] 네트워크 (0) 2024.07.03 [Network | Docker] 데이터베이스 외부 원격 접속 (0) 2024.07.03 [Network | Docker] 컨테이너 애플리케이션 구축 (0) 2024.06.30 [Network | Docker] 컨테이너 외부 노출 (0) 2024.06.30 [Network | Docker] 설치 및 컨테이너 생성 (0) 2024.06.30 다음글이 없습니다.이전글이 없습니다.댓글