programing

기존 도커 컨테이너에 볼륨을 추가하려면 어떻게 해야 합니까?

minimums 2023. 8. 26. 10:40
반응형

기존 도커 컨테이너에 볼륨을 추가하려면 어떻게 해야 합니까?

Ubuntu에 Docker를 설치하고 다음 작업을 수행하여 만든 Docker 컨테이너가 있습니다.

sudo docker run -i -t ubuntu /bin/bash

나는 즉시 자바와 다른 도구들을 설치하기 시작했고, 그것과 함께 시간을 보냈고, 컨테이너를 멈추었습니다.

exit

그리고 나서 저는 볼륨을 추가하고 싶었고 이것이 제가 생각했던 것만큼 간단하지 않다는 것을 깨달았습니다.사용할 경우sudo docker -v /somedir run ...그러면 새로운 컨테이너가 생성되므로 Java를 설치하고 이전에 이미 수행한 작업을 수행하여 마운트된 볼륨의 컨테이너에 도달해야 합니다.

호스트에서 폴더를 마운트하는 방법에 대한 모든 설명서는 컨테이너를 생성할 때 볼륨을 마운트할 수 있음을 암시하는 것으로 보입니다.따라서 새 컨테이너를 처음부터 재구성하지 않으려면 기존 컨테이너를 저장소에 커밋하고 볼륨을 마운트하는 동안 새 컨테이너의 기본으로 사용해야 합니다.

이것이 실제로 기존 컨테이너에 볼륨을 추가하는 유일한 방법입니까?

기존 컨테이너를 커밋한 다음(즉, 컨테이너의 변경 사항으로 새 이미지를 생성) 새 마운트로 실행할 수 있습니다.

예:

$ docker ps  -a

CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                          PORTS               NAMES
5a8f89adeead        ubuntu:14.04          "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       agitated_newton

$ docker commit 5a8f89adeead newimagename
$ docker run -ti -v "$PWD/somedir":/somedir newimagename /bin/bash

문제가 없으면 이전 컨테이너를 중지하고 이 새 컨테이너를 사용합니다.

다음과 같은 이름을 사용하여 컨테이너를 커밋할 수도 있습니다.

docker commit agitated_newton newimagename

바로 그거야 :)

실행 중인 컨테이너에 볼륨을 추가할 수 있는 방법은 없지만 이 목표를 달성하려면 다음 명령을 사용할 수 있습니다.

컨테이너와 로컬 파일 시스템 간에 파일/폴더 복사:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

자세한 내용은 다음을 참조하십시오.

https://docs.docker.com/engine/reference/commandline/cp/

성공적으로 탑재했습니다./home/<user-name>에서 호트의서로 /mnt기존(실행 중이 아닌)의 폴더입니다.이 작업은 다음과 같은 방법으로 수행할 수 있습니다.

  1. 컨테이너에 . 이 은 에서 할 수 ./var/lib/docker/containers/99d...1fb/config.v2.json)config.json이전 버전의 도커의 경우).

  2. » MountPoints 있던 내경우는비있던섹션어:"MountPoints":{}다음으로 내용을 다음과 같은 것으로 바꿉니다(적절한 설정으로 다른 컨테이너에서 적절한 내용을 복사할 수 있습니다).

"MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

또는 동일(아래):

  "MountPoints": {
    "/mnt": {
      "Source": "/home/<user-name>",
      "Destination": "/mnt",
      "RW": true,
      "Name": "",
      "Driver": "",
      "Type": "bind",
      "Propagation": "rprivate",
      "Spec": {
        "Type": "bind",
        "Source": "/home/<user-name>",
        "Target": "/mnt"
      },
      "SkipMountpointCreation": false
    }
  }
  1. 서비스를 합니다.service docker restart

Ubuntu 18.04.1 및 Docker 18.09.0과 함께 사용할 수 있습니다.

제롬 페타조니실행 중인 컨테이너에 볼륨을 부착하는 방법에 대한 꽤 흥미로운 블로그 게시물을 가지고 있습니다.이것은 Docker에 기본으로 제공되는 것이 아니라 실현 가능한 것입니다.

그가 또한 지적했듯이.

이것은 블록 장치를 기반으로 하지 않는 파일 시스템에서는 작동하지 않습니다.

/proc/mounts가 블록 디바이스 노드를 올바르게 나열하는 경우에만 작동합니다(위에서 살펴본 바와 같이 반드시 사실은 아님).

또한 로컬 환경에서만 테스트했습니다. 클라우드 인스턴스 같은 것은 사용하지 않았습니다.

YMMV

스위치 은 불히도마는스옵은션에서만 수 .runcommand

docker run --help

-v, --volume list Bind mount a volume (default [])

그러나 이 문제를 해결할 수 있는 방법이 있으므로 컨테이너에 이미 설정한 응용 프로그램을 다시 설치할 필요가 없습니다.

  1. docker container export -o ./myimage.docker mycontainer
  2. 이미로기오져docker import ./myimage.docker myimage
  3. 그리고나서docker run -i -t -v /somedir --name mycontainer myimage /bin/bash

오랫동안 이 문제를 찾아봐야 했던 도커 Windows 컨테이너 사용에 대한 참고 사항!

조건:

  • 윈도우 10
  • Docker Desktop(최신 버전)
  • 이미지 마이크로소프트/mssql-server-windows-developer에 Docker 윈도우즈 컨테이너 사용

문제:

  • 윈도우 컨테이너에 호스트 사전을 장착하고 싶었습니다.

부분적으로 설명된 솔루션:

  • 도커 컨테이너 생성

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

  • 컨테이너의 명령 셸로 이동

docker exec -it <CONTAINERID> cmd.exe

  • DIR 생성

mkdir DirForMount

  • 정지 용기

docker container stop <CONTAINERID>

  • 컨테이너를 커밋합니다.

docker commit <CONTAINERID> <NEWIMAGENAME>

  • 이전 컨테이너 삭제

docker container rm <CONTAINERID>

  • 새 이미지 및 볼륨 마운트를 사용하여 새 컨테이너 생성

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>

이후 도커 윈도우 컨테이너에서 이 문제를 해결했습니다.

제 대답은 조금 다를 것입니다.컨테이너를 중지하고 볼륨을 추가한 후 다시 시작할 수 있습니다.방법은 다음 단계를 따릅니다.

docker volume create ubuntu-volume
docker stop <container-name>
sudo docker run -i -t --mount source=ubuntu-volume,target=<target-path-in-container> ubuntu /bin/bash 

컨테이너를 중지 및 제거하고 시작 스크립트에 기존 볼륨을 추가한 다음 이미지에서 다시 시작할 수 있습니다.기존 파티션이 데이터를 유지하는 경우 정보가 손실되지 않아야 합니다.또한 Docker 파일 및 Docker 작성기에서도 동일한 방식으로 작동합니다.

예(태양광 이미지).(초기 스크립트)

#!/bin/sh
docker pull solr:8.5
docker stop my_solr
docker rm solr:8.5

docker create \
  --name my_solr \
  -v "/XXXX/docker/solr/solrdata":/var/solr \
  -p 8983:8983 \
  --restart unless-stopped \
  --user 1000:1000 \
  -e SOLR_HEAP=1g \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  solr:8.5
docker cp /home/XXXX/docker/solr/XXXXXXXX.jar my_solr:/opt/solr/contrib/dataimporthandler-extras/lib
docker start my_solr

제2권으로 철하다

#!/bin/sh
docker pull solr:8.5
docker stop my_solr
docker rm solr:8.5

docker create \
  --name my_solr \
  -v "/XXXX/docker/solr/solrdata":/var/solr \
  -v "/XXXX/backups/solr_snapshot_folder":/var/solr_snapshots \
  -p 8983:8983 \
  --restart unless-stopped \
  --user 1000:1000 \
  -e SOLR_HEAP=1g \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  solr:8.5
docker cp /home/XXXX/docker/solr/XXXXXXXX.jar my_solr:/opt/solr/contrib/dataimporthandler-extras/lib
docker start my_solr

이미 마운트된 드라이브에 심볼릭 링크 사용:

ln -s Source_path targer_path_which_is_already_mounted_on_the_running_docker

은 로컬 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATH컨테이너에 있습니다.DEST_PATH로컬 호스트에 있음

그럼 하라docker-compose down같은 책에 책을 첨부합니다.DEST_PATH다음을 사용하여 도커 컨테이너 실행docker-compose up -d

다음을 수행하여 볼륨 추가docker-compose.yml

volumes:
 - DEST_PATH:SRC_PATH

언급URL : https://stackoverflow.com/questions/28302178/how-can-i-add-a-volume-to-an-existing-docker-container

반응형