블로그로 돌아가기

Docker 컨테이너 간 데이터 공유

Docker 컨테이너 간 데이터 공유

소개

Docker는 소프트웨어가 물리적 호스트 머신에서 실행되는 다른 소프트웨어와 격리되어 실행될 수 있도록 하는 가볍고 가상화된 이식 가능한 소프트웨어 정의 표준화 환경인 컨테이너 플랫폼입니다. Docker는 소프트웨어 개발의 지속적 개발 및 통합(CI/CD) 측면을 정의하는 핵심 구성 요소입니다. 일관된 런타임 환경을 제공함으로써 Docker는 소프트웨어가 배포되는 물리적 호스트 머신에 관계없이 동일하게 작동하도록 보장합니다. 철저한 Docker 생태계에 대한 개요는 이 기사를 확인해 보세요..

Docker 컨테이너는 자체적으로 완비되어 있지만, 때로는 데이터를 공유하거나 컨테이너가 중지된 후에도 데이터를 디스크에 유지해야 할 필요가 있습니다. 데이터는 데이터베이스, 로그 파일 또는 사용자 생성 데이터의 형태일 수 있습니다. 이러한 데이터는 Docker 이미지 설정 파일에 포함할 수 없지만, 애플리케이션이 예상대로 실행되려면 사용할 수 있어야 합니다. Docker 컨테이너에서 데이터를 공유하고 유지하는 작업은 Docker Volumes는 컨테이너 생성 중에 생성하거나 나중에 생성하여 컨테이너에 연결할 수 있습니다. 이 튜토리얼에서는 컨테이너 간에 데이터를 공유하는 네 가지 방법에 대해 설명합니다.

사전 요구 사항

Ubuntu 20.04를 기준으로 작업하고 있지만, Docker에 대한 지침과 명령은 위의 사전 요구 사항에서 설명한 대로 Docker가 설치되어 있고 sudo 사용자가 docker 그룹에 추가된 다른 모든 운영 체제에서도 작동합니다.

1단계: 독립적인 Docker 볼륨 생성

어떤 Docker 컨테이너와도 관련이 없는 독립적인 볼륨을 생성하는 것부터 시작하겠습니다. 이를 위해 Docker 1.9 버전에 도입된 docker volume create 명령이 있습니다. 다음 명령을 입력하여 이름이 Step1DataVolume :

볼륨 생성이 성공했음을 나타내는 다음과 같은 출력이 표시되어야 합니다:

Docker Volume Create

이제 독립적인 볼륨이 생겼으므로, 이를 사용하기 위해 공식 Ubuntu 이미지에서 새 컨테이너를 생성하는 예시를 진행해 보겠습니다. 컨테이너를 생성하고 볼륨을 연결하려면 다음 명령을 입력하세요:

이 명령에서 --rm 플래그는 종료 후 컨테이너를 자동으로 삭제합니다. -v 플래그는 볼륨을 지정하고 마운트하는 데 사용됩니다. -v 플래그는 볼륨 이름, 콜론(:), 그리고 볼륨이 나타나야 하는 컨테이너 내부의 절대 경로를 인자로 받습니다. 명령이 실행될 때 경로에 지정된 디렉토리가 존재하지 않으면 새로 생성된다는 점을 기억하세요. 이미 존재하는 경우 마운트된 볼륨이 기존 콘텐츠를 숨깁니다. -ti 플래그의 경우, -t는 터미널에 대한 액세스 권한을 부여하고, -i는 터미널을 통해 컨테이너와 상호 작용할 수 있도록 합니다.

컨테이너 내부에서 다음 명령을 실행하여 볼륨에 일부 데이터를 작성합니다:

Type exit을 입력하고 enter를 눌러 컨테이너를 종료합니다. 설명한 대로, --rm 플래그 덕분에 종료 시 컨테이너는 자동으로 삭제되지만 볼륨은 여전히 액세스할 수 있습니다.

볼륨이 여전히 존재하는지 확인하려면 docker volume inspect 명령을 사용할 수 있습니다:

다음과 같은 출력이 표시되어야 합니다:

Docker Volume Inspect

다음으로 새 컨테이너를 생성해 보겠습니다. 먼저 볼륨을 연결하고 이전 컨테이너에서 생성한 텍스트에 액세스할 수 있는지 확인합니다. 다음을 사용하여 컨테이너를 생성하고 실행하려면 다음 명령을 입력하세요: ubuntu 이미지:

컨테이너 내부에서 다음 명령을 실행하여 StepOne.txt 파일이 존재하는지 확인합니다:

다음과 유사한 출력이 표시되어야 합니다:

Docker Volume Content 1

다음으로, exit를 입력하고 enter를 눌러 컨테이너를 종료합니다. 이 단계에서는 독립적인 Docker 볼륨을 사용하여 데이터 지속성을 처리하는 방법과 볼륨을 컨테이너에 연결하는 방법을 배웠습니다.

2단계: 컨테이너를 삭제할 때 데이터를 유지하는 Docker 볼륨 생성하기

이 단계에서는 단일 명령을 사용하여 컨테이너를 생성하는 동시에 볼륨을 생성합니다. 그런 다음 컨테이너를 삭제하고 볼륨을 새 컨테이너에 연결합니다. 이 명령은 다음에서 사용된 것과 유사합니다: 1단계, 하지만 플래그 하나를 추가합니다 --name, 컨테이너의 이름을 지정하기 위해:

컨테이너 내부에서 다음 명령을 입력하여 볼륨에 데이터를 쓰고 데이터가 있는지 확인합니다:

다음은 세 가지 명령의 출력입니다:

Persistent Docker Volume

다음으로 컨테이너를 종료합니다. 다음 명령을 사용하여 컨테이너를 다시 시작하면 볼륨이 자동으로 연결됩니다:

컨테이너 내부에서 StepTwo.txt 파일이 존재하는지 확인하여 볼륨이 마운트되었는지 검증합니다:

출력 결과는 다음과 같습니다:

Docker Volume After Restart

이제 컨테이너를 종료해도 됩니다. Docker는 다른 컨테이너가 참조하고 있는 볼륨의 삭제를 방지합니다. 다음 명령을 사용하여 볼륨 삭제를 시도해 볼 수 있습니다:

출력에 다음과 같은 오류 메시지가 표시되어야 합니다:

Error Response

출력에 표시된 컨테이너 ID를 사용하여 docker rm 명령으로 컨테이너를 삭제해 보겠습니다:

강조 표시된 컨테이너 ID를 터미널에 표시된 ID로 바꾸십시오. 이 명령은 컨테이너를 삭제하지만, 우리가 생성한 볼륨은 삭제하지 않습니다. 사용할 수 있는 볼륨 목록을 확인하려면 docker volume ls 명령을 사용하여 확인할 수 있습니다:

출력 결과는 다음과 같습니다:

Docker Volume List

다음에서 생성된 컨테이너를 삭제하려면 2단계, 다음 명령을 입력하십시오:

이 단계에서는 컨테이너를 생성하는 동시에 Docker 볼륨을 생성할 수 있었습니다. 이제 데이터가 있는 기존 디렉터리에서 볼륨을 생성하는 방법을 알아보겠습니다.

3단계: 데이터가 있는 기존 디렉터리에서 Docker 볼륨 생성하기

볼륨에 데이터를 복사하려면 컨테이너를 생성하는 동안 볼륨을 생성하고 베이스 이미지의 데이터가 포함된 디렉터리 경로를 제공하면 됩니다. 아래 명령에서는 컨테이너를 생성하고 베이스 이미지의 데이터가 포함된 디렉터리인 /var에 데이터 볼륨을 추가합니다:

명령이 실행되면 베이스 이미지의 /var 디렉터리의 콘텐츠가 볼륨으로 복사됩니다. 이 볼륨은 새 컨테이너에 연결할 수 있습니다. 다음으로 컨테이너를 종료합니다:

Create Docker Volume

컨테이너를 생성하고 볼륨을 연결한 후, ls 명령을 사용하여 볼륨의 콘텐츠 목록을 확인하려면 다음 명령을 입력하십시오:

명령에서 다음과 유사한 출력이 표시되어야 하며, 이는 베이스 이미지의 /var 디렉터리 콘텐츠의 복사본이 이제 다음에서 사용 가능함을 보여줍니다: Step3DataVolume:

Copy Docker Volume

이 예제에서처럼 /var 디렉터리를 마운트하는 것은 비실용적일 수 있지만, 커스텀 이미지에 생성된 모든 디렉터리를 Docker 볼륨에 마운트하여 다른 컨테이너에서 데이터를 사용할 수 있도록 할 수 있음을 이해하는 데 도움이 됩니다.

4단계: 여러 Docker 컨테이너 간에 데이터 공유하기

대부분의 경우 여러 컨테이너가 하나의 Docker 볼륨에서 데이터에 액세스하도록 하려고 할 것입니다. 이전 예제에서는 하나의 컨테이너에만 볼륨을 연결했습니다. 이제 볼륨을 여러 컨테이너에 연결하는 방법을 배우게 됩니다. 이를 쉽게 수행할 수 있지만, Docker는 파일 잠금을 처리하지 않습니다. 동일한 볼륨에 쓰는 여러 컨테이너의 경우, 데이터 손상을 방지하기 위해 공유 데이터 저장소에 대한 쓰기를 처리하도록 해당 컨테이너에서 실행되는 애플리케이션을 개별적으로 설계해야 합니다.

  • 생성: Step4Container1Step4DataVolume

이름이 지정된 컨테이너를 생성하려면 docker run 명령어를 --name 플래그와 함께 사용하십시오:

컨테이너 내부에서 다음 명령어를 실행하여 텍스트 파일을 생성하고 텍스트를 추가합니다:

그 후 컨테이너를 종료하고 호스트 환경으로 돌아갑니다. 이제 다른 컨테이너를 생성하고 Step4Container1 의 볼륨을 여기에 마운트하려고 합니다.

  • 생성: Step4Container2 및 컨테이너의 볼륨 연결: Step4Container1

다음 명령어를 실행하여 Step4Container2를 생성하고, 다음으로부터 볼륨을 마운트합니다: Step4Container1:

컨테이너 내부에서 cat 명령어를 사용하여 데이터 지속성을 확인합니다:

다음과 같은 출력이 표시되어야 합니다:

Container Data Sharing

다음 명령어를 입력하여 Step4Container2에서 파일에 텍스트를 더 추가할 수 있습니다:

이후 컨테이너를 종료하고 Step4Container1로 돌아가 데이터가 여전히 존재하는지 확인합니다.

  • 서로 다른 컨테이너 간의 Docker 볼륨 변경 사항 확인

변경 사항을 보려면 먼저 다음 명령어를 사용하여 Step4Container1을 재시작합니다:

다음 명령어를 사용하여 변경 사항을 확인합니다:

아래 스크린샷과 유사한 출력이 표시되어야 합니다:

Copied Container Data

두 컨테이너 모두 동일한 볼륨에 데이터를 읽고 쓸 수 있음을 확인하면 이제 컨테이너를 종료할 수 있습니다. 언급했듯이 Docker는 파일 잠금을 처리하지 않으며, 공유 데이터 저장소에 대한 읽기-쓰기 액세스를 처리해야 하는 것은 컨테이너 내부에서 실행되는 애플리케이션 로직의 역할입니다. Docker는 다음 예제와 같이 :ro를 추가하여 읽기 전용 액세스만 필요한 컨테이너에 의한 우발적인 데이터 손상을 방지하기 위해 볼륨을 읽기 전용으로 마운트할 수 있도록 허용합니다.

  • Docker 컨테이너에 볼륨을 읽기 전용으로 마운트하기

이 예제에서는 이름이 Step4Container3인 컨테이너를 생성합니다. 생성 명령어에서 Step4Container1의 볼륨을 마운트하고 :ro를 추가하여 이 컨테이너가 읽기 전용 액세스 권한을 가지며 볼륨에 쓸 수 없음을 지정합니다. 터미널에서 다음 명령어를 실행하십시오:

컨테이너 내부에 들어가면 다음 명령어를 입력하여 볼륨의 텍스트 파일을 읽을 수 있습니다:

Read Only Mount

그러나 다음 명령어를 사용하여 파일을 제거하려고 하면:

터미널에 다음과 같은 오류 메시지가 표시됩니다:

Read Only Error

읽기-쓰기 권한을 확인한 후 컨테이너를 종료할 수 있습니다. 이 튜토리얼에서 생성된 컨테이너와 볼륨을 정리하려면 다음 명령을 실행하십시오:

이 단계에서는 Docker 볼륨을 사용하여 여러 컨테이너 간에 데이터를 공유하는 방법과 데이터 볼륨을 컨테이너에 읽기 전용으로 마운트하는 방법을 배웠습니다.

결론

이 튜토리얼에서는 몇 개의 Docker 볼륨을 생성하고 Docker 컨테이너 간에 데이터를 공유하는 방법을 배웠습니다. 컨테이너 간의 데이터 공유를 다루는 동안, Docker에는 파일 잠금을 처리하는 구현이 없기 때문에 공유 데이터 저장소에 쓸 때 데이터 손상을 방지하기 위해 컨테이너 내부의 개별 애플리케이션 로직이 파일 잠금을 처리해야 한다는 점에 유의했습니다.

Docker 활용에 대한 추가 리소스를 보려면 다음에서 더 많은 튜토리얼을 확인해 보시기 바랍니다: 저희 블로그:

즐거운 컴퓨팅 되세요!

author

Pranay Kapgate

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.