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

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

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

나는 즉시 Java와 다른 도구를 설치하기 시작했고, 시간을 보내고 컨테이너를 중지했습니다.

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/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash

문제가 없으면 이전 컨테이너를 중지하고이 새 컨테이너를 사용하십시오.

그게 다야 🙂


답변

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

컨테이너와 로컬 파일 시스템간에 파일 / 폴더를 복사하십시오.

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이전 버전의 docker 일 수 있음).

  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에서 작동합니다.


답변

Jérôme Petazzoni볼륨이 실행되는 동안 볼륨을 컨테이너연결하는 방법에 대한 흥미로운 블로그 게시물을 가지고 있습니다. 이것은 Docker에 기본 제공되는 것이 아니라 달성 할 수있는 것입니다.

그가 지적한대로

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

/ proc / mounts가 블록 장치 노드를 올바르게 나열하는 경우에만 작동합니다 (위에서 보았 듯이 반드시 해당되는 것은 아님).

또한 로컬 환경에서만 테스트했습니다. 클라우드 인스턴스 또는 그와 비슷한 것을 시도조차하지 않았습니다.

YMMV


답변

불행히도 볼륨을 마운트하기위한 스위치 옵션은 run명령 에서만 찾을 수 있습니다.

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

답변

오랫동안이 문제를 찾아야 한 후 Docker Windows 컨테이너를 사용하기위한 참고 사항!

콘도 :

  • 윈도우 10
  • Docker Desktop (최신 버전)
  • 이미지 Microsoft / mssql-server-windows-developer에 Docker Windows 컨테이너 사용

문제:

  • 호스트 사전을 Windows 컨테이너에 마운트하고 싶었습니다.

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

  • 도커 컨테이너 만들기

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 windows 컨테이너 에서이 문제를 해결했습니다.


답변

가장 좋은 방법은 다음 방법으로 로컬 파일 시스템의 디렉토리에있는 모든 파일과 폴더를 복사하는 것입니다. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATH컨테이너
DEST_PATH에 localhost에

그런 다음 docker-compose down동일한 볼륨을 연결하고 다음 DEST_PATH을 사용하여 Docker 컨테이너를 실행하십시오.docker-compose up -d

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

volumes:
 - DEST_PATH:SRC_PATH