[docker] Docker에서 영구 저장소 (예 : 데이터베이스)를 처리하는 방법

사람들이 Docker 컨테이너의 영구 저장소를 어떻게 처리합니까?

현재이 접근법을 사용하고 있습니다 : 예를 들어 PostgreSQL의 이미지를 빌드 한 다음 컨테이너를 시작하십시오.

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

IMHO, 그것은 단점이 있습니다. 우연히 컨테이너 “c0dbc34fd631″을 삭제해서는 안됩니다.

또 다른 아이디어는 컨테이너에 호스트 볼륨 “-v”를 장착하는 것입니다, 그러나, 사용자 ID 컨테이너 내에서 반드시 일치하지 않는 사용자 ID를 호스트에서 다음 사용 권한이 엉망이 될 수 있습니다.

참고 : 대신 --volumes-from 'cryptic_id'당신은 또한 사용할 수있는 --volumes-from my-data-containermy-data-container은 데이터 전용 용기에 할당 된 이름입니다, 예를 들어 docker run --name my-data-container ...(허용 대답을 참조)



답변

도커 1.9.0 이상

볼륨 API 사용

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

이는 새로운 볼륨을 위해 데이터 전용 컨테이너 패턴을 포기해야한다는 것을 의미합니다.

실제로 볼륨 API는 데이터 컨테이너 패턴을 달성하는 더 좋은 방법 일뿐입니다.

-v volume_name:/container/fs/pathDocker 로 컨테이너를 만들면 다음을 수행 할 수있는 명명 된 볼륨이 자동으로 생성됩니다.

  1. 를 통해 나열 docker volume ls
  2. 를 통해 식별 docker volume inspect volume_name
  3. 일반 디렉토리로 백업
  4. --volumes-from연결을 통해 이전과 같이 백업

새로운 볼륨 API는 매달려있는 볼륨을 식별 할 수있는 유용한 명령을 추가합니다.

docker volume ls -f dangling=true

그런 다음 이름을 통해 제거하십시오.

docker volume rm <volume name>

@mpugach가 주석에서 밑줄을 긋 듯이 멋진 원 라이너로 모든 매달려있는 볼륨을 제거 할 수 있습니다.

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

도커 1.8.x 이하

프로덕션에 가장 적합한 방법은 데이터 전용 컨테이너 를 사용하는 것 입니다.

데이터 전용 컨테이너는 베어 본 이미지에서 실행되며 실제로 데이터 볼륨을 노출하는 것 외에는 아무 것도 수행하지 않습니다.

그런 다음 다른 컨테이너를 실행하여 데이터 컨테이너 볼륨에 액세스 할 수 있습니다.

docker run --volumes-from data-container some-other-container command-to-execute
  • 여기서 다른 용기를 배열하는 방법에 대한 좋은 그림을 얻을 수 있습니다.
  • 여기에 볼륨의 작동 방법에 대한 좋은 통찰력이있다.

에서는 블로그 게시물 소위 잘 설명가 볼륨 패턴 용기 갖는 요점 명확히 데이터 만 용기 .

Docker 설명서에는 컨테이너에 대한 명확한 설명이 볼륨 / 패턴으로 표시되어 있습니다.

다음은 Docker 1.8.x 이하의 백업 / 복원 절차입니다.

지원:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • –rm : 컨테이너가 나올 때 컨테이너를 제거합니다
  • –volumes-from DATA : DATA 컨테이너가 공유하는 볼륨에 연결
  • -v $ (pwd) : / backup : 컨테이너에 현재 디렉토리를 바인드 마운트합니다. tar 파일을
  • busybox : 작고 간단한 이미지-빠른 유지 보수에 적합
  • tar cvf /backup/backup.tar / data : / data 디렉토리에있는 모든 파일의 압축되지 않은 tar 파일을 만듭니다.

복원:

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

다음은 컨테이너 및 데이터 컨테이너에 동일한 이미지를 사용하는 것이 좋은 이유를 설명 하는 우수한 Brian Goff 의 멋진 기사입니다 .


답변

에서 부두 노동자 릴리스 V1.0 , A는 주어진 명령을 수행 할 수있는 호스트 컴퓨터에있는 파일이나 디렉토리의 마운트 바인딩 :

$ docker run -v /host:/container ...

위의 볼륨은 Docker를 실행하는 호스트에서 영구 저장소로 사용될 수 있습니다.


답변

Docker Compose 1.6부터 Docker Compose의 데이터 볼륨에 대한 지원이 개선되었습니다. 다음 작성 파일은 상위 컨테이너를 다시 시작하거나 제거 할 때까지 지속되는 데이터 이미지를 작성합니다.

블로그 발표는 다음과 같습니다. Compose 1.6 : 네트워크 및 볼륨을 정의하기위한 새로운 Compose 파일

다음은 작성 파일의 예입니다.

version: "2"

services:
  db:
    restart: on-failure:10
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
  web:
    restart: on-failure:10
    build: .
    command: gunicorn mypythonapp.wsgi:application -b :8000 --reload
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

volumes:
  db-data:

내가 이해할 수있는 한 : 이것은 db_data재시작 할 때까지 지속되는 데이터 볼륨 컨테이너 ( )를 만듭니다 .

다음을 실행 docker volume ls하면 볼륨이 표시됩니다.

local               mypthonapp_db-data
...

데이터 볼륨에 대한 자세한 내용을 얻을 수 있습니다.

docker volume inspect mypthonapp_db-data
[
  {
    "Name": "mypthonapp_db-data",
    "Driver": "local",
    "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mypthonapp_db-data/_data"
  }
]

일부 테스트 :

# Start the containers
docker-compose up -d

# .. input some data into the database
docker-compose run --rm web python manage.py migrate
docker-compose run --rm web python manage.py createsuperuser
...

# Stop and remove the containers:
docker-compose stop
docker-compose rm -f

# Start it back up again
docker-compose up -d

# Verify the data is still there
...
(it is)

# Stop and remove with the -v (volumes) tag:

docker-compose stop
docker=compose rm -f -v

# Up again ..
docker-compose up -d

# Check the data is still there:
...
(it is).

노트:

  • volumes블록 에서 다양한 드라이버를 지정할 수도 있습니다 . 예를 들어 db_data에 Flocker 드라이버를 지정할 수 있습니다.

    volumes:
      db-data:
        driver: flocker
    
  • Docker Swarm과 Docker Compose 간의 통합을 개선하고 Flocker를 Docker 에코 시스템에 통합하기 시작할 수 있습니다 (Docker가 Flocker를 구입했다는 소문을 들었습니다).

면책 조항 : 이 접근법은 유망하며 개발 환경에서 성공적으로 사용하고 있습니다. 아직 프로덕션 환경에서이 제품을 사용하는 것이 좋습니다!


답변

Docker 1.9부터 선택한 답변의 업데이트 5에서 명확하지 않은 경우 특정 컨테이너와 연결되지 않고 존재할 수있는 볼륨을 생성 할 수 있으므로 “데이터 전용 컨테이너”패턴이 더 이상 사용되지 않습니다.

docker 1.9.0에서 더 이상 사용되지 않는 데이터 전용 컨테이너를 참조하십시오 . # 17798 .

Docker 관리자는 데이터 전용 컨테이너 패턴이 약간 냄새가 났으며 볼륨을 관련 컨테이너없이 존재할 수있는 별도의 엔티티로 만들기로 결정했다고 생각합니다.


답변

이것은 여전히 약간의 작업이 필요한 Docker의 일부이지만 VOLUME 명령으로 볼륨을 Dockerfile에 넣어야 하므로 다른 컨테이너에서 볼륨을 복사 할 필요가 없습니다.

그러면 컨테이너의 상호 의존성이 줄어들고 한 컨테이너가 다른 컨테이너에 영향을 미치는 것을 삭제할 필요가 없습니다.


답변

사용하는 경우 도커 작성을 간단하게 예를 들어, 명명 된 볼륨을 첨부 :

version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - db_data:/var/lib/mysql:rw
    environment:
      MYSQL_ROOT_PASSWORD: root
volumes:
  db_data:


답변

@tommasop의 대답은 훌륭하며 데이터 전용 컨테이너를 사용하는 메커니즘에 대해 설명합니다. 그러나 처음에 데이터 컨테이너가 어쩌면 볼륨을 호스트에 바인드 할 수있을 때 바보라고 생각한 사람 (몇 가지 다른 대답에서 제안한 것처럼) 이제 실제로 데이터 전용 컨테이너가 매우 깔끔하다는 것을 알고 있습니다. 이 주제에 대한 블로그 게시물 : Docker 데이터 컨테이너 (볼륨!)가 좋은 이유

참조 : 내 대답 질문에 “이 도커 공유 볼륨에 대한 사용 권한을 관리 할 수있는 (가장 좋은) 방법은 무엇입니까? “호스트와의 권한과 UID / GID 매핑 등의 문제를 방지하기 위해 데이터 컨테이너를 사용하는 방법의 예를 들어.

OP의 원래 관심사 중 하나를 해결하려면 데이터 컨테이너를 삭제해서는 안됩니다. 데이터 컨테이너가 삭제 된 경우에도 컨테이너에 해당 볼륨에 대한 참조가있는 한 데이터 자체는 손실되지 않습니다. 즉,를 통해 볼륨을 마운트 한 컨테이너입니다 --volumes-from. 따라서 모든 관련 컨테이너가 중지되고 삭제되지 않는 한 (이것은 우연한 것으로 간주 될 수 있음 rm -fr /) 데이터는 안전합니다. 다음을 수행하여 항상 데이터 컨테이너를 다시 만들 수 있습니다--volumes-from해당 볼륨에 대한 참조가있는 .

항상 그렇듯이 백업하십시오!

업데이트 : Docker에는 이제 컨테이너와 독립적으로 관리 할 수있는 볼륨이있어 관리가 더 쉽습니다.