컨테이너가 종료되면 데이터가 손실됩니다.
도커의 대화형 튜토리얼 및 FAQ에도 불구하고 컨테이너가 종료되면 데이터가 손실됩니다.
저는 여기 설명된 대로 도커를 설치했습니다: http://docs.docker.io/en/latest/installation/ubuntulinux 은 ubuntu 13.04에서 문제없이 설치했습니다.
그러나 종료 시 모든 데이터가 손실됩니다.
iman@test:~$ sudo docker version
Client version: 0.6.4
Go version (client): go1.1.2
Git commit (client): 2f74b1c
Server version: 0.6.4
Git commit (server): 2f74b1c
Go version (server): go1.1.2
Last stable version: 0.6.4
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 0s (195 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory
저는 또한 같은 결과를 가진 대화형 세션으로 테스트했습니다.내가 무언가를 까먹었나요?
편집: 신규 도커 사용자에게 중요
@mohammed-noueldin과 다른 사람들이 말했듯이, 사실 이것은 나가는 용기가 아닙니다.매번 새 컨테이너를 만듭니다.
변경한 내용을 컨테이너에 커밋한 다음 실행해야 합니다.사용해 보십시오.
sudo docker pull ubuntu
sudo docker run ubuntu apt-get install -y ping
그런 다음 다음 명령을 사용하여 컨테이너 ID를 가져옵니다.
sudo docker ps -l
컨테이너 변경 커밋:
sudo docker commit <container_id> iman/ping
그런 다음 컨테이너를 실행합니다.
sudo docker run iman/ping ping www.google.com
이게 통할 겁니다.
를 할 때docker run
컨테이너를 시작하기 위해 실제로 지정한 이미지를 기반으로 새 컨테이너를 만듭니다.
여기에 나와 있는 다른 유용한 답변 외에도 기존 컨테이너가 종료된 후에도 변경 사항이 그대로 남아 있으면 다시 시작할 수 있습니다.
docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
컨테이너 데이터를 유지하는 방법은 다음과 같습니다.
도커 볼륨
도커 커밋
Ubuntu 이미지에서 컨테이너를 생성하고 bash 터미널을 실행합니다.
$ docker run -i -t ubuntu:14.04 /bin/bash
터미널 설치 컬 내부
# apt-get update # apt-get install curl
컨테이너 터미널을 종료합니다.
# exit
다음 명령을 실행하여 컨테이너 ID를 기록합니다.
$ docker ps -a
컨테이너를 새 이미지로 저장
$ docker commit <container_id> new_image_name:tag_name(optional)
컬이 설치된 새 이미지를 볼 수 있는지 확인합니다.
$ docker images $ docker run -it new_image_name:tag_name bash # which curl /usr/bin/curl
Unferth의 답변 외에도 Docker 파일을 생성하는 것이 좋습니다.
빈 디렉토리에 다음 내용을 가진 "Docker file" 파일을 작성합니다.
FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]
도커 파일을 사용하여 이미지를 만듭니다.16진수 이미지 번호를 기억할 필요가 없도록 태그를 사용합니다.
$ docker build -t iman/ping .
그런 다음 이미지를 컨테이너에서 실행합니다.
$ docker run iman/ping stackoverflow.com
질문에 대한 위의 답변은 정말 훌륭합니다.다른 답변이 필요 없을 수도 있지만, 저는 여전히 가능한 한 간단한 말로 그 주제에 대한 개인적인 의견을 말하고 싶습니다.
다음은 컨테이너 및 이미지에 대한 몇 가지 요점으로, 결론을 내리는 데 도움이 될 것입니다.
- 도커 이미지는 다음과 같습니다.
- 천부적으로 만들어진
- 삭제된
- 컨테이너 수에 제한 없이 생성하는 데 사용되는
- 도커 컨테이너는 다음과 같습니다.
- 이미지에서 생성된
- 시작된
- 멈춘
- 재가동된
- 삭제된
- 임의의 수의 데이터를 생성하는 데 사용되는
- 도커 실행 명령은 다음을 수행합니다.
- 이미지를 다운로드하거나 캐시된 이미지를 사용합니다.
- 새 컨테이너를 만듭니다.
- 컨테이너를 시작합니다.
- 도커 파일을 사용하여 이미지를 생성하는 경우:
- 이미지가 결국 도커 컨테이너를 실행하는 데 사용될 것이라는 것은 이미 잘 알려져 있습니다.
- 도커 빌드 명령을 실행한 후 도커 비하인드는 기본 파일 시스템으로 실행 중인 컨테이너를 만들고 도커 파일 내부의 단계에 따라 개발자의 필요에 따라 컨테이너를 구성합니다.
- 컨테이너가 도커 파일의 사양으로 구성되면 이미지로 커밋됩니다.
- 이미지가 로큰롤할 준비가 됩니다!
결론:
보다시피 도커 컨테이너는 도커 이미지와 독립적입니다.
컨테이너의 고유 ID가 [ID를 가져오는 데 사용]인 경우 해당 컨테이너를 다시 시작할 수 있습니다.
새 디렉터리 만들기, 파일 만들기, 도구 설치 등의 모든 작업은 컨테이너가 실행 중일 때 컨테이너 내부에서 수행할 수 있습니다.컨테이너가 중지되면 모든 변경 사항이 유지됩니다.컨테이너를 중지했다가 다시 시작하는 것은 컴퓨터 시스템을 재부팅하는 것과 같습니다.
할 수 , 가 발행할 는 다시 시작할 수 .docker run
명령을 실행하면 이미지에서 새 컨테이너가 생성되므로 새 컴퓨터 시스템과 같습니다.이전 컨테이너 내부의 변경 사항은 현재 이해할 수 있지만 이 새 컨테이너에서는 사용할 수 없습니다.
마지막 메모:
데이터가 손실된 것처럼 보이지만 항상 존재하는 이유는 이제 분명해졌다고 생각합니다.하지만 다른 [오래된] 용기에.그래서, 차이점을 잘 기억하세요.docker start
&docker run
명령을 내리고 절대 혼동하지 않습니다.
당신의 질문에 대한 훨씬 더 간단한 대답이 있습니다. 다음 두 가지 명령을 실행하십시오.
sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a
위의 ps -a 명령은 모든 컨테이너의 목록을 반환합니다.이름을 '의 이름을 으로 생성합니다.를 들어 - 이지이참컨컨도사이용합니름다을 - 'ubuntu'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .'lightlyxuyzx'
option.dll, --name option.dll을
-t 및 -d 옵션은 중요합니다. 생성된 컨테이너가 분리되어 아래와 같이 -t 옵션과 함께 다시 연결할 수 있습니다.
--name 옵션을 사용하면 내 컨테이너 이름을 'mycontainname'으로 지정할 수 있습니다.
sudo docker exec -ti mycontainername bash
위의 명령은 bash 셸을 사용하여 컨테이너에 로그인하는 데 도움이 됩니다.이때부터 컨테이너에서 변경한 내용은 도커에 의해 자동으로 저장됩니다.들면 - 예를들어 -apt-get install curl
컨테이너 내부 문제 없이 컨테이너를 나갈 수 있으며, 도커는 변경사항을 자동으로 저장합니다.
다음 사용법에서는 이 컨테이너로 작업할 때마다 이 두 명령을 실행하기만 하면 됩니다.
다음 명령은 중지된 컨테이너를 시작합니다.
sudo docker start mycontainername
sudo docker exec -ti mycontainername bash
포트와 공유 공간이 아래에 제시된 또 다른 예:
docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash
제 경우: 7efe2989e877 - 은 이전 컨테이너가 실행 중인 이미지 ID이며, 이는 다음을 사용하여 얻은 것입니다.
도커 ps -a
컨테이너에 데이터를 유지하려면 도커 볼륨을 확인해야 합니다.https://docs.docker.com/engine/tutorials/dockervolumes/ 을 방문하세요.도커 설명서는 시작하기에 매우 좋은 장소입니다.
제 제안은 도커를 관리하고 도커를 구성하는 것입니다.프로젝트의 모든 도커 컨테이너를 쉽게 관리할 수 있는 방법으로, 버전을 매핑하고 서로 다른 컨테이너를 연결하여 함께 작동할 수 있습니다.
문서는 도커의 문서보다 이해하기가 매우 간단합니다.
베스트
비슷한 문제(그리고 도커 파일만으로는 해결할 수 없는 문제)가 저를 이 페이지로 데려왔습니다.
0단계: 모두에게 도커 파일이 이 문제를 해결할 수 있기를 바랍니다. --dns 및 --dns-search가 도커 파일 지원에 나타날 때까지 인트라넷 기반 리소스를 에 통합할 방법이 없습니다.
1단계: 도커 파일을 사용하여 이미지를 구축한 후(그러나 심각한 결함인 도커 파일은 현재 폴더에 있어야 함) 도커 실행 스크립트를 실행하여 인트라넷 기반을 배포할 이미지를 가집니다.예: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"
2단계: 도커 실행 스크립트를 데몬 모드에서 적용하여 로컬 DNS 레코드를 다운로드하고 배포할 수 있는 기능을 제공합니다.
중요한 점: 스크립트 실행은 다음과 같은 것으로 끝나야 합니다./usr/bin/sudo -u ${USERNAME} bash --norc
설치 스크립트가 완료된 후에도 컨테이너를 계속 실행할 수 있습니다.
아니요, 컨테이너를 전체 자동화 문제에 대해 대화형 모드로 실행할 수 없습니다. 컨테이너는 CTRL-p CTRL-q를 누를 때까지 내부에 남아 있기 때문입니다.
아니요. 설치 스크립트가 끝날 때 대화형 bash가 실행되지 않으면 스크립트 실행이 완료된 후 즉시 컨테이너가 종료되어 모든 설치 결과가 손실됩니다.
3단계: 컨테이너가 여전히 백그라운드에서 실행되고 있지만 컨테이너가 설치 절차를 종료했는지 여부는 불분명합니다.실행 절차 완료를 결정하기 위해 다음 블록을 사용합니다. while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done
설치가 완료된 후에만 스크립트가 추가로 진행됩니다.지금이 바로 호출할 적기입니다. 커밋을 통해 현재 컨테이너 ID와 대상 이미지 이름을 제공합니다(빌드/실행 절차와 동일하지만 로컬 설치 목적 태그가 추가될 수 있습니다).예:docker commit containerID pack/bsp:toolchained
올바른 컨테이너 ID를 가져오는 방법은 이 링크를 참조하십시오.
4단계: 컨테이너가 로컬 설치로 업데이트되고 새로 할당된 이미지(목적 태그가 추가된 이미지)에 커밋되었습니다.이제 컨테이너 작동을 중지하는 것이 안전합니다.예:docker stop packbsp-cont
5단계: 로컬 설치가 있는 컨테이너를 실행해야 할 때마다 이전에 저장한 이미지로 시작합니다.예:docker run -d -t pack/bsp:toolchained
여기서 훌륭한 답변 사용자 kgs에서 종료되는 도커를 계속하는 방법.
docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)
docker exec -it <container-id> /bin/bash
그 두 번째 줄이 중요합니다.soexec은 이미지가 아닌 컨테이너 ID에서 실행 대신 사용됩니다.그리고 용기가 시작된 후에 수행합니다.
이 설계 선택의 요점을 설명하는 답변은 없습니다.도커는 다음 두 가지 오류를 방지하기 위해 이러한 방식으로 작동한다고 생각합니다.
- 반복적인 경우
- 부분 오차
언급URL : https://stackoverflow.com/questions/19585028/i-lose-my-data-when-the-container-exits
'programing' 카테고리의 다른 글
angular2에서 data-* 속성에 바인딩하는 방법은 무엇입니까? (0) | 2023.08.08 |
---|---|
공급자가 Oracle을 사용할 때 Oracle 클라이언트 버전 오류와 호환되지 않습니다.데이터 클라이언트 (0) | 2023.08.08 |
Android: 프로그래밍 방식으로 보기 스타일 설정 (0) | 2023.08.08 |
테이블에서 두 개의 날짜 시간을 요청하지만 하나만 받는 경우 (0) | 2023.08.08 |
nginx 502 잘못된 게이트웨이 (0) | 2023.08.08 |