내용을 포함하여 도커 컨테이너 및 관련 데이터 컨테이너를 어떻게 배포합니까?


18

나는 Docker에 익숙하지 않다는 것을 인정하면서 시작할 것이며 잘못된 가정 세트 에서이 문제에 접근하고있을 수도 있습니다 ... 그 경우에 대해 알려주십시오. Docker가 배포에 어떻게 유용한 지에 대한 많은 토론을 보았지만 실제로 어떻게 수행되는지에 대한 예는 없습니다.

내가 생각한 방식은 다음과 같습니다 .

  1. 머신 A에서 일부 지속 데이터를 보유 할 데이터 컨테이너 작성
  2. 데이터 컨테이너의 볼륨을 사용하는 응용 프로그램 컨테이너를 만듭니다.
  3. 잠재적으로 데이터 컨테이너의 데이터를 변경하는 작업을 수행하십시오.
  4. 응용 프로그램 컨테이너를 중지
  5. 데이터 컨테이너 커밋 및 태그 지정
  6. 데이터 컨테이너를 (개인) 저장소로 푸시
  7. 머신 B에서 6 단계의 이미지를 끌어서 실행
  8. 기계 B에서 멈춘 곳을 주워

여기서 중요한 단계는 5 단계이며 현재 상태 (파일 시스템의 내용 포함)를 저장한다고 생각했습니다. 그런 다음 해당 상태를 저장소로 푸시하고 다른 곳에서 가져와 본질적으로 원래 컨테이너와 동일한 새 컨테이너를 제공 할 수 있습니다.

그러나 그것은 그렇게 작동하지 않는 것 같습니다. 내가 찾은 것은 5 단계가 내가 생각하는 것을하지 않거나 7 단계 (이미지 풀링 및 실행)가 컨테이너를 초기 상태로 "재설정"한다는 것입니다.

나는 이것을 테스트하기 위해 3 개의 Docker 이미지와 컨테이너 세트를 모았다 : 데이터 컨테이너, 데이터 컨테이너의 파일에 임의의 문자열을 30 초마다 쓰는 라이터 및 echo데이터의 값 을 단순히 읽는 리더 컨테이너 파일을 종료합니다.

데이터 컨테이너

로 만든

docker run \
    --name datatest_data \
    -v /datafolder \
    myrepository:5000/datatest-data:latest

도커 파일 :

FROM ubuntu:trusty

# make the data folder
#
RUN mkdir /datafolder

# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt

# expose the data folder
#
VOLUME /datafolder

작가

로 만든

docker run \
    --rm \
    --name datatest_write \
    --volumes-from datatest_data \
    myrepository:5000/datatest-write:latest

도커 파일 :

FROM ubuntu:trusty

# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh

CMD ["/usr/local/sbin/run.sh"]

run.sh

#!/bin/bash

while :
do
    sleep 30s

    NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)

    echo "$NEW_STRING" >> /datafolder/data.txt

    date >> /datafolder/data.txt

    echo "wrote '$NEW_STRING' to file"
done

이 스크립트는 /datafolder/data.txt데이터 컨테이너에 임의의 문자열과 날짜 / 시간을 기록합니다.

리더

로 만든

docker run \
    --rm \
    --name datatest_read \
    --volumes-from datatest_data \
    myrepository:5000/datatest-read:latest

도커 파일 :

FROM ubuntu:trusty

# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh

CMD ["/run.sh"]

run.sh :

#!/bin/bash

echo "reading..."

echo "-----"

cat /datafolder/data.txt

echo "-----"

이 컨테이너를 빌드하고 실행할 때 컨테이너가 정상적으로 실행되고 예상대로 작동합니다.

개발 머신에서 중지 및 시작 :

  1. 데이터 컨테이너를 만듭니다
  2. 작가를 운영하다
  3. 리더를 즉시 실행하십시오. "데이터가 없습니다!" 메시지
  4. 잠시만 기다려주세요
  5. 독자를 실행, 임의의 문자열을 참조하십시오
  6. 작가를 중지
  7. 작가를 다시 시작
  8. 독자를 실행, 동일한 임의의 문자열을 참조하십시오

그러나 커밋 및 푸시는 내가 기대하는 것을하지 않습니다.

  1. 데이터 컨테이너를 만듭니다
  2. 작가를 운영하다
  3. 리더를 즉시 실행하십시오. "데이터가 없습니다!" 메시지
  4. 잠시만 기다려주세요
  5. 독자를 실행, 임의의 문자열을 참조하십시오
  6. 작가를 중지
  7. 데이터 컨테이너 커밋 및 태그 지정 docker commit datatest_data myrepository:5000/datatest-data:latest
  8. 저장소로 밀다
  9. 모든 컨테이너를 삭제하고 다시 만드십시오

이 시점에서 데이터 컨테이너가 커밋되어 리포지토리로 푸시 된 다음 리포지토리의 동일한 이미지에서 다시 만들어지기 때문에 독자를 실행하고 동일한 임의의 문자열을 볼 것으로 예상됩니다. 그러나 실제로 볼 수있는 것은 "데이터가 없습니다!"입니다. 메시지.

누군가 내가 여기서 잘못 가고 있다고 설명 할 수 있습니까? 또는 Docker를 사용하여 배포를 수행하는 방법에 대한 예를 알려주십시오.

답변:


22

도커에서 볼륨이 작동하는 방식에 대한 잘못된 가정이 있습니다. 볼륨이 도커 컨테이너 및 도커 이미지와 어떤 관련이 있는지 설명하고 데이터 볼륨데이터 볼륨 컨테이너의 차이점 이 명확 해지기를 바랍니다.

먼저 몇 가지 정의를 생각해 봅시다

도커 이미지

Docker 이미지는 기본적으로 통합 파일 시스템 + 메타 데이터입니다. docker export명령을 사용하여 docker image union 파일 시스템의 내용을 검사하고 명령을 사용하여 docker 이미지 메타 데이터를 검사 할 수 있습니다 docker inspect.

데이터 양

로부터 도커 사용자 가이드 :

데이터 볼륨은 Union File System을 우회하여 영구 또는 공유 데이터에 유용한 여러 기능을 제공하는 하나 이상의 컨테이너 내에서 특별히 지정된 디렉토리입니다.

주어진 볼륨 (데이터를 포함하는 디렉토리 또는 파일)은 볼륨을 사용하는 하나 이상의 도커 컨테이너가있는 경우에만 재사용 할 수 있습니다. 도커 이미지에는 볼륨이 없으며, 결국 유니언 파일 시스템에서 볼륨이 마운트 될 위치를 알려주는 메타 데이터 만 있습니다. 데이터 볼륨은 도커 컨테이너 통합 파일 시스템의 일부가 아니므로 어디에 있습니까? 아래 /var/lib/docker/volumes고정 표시기 호스트 (용기에 저장되는 동안 /var/lib/docker/containers).

데이터 볼륨 컨테이너

그 특별한 유형의 컨테이너에는 특별한 것이 없습니다. 데이터 볼륨을 사용하는 컨테이너를 하나 이상 갖는 유일한 목표로 데이터 볼륨을 사용하여 컨테이너를 중지했습니다. 주어진 데이터 볼륨을 사용하는 마지막 컨테이너 (실행 또는 중지)가 삭제되는 즉시 docker run --volumes-from 옵션을 통해 해당 볼륨에 도달 할 수 없게됩니다 .

데이터 볼륨 컨테이너 작업

데이터 볼륨 컨테이너를 만드는 방법

데이터 볼륨 컨테이너를 만드는 데 사용 된 이미지는 컨테이너가 중지 된 상태를 유지하고 그 목적을 계속 유지할 수 있으므로 중요하지 않습니다. 따라서 datatest_data볼륨에 이름이 지정된 데이터 컨테이너를 작성 /datafolder하려면 다음을 실행하면됩니다.

docker run --name datatest_data --volume /datafolder busybox true

다음 base은 이미지 이름 (편리한 작은 이름)이며 true누락 된 명령에 대해 docker 데몬이 불평하는 것을 피하기 위해 제공하는 명령입니다. 어쨌든 명령 옵션을 datatest_data사용하여 해당 볼륨에 도달 할 수 있도록하기 위해 중지 된 컨테이너를 명명 한 후 .--volumes-fromdocker run

데이터 볼륨 컨테이너에서 읽는 방법

데이터 볼륨을 읽는 두 가지 방법을 알고 있습니다. 첫 번째 방법은 컨테이너를 통하는 것입니다. 기존 컨테이너에 셸을 사용하여 해당 데이터 볼륨에 액세스 할 수없는 경우 해당 데이터 --volumes-from를 읽기위한 옵션 으로 새 컨테이너를 실행할 수 있습니다 .

예를 들어 :

docker run --rm --volumes-from datatest_data busybox cat /datafolder/data.txt

다른 방법은 /var/lib/docker/volumes폴더 에서 볼륨을 복사하는 것 입니다. 볼륨을 사용하여 컨테이너 중 하나의 메타 데이터를 검사하여 해당 폴더에서 볼륨 이름을 발견 할 수 있습니다. 자세한 내용은 이 답변 을 참조하십시오.

볼륨 작업 (Docker 1.9.0부터)

볼륨을 만드는 방법 (Docker 1.9.0부터)

Docker 1.9.0은 docker volume볼륨을 생성 할 수 있는 새로운 명령 을 도입했습니다 .

docker volume create --name hello

볼륨에서 읽는 방법 (Docker 1.9.0부터)

라는 이름의 볼륨 생성한다고 가정 해 봅시다 hello과를 docker volume create --name hello당신이있는 용기에 장착 할 수 있습니다, -v옵션 :

docker run -v hello:/data busybox ls /data

컨테이너 커밋 및 푸시

데이터 볼륨이 컨테이너 (통합 파일 시스템)의 일부가 아니기 때문에 컨테이너를 커미트하여 새 도커 이미지를 생성하면 데이터 볼륨에있는 데이터가 유지되지 않습니다.

데이터 볼륨 백업

도커 사용 설명서에는 데이터 볼륨 백업에 대한 유용한 기사가 있습니다 .


볼륨에 관한 좋은 기사 : http://container42.com/2014/11/03/docker-indepth-volumes/


"데이터 볼륨 컨테이너를 만드는 데 사용 된 이미지는 중요하지 않습니다"가 정확하지 않은 것 같습니다. "스크래치"이미지로 "exec :"true ": 실행 파일을 찾을 수 없음"으로
시도하십시오

이 오류에도 불구하고 귀하의 컨테이너는 볼륨 보유자로서의 역할을 수행하도록 만들어 질 것입니다
Thomasleveil

1
흠-아마도 그 문제를 열어 볼 가치가 있습니다.
tcurdt

아니요, 스크래치 이미지는 빈 이미지이므로 /bin/true이진 (또는 다른 것)을 가질 수 없습니다
Thomasleveil

1
단 하나. "주어진 데이터 볼륨을 사용하는 마지막 컨테이너 (실행 또는 중지)가 삭제 되 자마자 도커는 / var / lib / docker / volumes에서 해당 데이터 볼륨을 삭제합니다."라고 말했지만 실제로는 그렇지 않습니다. docs.docker.com/userguide/dockervolumes (컨테이너 자체가 삭제 된 경우에도 데이터 볼륨이 유지됩니다. docker rm -v볼륨을 삭제하려면 마지막 컨테이너에 대해 명령을 지정해야합니다 )
juanra

1

도커 데이터 컨테이너를 사용하여 코드를 배포 할 수도 있습니다.

그것이 좋은 습관인지는 모르겠지만, 나는 그렇게합니다 :

FROM ubuntu:trusty

# make the data folder
#
RUN mkdir /data-image

# in my case, I have a 
# ADD dest.tar /data-image/
#
# but to follow your example :
# write something to the data file
RUN echo "no data here!" > /data-image/data.txt

# expose the data folder 
#
VOLUME /datafolder

ENTRYPOINT cp -r /data-image/* /datafolder/

이제 이미지를 푸시하고에서 from 등을 사용할 수 있습니다 ...


이것은 내가 찾고있는 것이지만 허용되는 대답은 이것을 할 수 없다는 것을 명시 적으로 언급합니다. 이제 시험 해봐
andho

1
두 번째 눈에 허용 대답은 (그 안에 또는 데이터) 볼륨이 커밋 실 거예요 말한다,하지만 당신은 사용하여 컨테이너에 데이터를 추가 할 수 있습니다 COPY또는 ADD및 사용하여 볼륨 생성 VOLUMEDockerfile에 있습니다.
andho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.