도완재-2

도완재-2

[따배도] 3-1. 도커 컨테이너 살펴보기 : 이론편

 

도커 컨테이너이론을 다루며, 컨테이너와 컨테이너 이미지가 어떻게 구성되고 동작하는지 설명합니다. 컨테이너는 격리된 환경에서 애플리케이션을 실행하는 반면, 컨테이너 이미지는 애플리케이션 실행에 필요한 파일들이 레이어 형태로 저장된 상태입니다. 도커 호스트에서 docker run 명령을 통해 컨테이너 이미지를 실행하면 컨테이너가 됩니다.

 

1. 도커와 컨테이너 개념

  • 도커는 애플리케이션을 컨테이너라는 독립적인 환경에서 실행할 수 있게 해주는 플랫폼이다.

  • 컨테이너는 하나의 애플리케이션을 의미하며, 여러 개의 컨테이너가 동시에 동작할 수 있다.

  • 예를 들어, Node.js 기반의 웹 서버, Python 애플리케이션, MySQL 데이터베이스가 각각의 컨테이너로 동작할 수 있다.

image-20250530-014227.png

 

 

2. 컨테이너의 특징

  • 컨테이너는 애플리케이션을 격리된 공간에서 실행하며, CPU, 메모리, 네트워크, 디스크 등의 리소스를 독립적으로 사용한다.

  • 각 컨테이너는 서로 영향을 주지 않으며, 개발자는 특정 컨테이너만 수정하여 기능을 추가할 수 있다.

  • 이러한 격리된 환경 덕분에 컨테이너는 독립적으로 운영될 수 있다.

 

3. 도커의 작동 원리

  • 도커는 리눅스 커널을 기반으로 하여 다양한 운영체제에서 설치할 수 있다.

  • 도커 호스트는 도커 데몬이 작동하는 시스템을 의미하며, 이 시스템에서 여러 개의 컨테이너가 실행된다.

  • 모든 컨테이너는 동일한 커널을 사용하지만, 물리적으로는 독립적으로 작동한다.

 

4. 컨테이너 구조

  • 컨테이너는 여러 개의 레이어로 구성되어 있으며, 각 레이어는 애플리케이션의 실행 환경을 제공한다.

  • 예를 들어, Node.js를 베이스 이미지로 하고, 앱.js를 소스 이미지로 추가하여 실행 파일을 넣는 구조이다.

  • 이러한 레이어 구조는 컨테이너 이미지를 형성하며, 여러 개의 레이어로 구성된다.

image-20250530-014510.png

 

 

5. 컨테이너 이미지와 실행

  • 컨테이너 이미지는 하드디스크에 저장된 파일 형태로 존재하며, 실행 시 메모리에서 컨테이너로 변환된다.

  • 컨테이너는 실행 중인 프로세스이며, 이미지와는 다르게 읽기/쓰기가 가능하다.

  • 도커 호스트에서 컨테이너 이미지를 다운로드하고 실행하는 과정이 필요하다.

 

6. 도커 허브와 이미지 관리

  • Docker Hub는 다양한 컨테이너 이미지를 저장하는 공간으로, 10만 개 이상의 이미지가 존재한다.

  • 사용자는 Docker Hub에서 이미지를 검색하고 다운로드하여 사용할 수 있다.

  • 다운로드한 이미지는 로컬에서 저장되며, 이를 컨테이너화하여 실행해야 한다.

 

7. 컨테이너 실행과 웹 서비스

  • docker run 명령어를 사용하여 컨테이너를 실행하고, 웹 서비스를 제공할 수 있다.

  • 실행된 컨테이너는 클라이언트가 접근할 수 있는 서버 역할을 하며, 웹 페이지를 보여준다.

  • 컨테이너의 핵심은 이미지를 통해 애플리케이션을 쉽게 실행할 수 있다는 점이다.

 

8. 요약 및 정리

  • 도커 호스트는 도커 데몬이 작동하는 시스템이며, 도커 클라이언트는 명령어를 통해 데몬에 요청을 보낸다.

  • Docker Hub에서 제공하는 다양한 컨테이너 이미지를 활용할 수 있으며, 기업에서는 자체 이미지를 관리하기도 한다.

  • 컨테이너는 실행 중인 프로세스이며, 이미지 레이어별로 파일로 저장된다.

[따배도] 4-1. 도커 컨테이너 만들어보기: 이론편

 

본 영상은 도커 컨테이너를 만드는 이론에 관한 설명입니다. 도커를 이해하고 효과적으로 활용하기 위해서는 컨테이너의 구조와 개발, 배포 과정에 대한 명확한 개념이 필요합니다. 영상에서는 도커 파일의 생성과 명령어 사용법을 안내하며, 실제 개발 환경에서 어떻게 활용될 수 있는지를 다룹니다. 다양한 프로그래밍 언어와 운영 환경에 맞춰 컨테이너를 구성하고, 이를 통해 개발자들이 효율적인 애플리케이션 관리를 할 수 있도록 돕습니다.1. 🚢 도커 컨테이너의 개념과 활용

  • 도커 컨테이너를 만드는 과정을 세 가지 주제로 나누어 설명하며, 각각의 주제는 '무엇을 컨테이너로 만들 것인가', '도커 이미지를 통해 컨테이너를 생성하기', '컨테이너 배포 방법'이다 .

  • 컨테이너는 하나의 애플리케이션과 그 운영환경을 포함하며, 예를 들어 빅데이터를 처리하는 프로그램은 파이썬과 텐서플로우가 포함된 환경이 요구된다 .

  • Node.js와 같은 운영환경이 포함된 소스 코드와 명령어를 바탕으로, 애플리케이션은 독립적인 공간, 즉 컨테이너로 제작될 수 있다 .

  • 다양한 프로그래밍 언어와 플랫폼을 활용하여 하나의 이커머스 시스템을 구현하고, 각각의 기능(쇼핑 카트, 오더 서비스 등)을 컨테이너로 관리할 수 있다 .

  • 마이크로서비스 아키텍처를 통해 네트워크에서 독립적으로 운영되며, 고객 요구에 빠르게 대응하고 서비스의 질을 높일 수 있는 것이 현재 트렌드이다 .

 

2. Dockerfile의 개요와 지시어

image-20250530-014834.png

 

  • Dockerfile은 컨테이너를 생성하기 위한 명령어들의 집합으로, 이를 통해 사용자는 쉽게 컨테이너를 만들 수 있다 .

  • Dockerfile의 이름은 대소문자 구분 없이 'Dockerfile'이어야 하며, 이는 텍스트 파일 형식으로 되어 있다 .

  • 중요한 지시어로는 FROM, COPY, CMD가 있으며, 이들은 각각의 기능을 가지고 있어 컨테이너 구성 시 필수적이다 .

  • COPY 지시어는 호스트의 파일을 컨테이너로 복사할 때 사용되며, ADD는 아카이브 파일을 해제하거나 URL에서 파일을 다운로드하는 등의 추가 기능을 제공한다 .

  • TOP-DOWN 방식으로 해석되며, 사용자 정의한 베이스 이미지에서 시작하여 순차적으로 지시어를 실행하는 구조이다 .

 

3. 도커file의 주요 명령어 및 기능 설명

image-20250530-014845.png

 

  • 컨테이너 내에서 라이브러리 설치와 같은 작업은 RUN 명령어를 사용하여 수행된다.

  • MAINTAINERLABEL은 컨테이너에 대한 정보 제공을 위해 사용되며, 메인테이너의 정보나 설명 등을 포함할 수 있다.

  • ENVARG 명령어는 환경 변수를 생성하며, 컨테이너 빌드 후에도 변수는 유지된다.

  • USER 명령어는 사용자 전환을 가능하게 하며, 보안을 위해 루트 계정 대신 일반 계정을 사용하는 것이 바람직하다.

  • CMDENTRYPOINT는 컨테이너 실행 시 수행할 명령어를 설정하며, CMD는 변경 가능하지만 ENTRYPOINT는 변경을 차단하는 기능을 갖는다.

 

4. 도커 컨테이너 생성 및 배포 과정

  • Node.js 15 환경에서 개발한 소스 코드를 포함하는 컨테이너를 만들기 위해 hello.js 파일과 Dockerfile이 필요하다 .

  • 베이스 이미지로 Node.js 12를 사용하며, 앱의 소스코드를 동작시키기 위한 운영 환경을 설정해야 한다 .

  • 소스코드를 컨테이너의 최상위 디렉토리로 복사하기 위해 ADD 또는 COPY 명령을 사용할 수 있으며, 실행 시 Node.js로 hello.js를 동작하도록 명령을 설정한다 .

  • docker build 명령어를 통해 hello-js-test라는 이름의 컨테이너를 생성하며, 현재 디렉토리를 기준으로 파일을 가져온다 .

  • 만들어진 컨테이너는 배포를 위해 도커 허브에 업로드할 수 있으며, 이 때 인증 과정이 필요하다 .

 

5. Dockerfile 이해 및 활용 방법

  • Dockerfile의 지시어들은 hub.docker.com에서 다양한 예제를 통해 분석하고 해석할 수 있다 .

  • MySQL 컨테이너는 8.0.23 버전으로, Dockerfile을 통해 다양한 설정이 이루어지며, 베이스 이미지로는 Debian을 사용한다 .

  • EXPOSE 3306 명령은 MySQL 서비스가 3306번 포트에서 동작함을 의미하며, 이는 서비스 노출를 위해 설정된다 .

  • VOLUME /var/lib/mysql 명령은 MySQL 컨테이너의 데이터가 특정 경로에 저장되도록 지원하며, 해당 경로가 작업 디렉토리로 마운트되게 한다 .

  • 실습을 통해 Dockerfile 문법을 익히고, 개인 애플리케이션을 구현하는 과정이 창작의 고통을 동반할 것으로 추정된다 .

[따배도] 5-1. 컨테이너 보관창고 - 이론편

 

1. 컨테이너 보관 창고 개요

  • 컨테이너 보관 창고는 도커 레지스트리라고도 불림.

  • 이곳은 컨테이너 이미지를 저장하는 저장소 역할을 함.

 

2. 레지스트리 종류

image-20250530-050125.png

 

  • 레지스트리는 두 가지 종류가 있음:

    • 도커 허브: 퍼블릭한 컨테이너 이미지가 저장된 공간으로, 10만 개 이상의 이미지가 존재.

    • 프라이빗 레지스트리: 회사 내부에서만 사용할 수 있는 저장소.

 

3. 도커 허브 사용법

image-20250530-050827.png

 

  • 도커 허브에 접속하려면 http://hub.docker.com 사이트를 방문.

  • 계정생성 방법:

    • 상단 오른쪽의 싸인업 버튼 클릭.

    • 계정이름, 이메일, 비밀번호 입력 후 인증 메시지 확인.

  • 도커 허브에는 다양한 오피셜 이미지가 존재하며, 예를 들어 MongoDB, Ubuntu, PostgreSQL 등이 있음.

 

4. 개인 레파지토리 운영

image-20250530-050915.png

 

  • 도커 허브에서 계정을 만들면 개인 레파지토리를 운영할 수 있음.

  • 개인 레파지토리는 비어 있는 상태로 시작하며, 컨테이너를 푸시하면 저장됨.

  • 프라이빗한 공간도 만들 수 있지만, 별도의 비용이 필요.

 

5. 커맨드 라인에서의 검색

  • 도커 허브의 컨테이너 이미지는 도커 서치 명령어로 검색 가능.

  • 웹 브라우저와 커맨드 라인모두에서 접근 가능.

 

6. 프라이빗 레지스트리 운영

  • 개인적으로 운영할 수 있는 프라이빗 레지스트리를 만들 수 있음.

  • 레지스트리 컨테이너를 실행하면 프라이빗 레지스트리가 생성됨.

  • 컨테이너 푸시 및 풀 시, 호스트 네임과 포트 번호를 명시해야 함.

[따배도] 6-1. Docker 컨테이너 사용하기 - 이론편

 

1. 컨테이너 이미지 사용 및 관리

image-20250530-071427.png

 

  • 이번 강의에서는 컨테이너 이미지를 사용하는 방법과 실행 및 관리하는 방법에 대한 세 가지 주제를 다룬다 .

  • 컨테이너 이미지를 다운로드하기 위해 '도커 풀' 명령어를 사용하며, 레지스트리에서 원하는 이미지를 찾고 내 시스템으로 가져오는 과정이 포함된다 .

  • 다운로드한 이미지목록을 확인하기 위해 '도커 이미지ls' 명령어를 사용하고, 필요한 경우 '도커 인스펙트' 명령어로 세부 정보를 확인하거나 필요 없는 이미지를 '도커 rm' 명령어로 삭제할 수 있다 .

2. Docker 컨테이너 라이프 사이클 이해하기

image-20250530-071452.png

 

  • Docker 컨테이너를 실행하기 위해서는 먼저 이미지를 다운로드 받고, 이를 컨테이너로 실행해야 한다. 즉, 다운로드한 이미지는 크리에이트 명령어를 통해 컨테이너화된다 .

  • 컨테이너생성 후에는 스타트 명령어를 입력하여 애플리케이션서비스가 실행되는 러닝 상태로 전환된다 .

  • 현재 상태의 컨테이너는 도커 PS 명령어로 확인할 수 있으며, 이 명령어를 통해 러닝 중이거나 정지된 컨테이너의 수를 파악할 수 있다 .

  • 도커 런 명령어는 컨테이너 이미지다운로드, 생성, 실행 과정을 간소화하여 한 번의 명령어로 모든 작업을 처리할 수 있게 한다 .

  • 또한, 컨테이너의 실행 및 중지, 삭제 등은 각각의 명령어인 도커 스타트, 도커 스탑, 도커 RM을 통해 수행할 수 있으며, 이 과정에서 이미지는 삭제되지 않는다 .

 

3. Docker 컨테이너 관리 명령어

image-20250530-071553.png

 

  • 현재 동작 중인 컨테이너의 상태를 확인할 수 있는 명령어는 Docker PSDocker Top이다.

  • Docker Top 명령어는 컨테이너내에서 실행 중인 프로세스정보를 제공하며, 예를 들어 엔진엑스 웹서버 프로세스를 확인할 수 있다.

  • Docker Logs는 런닝 중인 컨테이너의 로그 정보를 보여주는 명령이다.

  • Docker Exec 명령어는 현재 실행 중인 컨테이너에 추가 명령을 실행할 수 있게 해준다.

  • 유용한 관리 명령어로는 컨테이너를 멈추거나 삭제하는 명령이 있으며, 여러 종류의 관리 명령어가 존재한다.

 

[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편

 

1. 컨테이너 리소스 관리 방법

image-20250530-080242.png

 

  • 동작 중인 컨테이너의 하드웨어 리소스를 제한하고 모니터링하는 방법에 대해 알아본다 .

  • 하드웨어 리소스는 CPU, 메모리, 디스크 등으로 구성되며 무한히 사용할 수 없기 때문에 적절한 제한이 필요하다 .

  • 하드웨어 리소스를 과도하게 사용할 경우 다른 컨테이너에 부정적인 영향을 미칠 수 있으므로, 리소스 할당 제한을 설정해야 한다 .

2. 도커 컨테이너의 리소스 관리 방법

image-20250530-080300.png

 

  • 디스크 I/O의 용량 제한을 설정할 수 있다.

  • 메모리 사용량 제한을 위해 여러 가지 옵션이 존재하며, 특히 4가지 방법 중 3개는 실제로 사용된다.

  • 메모리를 제한하는 방법으로는 -m 옵션이 있으며, 이는 컨테이너에서 사용할 수 있는 메모리의 최대 크기를 정의한다.

  • 메모리의 단위는 킬로바이트, 메가바이트, 기가바이트로 설정할 수 있다.

  • 만약 설정된 메모리 용량을 초과하면, 컨테이너는 자동 종료된다.

3. Docker 메모리 관리의 기본 원칙

image-20250530-080529.png

 

  • 메모리 레저베이션을 통해 엔진 X는 최소 500메가바이트를 보장받는다 .

  • 따라서 500메가 이상의 메모리를 사용할 수 있으며, 이론적으로 1개까지 추가로 사용할 수 있다 .

  • 메모리 사용은 디스크를 메모리처럼 사용하는 방식으로 최적화된다 .

  • 실제 할당된 메모리 값을 바탕으로 필요한 사이즈를 계산해야 하며, 할당하지 않은 메모리는 사용할 수 없다 .

  • 리눅스 커널에서 OOM Killer 기능은 메모리 부족 시 자원을 많이 사용하는 컨테이너를 종료할 수 있도록 한다 .

 

4. Docker CPU 리소스 관리 방법

image-20250530-080753.png

 

  • Docker에서 CPU 용량 리소스를 제안하는 방법은 총 3가지가 있다.

  • 첫 번째 방법은 CPU의 특정 코어를 지정하여 제한량을 설정하는 것으로, 예를 들어 4개 코어가 있을 때 각 코어에 대해 번호를 붙이고 사용할 수 있다.

  • 두 번째 방법은 리필 방식으로, 사용할 수 있는 코어 개수를 정해주며, 이는 특별한 작업을 지정할 수 있도록 돕는다.

  • 세 번째 방법은 cp 쉐어로, 이는 각 컨테이너가 기본적으로 CPU 사용량을 제한할 수 있도록 한다. 다른 컨테이너에 비해 특정 컨테이너에 더 많은 리소스를 할당할 수 있게 된다.

  • 이와 같은 방법을 통해 상대적 CPU 리소스 할당을 조절할 수 있으며, 필요에 따라 작업의 우선 순위를 정할 수 있다.

5. Docker 컨테이너 리소스 관리 및 모니터링

image-20250530-081127.png

 

  • Docker 컨테이너는 상대적 가중치를 통해 각각의 리소스를 할당받으며, 이를 통해 특정 컨테이너에 우선적 리소스 배정이 가능하다 .

  • 블록 IO와 관련하여, 기본값으로 500을 할당받으며, 별도로 설정하지 않으면 이 값을 기준으로 동작한다 .

  • 각 디바이스에 대해 리드라이트 속도 제어를 위해 초당 바이트 수와 최대 IOPS를 설정할 수 있으며, 이를 통해 읽기/쓰기 속도를 제어한다 .

  • IOPS 값을 통해서는 최대 읽기/쓰기를 쿼터로 설정할 수 있으며, 이를 준수하여 속도를 유지하게 된다 .

  • 모니터링 커맨드를 사용하여 컨테이너의 메모리 사용량, 디스크 I/O 등을 실시간으로 확인할 수 있으며, 구글에서 개발한 cAdvisor와 같은 모니터링 툴을 활용할 수 있다 .

[따배도] 8-1. Docker Container Storage - 이론편

 

1. 컨테이너 스토리지와 볼륨 이해하기

image-20250602-020110.png

 

  • 컨테이너 스토리지의 주요 주제는 컨테이너 볼륨의 개념, 데이터 영구 보존 방법, 그리고 컨테이너간 데이터 공유가능성이다.

  • 컨테이너 이미지는 리드 온리 속성을 가지고 있으며, 이는 수정이나 새로운 내용 추가가 불가능함을 의미한다.

  • 도커는 컨테이너를 실행할 때 리드 라이트 레이어를 추가하여 모든 데이터가 해당 레이어에 쌓이게 하고, 유니언 파일 시스템을 통해 리드 온리와 리드 라이트 레이어를 하나처럼 보여주는 기술을 사용한다.

 

2. 영구 데이터 보존을 위한 도커 컨테이너 볼륨

image-20250602-020050.png

 

  • 도커 컨테이너에서 고객 데이터와 같은 중요한 데이터는 컨테이너삭제 시 함께 사라질 수 있어, 이에 대한 예방이 필수적이다.

  • 데이터 유실을 방지하기 위해서는 컨테이너에서 생성된 데이터를 영구적으로 보존하기 위한 볼륨기술이 필요하다.

  • 영구 저장을 위해 도커 호스트에 저장소 공간을 생성한 후, 데이터를 해당 디스크에 보존하도록 구성해야 한다.

  • -v 옵션을 사용하여 호스트디렉토리와 컨테이너디렉토리를 마운트하면, 데이터를 계속해서 활용할 수 있다.

  • 컨테이너의 보안 이슈로 인해 호스트데이터가 변경되지 않도록 리드 전용으로 마운트하는 것이 바람직하다.

2.1. ️ 데이터 보호의 중요성

  • 도커 컨테이너에서 실행되는 MySQL 데이터베이스에는 고객들이 만든 수많은 데이터베이스가 쌓인다.

  • 데이터베이스의 데이터는 리드 라이트 레이어에 저장되어 운영된다.

  • 도커명령어로 컨테이너를 삭제할 경우, 해당 컨테이너와 함께 저장된 데이터도 통째로 삭제된다.

  • 고객 데이터와 DB 데이터는 너무 소중하기 때문에 영구적으로 보존해야 한다.

  • 이를 위해서는 컨테이너에서 볼륨 데이터를 보존하는 기술이 필수적이다.

2.2. 컨테이너 데이터를 영구적으로 보존하는 방법

  • 데이터를 영구적으로 보존하기 위해서는 도커 호스트에 저장소 공간을 만들어야 한다.

  • 이 저장소는 질량 기회나 다른 디스크로 설정할 수 있으며, 중요한 것은 아니다.

  • 설정된 디스크 안에는 실제로 DB 데이터라는 폴더가 생성되어 수많은 데이터가 쌓이게 된다.

  • 데이터 영구 보존을 위해서는 -v 옵션을 사용하여 호스트디렉토리에 컨테이너데이터가 저장되도록 해야 한다.

  • 이를 통해 컨테이너가 삭제되더라도 데이터는 여전히 남아 있어 다음에 동일한 데이터를 활용하여 서비스할 수 있다.

2.3. Docker 컨테이너에서 볼륨 마운트의 중요성

  • -v 옵션을 통해 다양한 방법으로 호스트와 컨테이너간의 데이터 마운트를 적용할 수 있다.

  • 호스트의 DB 데이터를 컨테이너에 볼륨 마운트해 주는 것이 기본 설정이다.

  • 컨테이너가 호스트의 디렉토리를 수정하는 것은 권장되지 않으며, 보안상의 이유로 주의가 필요하다.

  • 보통의 경우, 리드 전용 모드로 설정하여 데이터 보호를 강화할 수 있다.

  • 아파치웹서버와 같은 사례에서는 웹 데이터가 호스트에서 수정되지 않도록 보호하면서 서비스된다.

2.4. Docker 볼륨 마운트 방법

  • Docker에서는 볼륨 마운트를 통해 데이터를 영구적으로 저장할 수 있다.

  • 컨테이너에 사용하는 데이터는 UUID 디렉토리에 저장되며, 이는 임시 디렉토리가 아닌 영구적인 저장소가 된다.

  • 사용자는 데이터 디렉토리를 만들어 데이터를 저장할 수 있으며, 이 과정은 자동으로 마운트된다.

  • 이러한 방식으로 데이터를 영구적으로 보존하는 것이 가능하다는 점을 강조한다.

  • 실제 사용법에 대해서는 추후 실습 연습을 통해 알아볼 예정이다.

 

3. 컨테이너 간 데이터 공유 방법

image-20250602-020124.png

 

  • 컨테이너들끼리의 데이터 공유가 가능하다는 점이 강조된다.

  • 예를 들어, 특정 컨테이너가 실행될 때 웹 콘텐츠를 생성하고 이를 호스트의 디스크에 저장하는 방식이 설명된다.

  • 다른 컨테이너가 생성한 풍부한 웹 데이터를 사용하여 웹 서비스를 제공하며, 이를 통해 고객은 요청된 문서에 대한 응답을 받을 수 있다.

  • 볼륨 마운트를 통해 데이터를 저장 및 송출하는 기능이 있으며, 데이터는 다양한 솔루션( 그룹웨어등)에 적용될 수 있다.

  • 도커명령에서 특정 옵션을 사용하여 컨테이너간의 데이터 공유를 쉽게 구현할 수 있는 방법이 설명된다.

 

[따배도] 9-1. 컨테이너간 통신(네트워크) - 이론편

 

1. 도커 컨테이너 볼륨의 기본 개념

image-20250602-052940.png

 

속성

컨테이너 이미지

컨테이너 실행 시 (리드 라이트 레이어)

수정/쓰기 가능

리드 온리 (읽기 전용)

리드 라이트 (읽기/쓰기 가능)

데이터 저장

변경 불가

데이터 저장 및 수정 가능

  • 도커 컨테이너 이미지는 기본적으로 리드 온리 속성을 가지고 있습니다.

    • 이는 이미지 내용을 수정하거나 새로운 내용을 추가할 수 없다는 의미입니다.

    • 컨테이너 이미지는 읽기만 가능한 형태로 사용할 수 있습니다.

  • 도커 이미지를 docker run 명령으로 실행하면 컨테이너가 됩니다.

  • 컨테이너는 이미지와 달리 리드 라이트 레이어를 하나 더 연결하여 동작합니다.

    • 모든 데이터는 이 리드 라이트 레이어에 쌓이게 됩니다.

  • 도커는 유니언 파일 시스템이라는 기술을 사용하여 리드 온리 이미지 레이어와 리드 라이트 레이어가 마치 하나인 것처럼 보이게 합니다.

    • 이 기술은 오버레이라고도 불립니다.

    • 이를 통해 리드 온리 레이어의 내용과 리드 라이트 레이어의 변경 사항이 하나로 합쳐져서 우리에게 보여집니다.

 

2. 컨테이너 데이터의 영구적 보존 방법

image-20250602-055407.png

 

  • 컨테이너 안에서 생성된 데이터는 기본적으로 리드 라이트 레이어에 쌓입니다.

    • 예를 들어, MySQL 데이터베이스 컨테이너의 경우, DB 데이터가 리드 라이트 레이어에 쌓입니다.

  • 하지만 docker rm 명령으로 컨테이너를 삭제하면 리드 라이트 레이어와 컨테이너가 함께 사라집니다.

  • 이때 리드 라이트 레이어에 저장되어 있던 고객 데이터 등의 소중한 데이터도 함께 사라져 복원할 수 없게 됩니다.

    • 이러한 상황은 "완전 망했어요" 상태가 될 수 있습니다.

  • 따라서 컨테이너가 만들어내는 데이터를 영구적으로 보존하는 기술이 매우 중요합니다.

  • 데이터를 영구적으로 보존하는 방법은 도커 호스트에 별도의 저장소 공간을 만드는 것입니다.

    • 이 공간은 디렉토리가 될 수도 있고, 다른 디스크가 될 수도 있습니다.

    • 컨테이너가 만들어내는 데이터를 이 디스크에 보존하도록 만듭니다.

    • 디스크 안의 특정 폴더에 실제 컨테이너에서 만들어지는 데이터가 쌓이게 됩니다.

  • 이를 위해 볼륨 마운트라는 것을 사용합니다.

    • docker run 명령에 -v 옵션을 사용합니다.

    • -v 호스트_디렉토리:컨테이너_디렉토리 형식으로 사용하면, 컨테이너의 특정 디렉토리에서 만들어진 데이터가 실제 호스트의 디렉토리 안에 쌓이게 됩니다.

    • 이렇게 운영하다가 컨테이너를 실수로 삭제하더라도, 호스트 디렉토리의 데이터는 여전히 남아있습니다.

    • 다음에 동일한 명령으로 컨테이너를 실행하면, 남아있는 데이터를 그대로 활용하여 서비스를 제공할 수 있습니다.

    • 이렇게 하면 컨테이너의 데이터가 영구적으로 보존됩니다.

 

3. docker run -v 옵션의 다양한 활용

볼륨 마운트 옵션

설명

사용 예시

`호스트_패스:컨테이너_패스`

호스트의 특정 디렉토리와 컨테이너의 특정 디렉토리를 연결하여, 컨테이너에서 생성된 데이터가 호스트에 저장되도록 합니다.

`docker run -v /host/dbdata:/var/lib/mysql`

`호스트_패스:컨테이너_패스:ro`

호스트의 디렉토리를 컨테이너에 읽기 전용(Read Only)으로 마운트합니다. 컨테이너는 호스트 데이터를 읽을 수만 있고 수정할 수는 없습니다.

`docker run -v /host/webdata:/var/www/html:ro`

`컨테이너_패스`

호스트 디렉토리를 명시하지 않고 컨테이너 디렉토리만 지정하면, 도커가 임시 디렉토리 (실제로는 `variabel/lib/docker/volumes/UUID`)를 호스트에 자동으로 생성하고 컨테이너 디렉토리에 마운트합니다. 이것은 영구적인 디렉토리입니다.

`docker run -v /var/lib/mysql`

  • -v 옵션은 다양한 방법으로 적용할 수 있습니다.

  • 기본적인 사용법은 호스트_패스:컨테이너_패스 형태입니다.

    • 이는 호스트의 특정 디렉토리(호스트_패스)를 컨테이너의 특정 디렉토리(컨테이너_패스)에 볼륨 마운트 해줍니다.

    • 컨테이너의 해당 디렉토리에 쌓이는 데이터는 실제로 호스트의 디렉토리에 기록되도록 만듭니다.

    • 하지만 컨테이너가 호스트의 디렉토리를 수정하게 되는 것은 보안상 주의해야 합니다.

      • 만약 컨테이너에 보안 이슈가 발생하면 해커가 호스트 파일 시스템에 접근하여 파일을 저장할 수도 있습니다.

  • 일반적으로는 리드 오닐(read only) 옵션을 추가하여 사용합니다.

    • -v 호스트_패스:컨테이너_패스:ro 형태로 사용합니다.

    • 예를 들어, 웹서버 컨테이너에서 호스트의 HTML 문서를 서비스할 때, 호스트의 웹 데이터 디렉토리를 컨테이너의 웹 서비스 디렉토리에 읽기 전용으로 마운트합니다.

    • 이렇게 하면 아파치 웹서버가 호스트에 있는 데이터를 수정하지 못하도록 보호하면서 마운트할 수 있습니다.

    • ro를 붙이지 않으면 리드 라이트 속성이 됩니다.

  • 아주 간단하게 볼륨 마운트하는 방법도 있습니다.

    • -v 옵션 뒤에 컨테이너 디렉토리만 넣어주는 것입니다.

    • 대시 V 써 준 다음에 데려올 라이브 2 마이 스캔처럼 컨테이너 디렉토리만 명시합니다.

    • 이 경우 호스트에 variabel/lib/docker/volumes/UUID 형태의 영구적인 임시 디렉토리를 자동으로 생성하여 컨테이너 디렉토리에 마운트합니다.

    • 이러한 방식으로 영구적으로 데이터를 보존할 수 있습니다.

 

4. 컨테이너 간 데이터 공유 방법

  • 컨테이너들끼리 데이터 공유는 가능합니다.

  • 이를 위해 볼륨 마운트를 활용합니다.

  • 예를 들어, 호스트에 웹 데이터 디렉토리를 준비합니다.

  • 첫 번째 컨테이너 (예: 웹 콘텐츠 생성 컨테이너)를 실행할 때, 이 호스트 웹 데이터 디렉토리를 컨테이너의 웹 콘텐츠를 생성하는 디렉토리에 볼륨 마운트합니다.

    • 이 컨테이너는 웹 콘텐츠 (예: index.html)를 본인의 디렉토리에 만들지만, 실제로는 볼륨 마운트된 호스트 디스크 안에 저장됩니다.

  • 두 번째 컨테이너 (예: 웹서버 컨테이너)를 실행할 때도, 동일한 호스트 웹 데이터 디렉토리를 컨테이너의 웹 서비스 디렉토리에 볼륨 마운트합니다.

    • 이 두 번째 컨테이너는 첫 번째 컨테이너가 호스트에 저장한 데이터를 바라보게 됩니다.

    • 따라서 웹서버 컨테이너는 첫 번째 컨테이너가 만든 index.html을 가져다가 웹 서비스를 해줄 수 있습니다.

  • 이렇게 하면 누군가는 데이터를 만들어 저장하고, 누군가는 저장된 내용을 가져다가 서비스하는 형태로 컨테이너 간 데이터 공유가 가능합니다.

    • 예시로, 데이터 생성 컨테이너는 리드 라이트로 마운트하여 데이터를 만들고, 서비스 컨테이너는 리드 오닐로 마운트하여 데이터를 수정하지 못하도록 보호하면서 서비스할 수 있습니다.

  • 이러한 방식으로 그룹웨어 솔루션 데이터, 모니터링 정보, 게임 콘텐츠 등 다양한 데이터를 컨테이너 간에 공유할 수 있습니다.

  • 컨테이너 간 데이터 공유는 docker run 명령의 -v 옵션을 이용하여 구현할 수 있습니다.