나는 Docker에 익숙하지 않다는 것을 인정하면서 시작할 것이며 잘못된 가정 세트 에서이 문제에 접근하고있을 수도 있습니다 ... 그 경우에 대해 알려주십시오. Docker가 배포에 어떻게 유용한 지에 대한 많은 토론을 보았지만 실제로 어떻게 수행되는지에 대한 예는 없습니다.
내가 생각한 방식은 다음과 같습니다 .
- 머신 A에서 일부 지속 데이터를 보유 할 데이터 컨테이너 작성
- 데이터 컨테이너의 볼륨을 사용하는 응용 프로그램 컨테이너를 만듭니다.
- 잠재적으로 데이터 컨테이너의 데이터를 변경하는 작업을 수행하십시오.
- 응용 프로그램 컨테이너를 중지
- 데이터 컨테이너 커밋 및 태그 지정
- 데이터 컨테이너를 (개인) 저장소로 푸시
- 머신 B에서 6 단계의 이미지를 끌어서 실행
- 기계 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 "-----"
이 컨테이너를 빌드하고 실행할 때 컨테이너가 정상적으로 실행되고 예상대로 작동합니다.
개발 머신에서 중지 및 시작 :
- 데이터 컨테이너를 만듭니다
- 작가를 운영하다
- 리더를 즉시 실행하십시오. "데이터가 없습니다!" 메시지
- 잠시만 기다려주세요
- 독자를 실행, 임의의 문자열을 참조하십시오
- 작가를 중지
- 작가를 다시 시작
- 독자를 실행, 동일한 임의의 문자열을 참조하십시오
그러나 커밋 및 푸시는 내가 기대하는 것을하지 않습니다.
- 데이터 컨테이너를 만듭니다
- 작가를 운영하다
- 리더를 즉시 실행하십시오. "데이터가 없습니다!" 메시지
- 잠시만 기다려주세요
- 독자를 실행, 임의의 문자열을 참조하십시오
- 작가를 중지
- 데이터 컨테이너 커밋 및 태그 지정
docker commit datatest_data myrepository:5000/datatest-data:latest
- 저장소로 밀다
- 모든 컨테이너를 삭제하고 다시 만드십시오
이 시점에서 데이터 컨테이너가 커밋되어 리포지토리로 푸시 된 다음 리포지토리의 동일한 이미지에서 다시 만들어지기 때문에 독자를 실행하고 동일한 임의의 문자열을 볼 것으로 예상됩니다. 그러나 실제로 볼 수있는 것은 "데이터가 없습니다!"입니다. 메시지.
누군가 내가 여기서 잘못 가고 있다고 설명 할 수 있습니까? 또는 Docker를 사용하여 배포를 수행하는 방법에 대한 예를 알려주십시오.