개발 ON
  • [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` 명령어를 통해 삭제 가능하다.
    댓글