1. 개요

Docker에는 실행 중인 컨테이너의 데이터를 유지하고 공유하는 여러 옵션이 있습니다. 그러나 예를 들어 백업을 생성하거나 다른 액세스 권한을 부여하기 위해 실행 중인 컨테이너에 대해 둘 이상의 파일 스토리지가 필요할 수 있습니다. 또는 동일한 컨테이너에 대해 명명된 볼륨을 추가하고 특정 경로에 바인딩해야 할 수도 있습니다.

이 사용방법(예제)에서는 컨테이너에 여러 볼륨을 탑재하는 방법을 살펴봅니다. 명령줄과 Docker Compose 모두에서 몇 가지 예를 볼 수 있습니다.

2. Docker 컨테이너에 다중 마운트

Docker는 스토리지를 사용하여 데이터를 유지하므로 컨테이너가 다시 시작되더라도 정보가 손실되지 않습니다. 또한 클러스터 환경에서 공유하려면 데이터 지속성이 중요합니다.

가장 일반적인 개발 사용 사례를 강조하기 위해 VolumesBind 마운트를 사용하여 몇 가지 예를 만들 것입니다 .

2.1. 여러 볼륨 사용

먼저 이름이 서로 다른 두 개의 볼륨을 생성해 보겠습니다 .

docker volume create --name first-volume-data && docker volume create --name second-volume-data

웹 응용 프로그램에 대해 두 개의 서로 다른 볼륨을 마운트하려고 하지만 해당 경로 중 하나는 읽기 전용이어야 한다고 가정합니다.

명령줄을 사용하는 경우 -v 옵션을 사용할 수 있습니다.

docker run -d -p 8080:8080 -v first-volume-data:/container-path-1 -v second-volume-data:/container-path-2:ro --name web-app web-app:latest

예를 들어 -v container-path 를 포함하여 익명 볼륨을 사용할 수도 있습니다 . Docker가 우리를 위해 생성하지만 컨테이너를 삭제하면 제거됩니다.

마운트가 올바른지 컨테이너를 검사해 보겠습니다 .

docker inspect 0050cda73c6f

소스 및 대상, 유형, 두 번째 볼륨의 읽기 전용 상태와 같은 관련 정보를 볼 수 있습니다.

"Mounts": [
  {
      "Type": "volume",
      "Name": "first-volume-data",
      "Source": "/var/lib/docker/volumes/first-volume-data/_data",
      "Destination": "/container-path-1",
      "Driver": "local",
      "Mode": "z",
      "RW": true,
      "Propagation": ""
  },
  {
      "Type": "volume",
      "Name": "second-volume-data",
      "Source": "/var/lib/docker/volumes/second-volume-data/_data",
      "Destination": "/container-path-2",
      "Driver": "local",
      "Mode": "z",
      "RW": false,
      "Propagation": ""
  }
]

마찬가지로 Docker는 –mount 옵션을 사용할 것을 권장합니다.

docker run -d \
  --name web-app \
  -p 8080:8080 \
  --mount source=first-volume-data,target=/container-path-1 \
  --mount source=second-volume-data,target=/container-path-2,readonly \
  web-app:latest

결과는 -v 옵션과 동일합니다. 그러나 더 나은 명확성 외에도 –mount는 Swarm 모드 에 있을 때 서비스 에서 볼륨을 사용할 수 있는 유일한 방법입니다 .

따라서 마운트가 여러 개인 웹 앱용 서비스를 생성하려면 –mount 옵션 을 사용해야 합니다 .

docker service create --name web-app-service \
  --replicas 3 \
  --publish published=8080,target=80 \
  --mount source=first-volume-data,target=/container-path-1 \
  --mount source=second-volume-data,target=/container-path-2,readonly \
  web-app

마찬가지로 서비스를 검사할 수 있습니다.

docker service inspect web-app-service

마찬가지로 서비스 사양 내부의 컨테이너에 대한 정보를 얻을 수 있습니다.

"Mounts": [
  {
      "Type": "volume",
      "Source": "first-volume-data",
      "Target": "/container-path-1"
  },
  {
      "Type": "volume",
      "Source": "second-volume-data",
      "Target": "/container-path-2",
      "ReadOnly": true
  }
]

2.2. 볼륨 및 바인드 마운트 사용

또한 호스트의 특정 폴더 또는 파일에 대한 마운트와 함께 볼륨을 사용할 수도 있습니다.

MySQL 데이터베이스 이미지가 있고 초기 스크립트를 실행하여 스키마를 생성하거나 일부 데이터로 채워야 한다고 가정 합니다 .

docker run -d \
  --name db \
  -p 3306:3306 \
  --mount source=first-volume-data,target=/var/lib/mysql \
  --mount type=bind,source=/init.sql,target=/docker-entrypoint-initdb.d/init.sql \
  mysql:latest

컨테이너를 검사하면 이제 두 가지 마운트 유형을 볼 수 있습니다.

"Mounts": [
  {
      "Type": "volume",
      "Name": "first-volume-data",
      "Source": "/var/lib/docker/volumes/first-volume-data/_data",
      "Destination": "/var/lib/mysql",
      "Driver": "local",
      "Mode": "z",
      "RW": true,
      "Propagation": ""
  },
  {
      "Type": "bind",
      "Source": "/init.sql",
      "Destination": "/docker-entrypoint-initdb.d/init.sql",
      "Mode": "",
      "RW": true,
      "Propagation": "rprivate"
  }
]

2.3. 다중 바인드 마운트 사용

마찬가지로 로컬 AWS 에뮬레이터인 Localstack을 사용할 때와 같이 여러 바인드 마운트를 사용할 수 있습니다 .

로컬 S3 서비스를 시작한다고 가정합니다.

docker run --name localstack -d \
  -p 4563-4599:4563-4599 -p 8055:8080 \
  -e SERVICES=s3 -e DEBUG=1 -e DATA_DIR=/tmp/localstack/data \
  -v /.localstack:/var/lib/localstack -v /var/run/docker.sock:/var/run/docker.sock \
  localstack/localstack

컨테이너를 검사하는 동안 호스트 구성에서 여러 바인드를 볼 수 있습니다.

"Binds": [
  "/.localstack:/var/lib/localstack",
  "/var/run/docker.sock:/var/run/docker.sock"
]

3. 도커 작성

Docker Compose를 사용하여 여러 마운트를 위한 보다 간결한 방법을 살펴보겠습니다 .

3.1. 여러 볼륨 사용

먼저 YAML 템플릿에 표시된 대로 두 개의 볼륨으로 시작하겠습니다.

services:
  my_app:
    image: web-app:latest
    container_name: web-app
    ports:
      - "8080:8080"
    volumes:
      - first-volume-data:/container-path-1
      - second-volume-data:/container-path-2:ro

volumes:
  first-volume-data:
    driver: local
  second-volume-data:
    driver: local

이전에 생성한 볼륨을 정의하면 named-volume:container-path 형식으로 서비스에 마운트를 추가할 수 있습니다 .

Long 구문은 Docker Compose에서도 사용할 수 있습니다. 예를 들면 다음과 같습니다.

volumes:
  - type: volume
    source: volume-data
    target: /container-path

3.2. 볼륨 및 바인드 마운트 사용

다시 한 번 MySQL 서비스를 사용하는 예는 다음과 같습니다.

services:
  mysql-db:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_ROOT_HOST=localhost
    ports:
      - '3306:3306'
    volumes:
      - db:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

volumes:
  db:
    driver: local

3.3. 다중 바인드 마운트 사용

마지막으로 이전 Localstack 예제를 Docker Compose로 변환해 보겠습니다.

services:
  localstack:
    privileged: true
    image: localstack/localstack:latest
    container_name: localstack
    ports:
      - '4563-4599:4563-4599'
      - '8055:8080'
    environment:
      - SERVICES=s3
      - DEBUG=1
      - DATA_DIR=/tmp/localstack/data
    volumes:
      - './.localstack:/var/lib/localstack'
      - '/var/run/docker.sock:/var/run/docker.sock'

4. 결론

이 문서에서는 Docker를 사용하여 여러 마운트를 생성하는 방법을 살펴보았습니다.

바인드 마운트와 명명된 볼륨의 몇 가지 조합을 보았습니다. Docker 명령줄과 Docker Compose를 사용하는 사용 사례도 보았습니다.

항상 그렇듯이 GitHub에서 작업 코드 예제를 찾을 수 있습니다 .

res – REST with Spring (eBook) (everywhere)