ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] - 4.Volume&Bind Mount
    개발/Docker 2022. 7. 16. 16:16

     

    Docker Container는 어떻게 동작하며, 어떤 방식으로 저장할 수 있는지를 알아보려고 합니다.

     

    1. Docker Container 생명 주기


    아래 그림과 같이 생명 주기를 잘 표현해보인 그림이라 가져와보았습니다.

    결국 실행되어서 rm 명령어로 처리하지 않는 이상 Data가 존재합니다.

    그렇다면 Container가 삭제되거나 Docker가 종료되거나 다시 시작하게 된다면, 해당 Data들은 어디로 가게 될까요?

    -> Container와 사라지는 동시에 같이 사라집니다.

    그렇기 때문에 Local 환경에 Data를 적용시킬 수 있는 방법을 배우려고 합니다.

     

    2. Docker Stored Data


    Docker는 어떤 방식으로 Data를 저장할 수 있을까요?

    제가 알아본 바에 따르면 현재 2가지를 통해서 Data를 저장가능합니다.

    1. Volume

    2. Bind Mount

    2가지 방법이 매우 유사하지만, 조금씩 차이가 있어 설명해보겠습니다.

    2-1) Docker Volume


    Volume은 Docker에서 권장하는 방식입니다.

    Volume을 먼저 생성하여 보겠습니다.

    $ docker volume create test
    test

    아래 Command를 통해 확인이 가능합니다.

    $ docker volume ls
    DRIVER    VOLUME NAME
    local     test

    상세한 정보를 확인하기 위한 Command입니다.

    Mountpoint를 보시면 됩니다.

    $ docker inspect test
    [
        {
            "CreatedAt": "2022-07-18T05:14:43Z",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/test/_data",
            "Name": "test",
            "Options": {},
            "Scope": "local"
        }
    ]

    Container가 Volume을 사용하기 위해서는 -v 옵션을 통해서 설정을 해주어야 합니다.

    volume_name:/container_path 로 구별이 됩니다.

    임시로 Container를 Mount 시킨 뒤 test.txt라는 File을 생성해보겠습니다.

    $ docker run -v test:/temp --name one busybox touch /temp/test.txt

     

    해당 Volume을 찾아보려고 하였으나, 검색되는 /var/lib/docker 로 시작되는 폴더가 존재하지 않아 애를 먹었습니다.

    검색을 하여 찾고 찾아보니 docker version에 따라 저장되는 위치가 바뀌었다고 합니다.

    결론 \\wsl$\docker-desktop-data\data\docker = /var/lib/docker 와 동일합니다.

    docker도 각각의 Container로 나누어서 저장된다고 합니다.

    • For Docker Engine v20.10.16: \\wsl$\docker-desktop-data\data\docker\volumes
    • For Docker Engine v19.03: \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

    저는 Docker version 20.10.17임으로 \\wsl$\docker-desktop-data\data\docker\volumes 에서 찾을 수 있었습니다.

    # https://stackoverflow.com/questions/61083772/where-are-docker-volumes-located-when-running-wsl-using-docker-desktop
    Docker Desktop's WSL2 feature creates two new wsl2 containers docker-desktop and docker-desktop-data, which can be seen by the command wsl -l -v
    
    NAME                   STATE           VERSION
    * Ubuntu-18.04           Running         2
      docker-desktop         Running         2
      docker-desktop-data    Running         2
    #wsl2 volume 경로
    \\wsl$\docker-desktop-data\data\docker\volumes
    
    #Reference
    #https://stackoverflow.com/questions/43181654/locating-data-volumes-in-docker-desktop-windows
    
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "test",
                    "Source": "/var/lib/docker/volumes/test/_data",
                    "Destination": "/temp",
                    "Driver": "local",
                    "Mode": "z",
                    "RW": true,
                    "Propagation": ""
                }
            ]

     

    다음에 하나의 Volume에는 여러 Container가 접속이 가능함으로 다른 Container로 해당 경로를 접근해보았습니다.

    $ docker run -v test:/app --name two busybox ls /app
    test.txt

    Volume 삭제 

    주의점 : 해당 Volume을 사용하고 있는 Container가 존재한다면 Volume을 삭제 할 수 없다.

    # if you this error
    $ docker volume rm test
    Error response from daemon: remove test: volume is in use - [container_id]
    
    # right access
    $ docker rm -f one two
    $ docker volume rm test

    Volume 전체 삭제

    $ docker volume prune
    WARNING! This will remove all local volumes not used by at least one container.
    Are you sure you want to continue? [y/N] y

     

    2-2) Docker Bind Mount

    이어서 Volume을 사용하지 않고 Host의 File system을 Container에 직접 Mount 할 수 있습니다.

    아래 Command를 통해 Container app/에 test.txt와 Local PC에도 test.txt가 있는것을 확인 할 수 있습니다.

    $ touch test.txt
    $ docker run -v `pwd`:/app -it --name test_container busybox /bin/sh
    test.txt

     

    Bind Mount와 Volume은 비슷하게 보이지만 큰 차이점은 Volume을 설정하여 Mount Point를 관리해주는지 여부입니다.

    그렇게 때문에 일반적인 상황이라면, Volume을 사용하여 구축 해야합니다.

    Bind Mount는 Local에서 개발 시에 git clone으로 코드를 받아와 수정 후에 특정 경로에 반영 시에 주로 사용한다고 합니다.

    '개발 > Docker' 카테고리의 다른 글

    [Docker] - 3. Docker Command 정리  (0) 2022.08.24
    [Docker] - Docker-compose  (0) 2022.08.03
    [Docker] - Docker 기본 개념  (0) 2022.07.21
    [Docker] 2. Docker 설치 & Docker-compose  (0) 2022.07.03
    [Docker] - 1. WSL 기본 설치  (0) 2022.07.03

    댓글

Designed by Tistory.