programing

컨테이너가 종료되면 데이터가 손실됩니다.

testmans 2023. 8. 8. 20:07
반응형

컨테이너가 종료되면 데이터가 손실됩니다.

도커의 대화형 튜토리얼 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

컨테이너 데이터를 유지하는 방법은 다음과 같습니다.

  1. 도커 볼륨

  2. 도커 커밋

    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

질문에 대한 위의 답변은 정말 훌륭합니다.다른 답변이 필요 없을 수도 있지만, 저는 여전히 가능한 한 간단한 말로 그 주제에 대한 개인적인 의견을 말하고 싶습니다.

다음은 컨테이너 및 이미지에 대한 몇 가지 요점으로, 결론을 내리는 데 도움이 될 것입니다.

  • 도커 이미지는 다음과 같습니다.
    1. 천부적으로 만들어진
    2. 삭제된
    3. 컨테이너 수에 제한 없이 생성하는 데 사용되는
  • 도커 컨테이너는 다음과 같습니다.
    1. 이미지에서 생성된
    2. 시작된
    3. 멈춘
    4. 재가동된
    5. 삭제된
    6. 임의의 수의 데이터를 생성하는 데 사용되는
  • 도커 실행 명령은 다음을 수행합니다.
    1. 이미지를 다운로드하거나 캐시된 이미지를 사용합니다.
    2. 새 컨테이너를 만듭니다.
    3. 컨테이너를 시작합니다.
  • 도커 파일을 사용하여 이미지를 생성하는 경우:
    1. 이미지가 결국 도커 컨테이너를 실행하는 데 사용될 것이라는 것은 이미 잘 알려져 있습니다.
    2. 도커 빌드 명령을 실행한 후 도커 비하인드는 기본 파일 시스템으로 실행 중인 컨테이너를 만들고 도커 파일 내부의 단계에 따라 개발자의 필요에 따라 컨테이너를 구성합니다.
    3. 컨테이너가 도커 파일의 사양으로 구성되면 이미지로 커밋됩니다.
    4. 이미지가 로큰롤할 준비가 됩니다!

결론:

보다시피 도커 컨테이너는 도커 이미지와 독립적입니다.

컨테이너의 고유 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

반응형