Docker Compose 버전 2“볼륨”구문은 어떻게 보입니까?


43

으로 도커 작성 v1.6.0의 +, 지금의 새 / 버전 2 파일 구문이 docker-compose.yml파일. 변경 사항에는이라는 별도의 최상위 키가 포함됩니다 volumes. 이를 통해 한 곳에서 볼륨 정의를 "중앙 집중"할 수 있습니다.

내가하려고하는 것은 거기에 볼륨의 이름지정 하고 로컬 호스트 디스크에 단일 볼륨 참조 다중 경로를 갖는 것입니다. 다음은로 Traceback끝나는 예외를 발생시키는 예 입니다.

AttributeError: 'list' object has no attribute 'items'

docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

지금까지 모든 Docker Compose docs master-branch Volume 구성 참조, Docker Compose docs Volume / Volume-Driver 참조를 읽고 예상되는 올바른 구문을 찾기 위해 GitHub 예제 를 살펴 보았습니다 . 아무도 그것을 사용하고 있지 않은 것 같습니다 (GitHub) 그리고 문서는 아직 완성되지 않았습니다 (docker.com). 또한로 별도의 볼륨을 작성 service하고 참조하려고 volumes했지만 제대로 작동하지 않습니다. 이 구문에 대해 어떻게 생각하십니까?

답변:


40

volumes열쇠의 목적

명명 된 볼륨 을 작성 합니다.

사용 하지 않으면 볼륨에 대한 해시 값이 많이 있습니다. 예:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

명명 된 볼륨을 사용하면 다음과 같은 결과가 나타납니다.

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

명명 된 볼륨을 만드는 방법

docker-compose.yml구문은 다음과 같습니다

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

위와 같이 명명 된 볼륨이 표시됩니다.

대량으로 볼륨을 제거하는 방법

해시가 많으면 정리하기가 매우 어려울 수 있습니다. 하나의 라이너가 있습니다.

docker volume rm $(docker volume ls |awk '{print $2}')

편집 : @ArthurTacca가 주석에서 지적했듯이 기억하기 쉬운 방법이 있습니다.

docker volume rm $(docker volume ls -q)

명명 된 볼륨에 대한 세부 정보를 얻는 방법

이제 더 이상 해시를 찾을 필요가 없으므로 계속 해시 고 그 이름으로 호출 할 수 있습니다  .

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

참고 :docker-compose down 볼륨을 만들기 전에 서비스를 새로 시작하기를 원할 수 있습니다 .

당신이 사용하는 경우 Boot2Docker / 도커 기계 , 당신은해야합니다 docker-machine sshsudo -i을하기 전에 ls -la /mnt/…해당 볼륨의 - 당신이 호스트 컴퓨터는 VM에 의해 제공된이다 도커 기계 .


1
아주 좋은 답변입니다. 건배. 새로운 docker-compose 볼륨을 찾기 위해 많은 것을 정리했습니다.
Derek Adair

어디서 찾았어요? 도커 문서보다 훨씬 더 힘들게 보입니까?
Derek Adair

1
@DerekAdair 감사합니다. 그러나 왼쪽 상단의 통계에서 읽을 수 있듯이이 답변은이 주제의 Google 검색 엔진 결과 페이지에서 잘 참조됩니다.
카이저

1
대신 $(docker volume ls |awk '{print $2}')사용할 수 있습니다. $(docker volume ls -q)이 방법이 더 간단 할 뿐만 아니라 첫 번째 줄에 "VOLUME"이 인쇄되지 않습니다.
Arthur Tacca

2
이것은 정확하지 않습니다. 이것은 그것이 보이는 것처럼 보이지 않습니다. 다른 컨테이너에서 볼륨 목록 volumes_from상속 하는 것입니다. 명명 된 볼륨을 사용하려면 서비스 수준 구문을 사용하고 - NAME:DEST최상위 volumes키 에서 경로를 설정하십시오 . 이 예제의 기능은 (쓰기시) 명명 된 볼륨 외에 표준 볼륨을 만드는 것이며 명명 된 볼륨은 단순히 사용되지 않습니다.
trevorj

13

내가 이해하는 방식으로 전역 volumes:섹션을 사용하여

  • 볼륨 이름을 정의하십시오
  • 다른 볼륨 이름으로 이름이 지정된 볼륨을 사용 가능하게하십시오.
  • 명명 된 볼륨에 대한 드라이버 및 드라이버 옵션 지정

전역 섹션의 볼륨은을 지정하지 않으면 자동으로 생성됩니다 external: true. 여전히 각 서비스의 해당 volumes:섹션에서 해당 볼륨을 마운트 할 위치를 알려야합니다 .

다음은 매우 간단한 예입니다.

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

의 전역 volumes:항목으로 project인해 명명 된 볼륨 project이 생성됩니다. 그런 다음 /bar서비스 1과 /foo서비스 2에서 와 같이 마운트됩니다 . 두 서비스 모두 볼륨의 데이터를 공유하고이를 읽고 쓸 수 있습니다.

나는 당신이하려는 일이 가능하다고 생각하지 않습니다 (여러 경로를 단일 볼륨으로 바꾸고 다른 r / w 플래그로). 경우 가 가능하며, 다음 아마도 수있는 방법을 찾아 외부 볼륨으로 추가 한 후 다른 수단을 통해 이러한 속성에 명명 된 볼륨을 생성합니다 :

volumes:
  mymagicvolume:
    external: true

1
이미 상향 조정되었지만 오늘 방금이 문제를 해결하고 확장 된 데이터를 추가했습니다. 모든 도움을 주셔서 감사합니다! 질문 : 볼륨의 이름을 지정한 project다음로 참조하면 실제로 경로 project:/bar는 어디에 project정의되어 있습니까?
kaiser

docker-compose는 / var / lib / docker / volumes / volumename 아래에 명명 된 볼륨으로 자동 생성합니다.
JamesCW

죄송합니다.도 커가 project:별칭 경로를 얻는 위치를 여전히 이해하지 못 합니까? 도커 ./some_folder/some_subfolder/yet_another_subfolderone:two:컨테이너 에 공유하고 싶은지 어떻게 알 수 있습니까?
Alexander Lomia

이 경우 최상위 볼륨 아래의 "project : <whateverpath>"입니다. 섹션
Balint Bako

5

예를 들어, 볼륨 구성 참조 와 같은 버전 2 를 확인하십시오 .

나의 예 : (버전 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

1
이것은 내가 질문에 정확하게 연결 한 것이므로 내 질문에 대답하지 않습니다. 호스트에서 다른 볼륨을 명명 된 볼륨으로 여러 서비스에 매핑하는 방법에 대한 예를 게시 하시겠습니까?
kaiser

내 링크 입니다 그것을 가리키는, 다른 Version 2) 문서의 섹션
alexus

내 잘못이야. 나는 단순히 그것도 연결하는 것을 잊었다. 질문에서 YML을 살펴보면 별도의 최상위 volumes키를 사용하여 명확하게 문제를 해결하려고 시도했음을 알 수 있습니다 . 내가 얻지 못하는 것은 docker-compose.yml버전 1 구문이 있는 부분이 나를 설명하기위한 것입니다.
kaiser

5

나는 당신이하려는 일이 여기 에서 본 것과 거의 동일하다고 생각 합니다 . 한마디로 : 현재 호스트의 마운트 지점을 나타내는 명명 된 볼륨을 생성 할 수 없습니다. 컨테이너간에 데이터를 공유하기 위해 명명 된 볼륨을 만들 수 있지만 데이터는 볼륨 자체에만 존재하며 볼륨을 삭제하면 사라집니다.

명명 된 볼륨의 마운트가 제안 되었지만 안타깝게도 가까운 시일 내에 코어에 추가되지는 않습니다. 그러나 local-persist 라는 docker 플러그인을 사용하면 가능합니다 .


3
명명 된 볼륨을 마운트 하는 것은 1.11 또는 1.12 이후입니다.
카이저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.