도커 이미지 설치 디렉토리를 변경하는 방법은 무엇입니까?


183

내가 알 수 /var/lib/docker있듯이 , docker 이미지 는 당겨질 때 설치됩니다 . ?와 같은 마운트 된 볼륨과 같이이 위치를 변경하는 방법이 /mnt있습니까?


3
도 커가 어떤 운영 체제에서 실행되고 있습니까?
Thomasleveil

답변:


135

Docker의 최신 버전에서는 https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file 에 따라 data-root매개 변수 값 을 사용자 정의 경로로 설정합니다 ./etc/docker/daemon.json

이전 버전에서는 -gDocker 데몬을 시작할 때 옵션을 사용하여 Docker의 스토리지 기본 디렉토리 (컨테이너 및 이미지가있는 위치)를 변경할 수 있습니다 . (확인 docker --help). Docker가 시작될 때 / etc / default / docker 에 추가하여이 설정을 자동으로 적용 할 수 있습니다.


4
가장 좋은 해결책은 -gUpstart 파일을 수정하는 대신 이 옵션을 / etc / defaults / docker에 추가하는 것입니다. 내 대답을 참조하십시오.
mbarthelemy

9
예,이 줄을DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy로

6
Fedora에서는 작동하지 않습니다. 배포판이 Fedora 인 경우 내 답변을보십시오
Vitor

3
docker가 파일을 무시하면 일부 Debian 또는 Ubuntu 버전의 버그에 대해이 솔루션 을 구현해야 할 수도 있습니다 /etc/default/docker.
nedim

4
graphdaemon.json 의 속성은 v17.05.0부터 사용되지 않으며 data-root대신 cf를 사용하십시오. stackoverflow.com/a/50217666/743507
dschulten

141

의견의 조언에 따라 Docker 시스템 설명서 를 사용 하여이 답변을 향상시킵니다. 아래 절차는 재부팅이 필요하지 않으며 훨씬 깨끗합니다.

먼저 사용자 정의 구성을위한 디렉토리 및 파일을 작성하십시오.

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

17.06-ce 붙여 넣기 이전의 도커 버전 :

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

17.06-ce 페이스트 도커의 경우 :

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

를 통한 대체 방법 daemon.json

최근 에 Fedora 25에서 17.09-ce로 위의 절차를 시도했지만 작동하지 않는 것 같습니다. 그 간단한 수정 대신 /etc/docker/daemon.json트릭 을 수행하십시오.

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

방법에도 불구하고 구성을 다시로드하고 Docker를 다시 시작해야합니다.

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker가 재구성되었는지 확인하려면 다음을 수행하십시오.

docker info|grep "loop file"

최신 버전 (17.03)에서는 다른 명령이 필요합니다.

docker info|grep "Docker Root Dir"

출력은 다음과 같아야합니다.

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

또는:

 Docker Root Dir: /mnt

그런 다음 이전 Docker 저장소를 안전하게 제거 할 수 있습니다.

rm -rf /var/lib/docker

8
우분투 16.04에서 나를 도운 유일한 방법입니다!
Vadim

1
이 링크 docs.docker.com/engine/admin/systemd 는 Ubuntu 16.04와 같은 최신 Linux 배포판에서 작동하는 systemd로 Docker를 구성하는 방법을 설명합니다.
Joseph Hui

6
docker info문은 아마 오래된됩니다. Ubuntu 16.04에서 재구성 확인은 sudo docker info | grep "Docker Root Dir"입니다. ) 그렇지 않으면, 좋은 답변은 허용 하나 여야합니다
기욤 PERROT

5
Linux (4.10) 및 Docker (docker-ce 17.06)의 새 버전에서는 줄을 다음과 같이 변경해야합니다. / usr / bin / dockerd -H fd : // --data-root = "/ mnt"
lorenzo-bettini

2
당신이 볼 경우 Docker Root Dir: /"/mnt"당신이 실행될 때 docker info|grep "Docker Root Dir", 당신은 교체해야 --data-root="/mnt"으로 --data-root=/mnt파일 내부docker-storage.conf
빼앗아

62

새로운 도커 버전의 경우 v17.05.0에서 더 이상 사용되지 않는 data-root것처럼 graph사용해야합니다 : 공식 사용되지 않는 문서

편집하고 /etc/docker/daemon.json(존재하지 않는 경우 작성) 다음을 포함하십시오.

{
  "data-root": "/new/path/to/docker-data"
}

그런 다음 Docker를 다음과 같이 다시 시작하십시오.

sudo systemctl daemon-reload
sudo systemctl restart docker
  • data-root 와 함께 Docker Storage를 사용하는 자세한 단계별 설명 (데이터 이동 포함) 은 블로그 게시물 에서 찾을 수 있습니다.
  • 윈도우 유사한 게시물의 경우 윈도우의 특정

귀하의 의견이이 페이지를 찾는 데 도움이되었습니다 : adriel.co.nz/blog/2018/01/25/… 감사합니다!
nasatome

8
현재 버전에서 작동하고 있기 때문에이 답변에 "허용 된"플래그를 부여 할 때가되었다고 생각합니다.
Bndr

github.com/docker/docker.github.io/pull/5978 출시 후 사람들이 어떤 버전을 사용할 수 있는지 알려주기 위해 여기에 의견을 달았습니다 .officail 웹 사이트가 변경되었습니다.
zhongjiajie

감사합니다 :)
Aashay Amballi

39

Fedora 에서이 작업을 수행하는 올바른 지침을 찾지 못했기 때문에 (편집 : CentOS 및 Suse에서도 작동해야한다는 의견을 지적한 사람들) (/ etc / default / docker는 사용되지 않음) 여기에 대답하십시오 :

/ etc / sysconfig / docker 를 편집 하고 OPTIONS 변수에 -g 옵션을 추가해야합니다. 옵션이 둘 이상인 경우 ""로 묶어야합니다. 필자의 경우 해당 파일에는 다음이 포함되어 있습니다.

OPTIONS=--selinux-enabled

그래서 그것은 될 것입니다

OPTIONS="--selinux-enabled -g /mnt"

다시 시작한 후 ( systemctl restart docker) Docker는 새 디렉토리를 사용해야합니다


CentOS 6.5 / 6.6 및 7에서 동일한 / etc / sysconfig / docker 파일을 사용하지만 변수 이름 other_args에 인수를 추가합니다.
dlaidlaw

옵션은 이제 DOCKER_OPTS (도커 버전 1.7.0)입니다.
nedim

6
Docker 버전 1.8부터는 / etc / sysconfig의 Docker 구성 파일 사용이 더 이상 사용되지 않습니다. 대신 etc / systemd / system / docker.service.d의 시스템 드롭 인 구성 파일을 사용해야합니다. docker 서비스가 실행되는 동안 드롭 인 파일을 추가하거나 수정 한 후 systemctl daemon-reload 명령을 실행하여 systemd에게 서비스 구성을 다시로드하도록 지시하십시오. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia


23

도커 폴더를 / mnt로 이동하기 위해 심볼릭 링크를 사용하지 마십시오 (예 :). docker rm 명령 에 문제가 발생할 수 있습니다 .

도커에는 -g 옵션을 사용하는 것이 좋습니다. 우분투에서는 /etc/default/docker.io에서 영구적으로 설정할 수 있습니다. DOCKER_OPTS 라인을 향상 시키거나 교체하십시오.

예를 들면 다음과 같습니다.`DOCKER_OPTS = "-g / mnt / somewhere / else / docker /"


내 경우에는 다시 시작했다
psychok7

1
docker rm심볼릭 링크를 사용할 때 어떤 종류의 문제가 발생합니까 ?
bjhend

1
나는 또한 이것을 작동시키기 위해 Ubuntu 16.04 stackoverflow.com/a/30219552/977622 에서 이것을해야했다
psychok7

21

훨씬 쉬운 방법 :

도커 서비스 중지

sudo systemctl stop docker

기존 도커 디렉토리를 새 위치로 이동

sudo mv /var/lib/docker/ /path/to/new/docker/

심볼릭 링크 만들기

sudo ln -s /path/to/new/docker/ /var/lib/docker

도커 서비스 시작

sudo systemctl start docker

2
이것은 IMO가 옳고 가장 간단한 솔루션입니다.
Martin Dvorak

2
나를 위해 매력처럼 일했지만 상징적 링크 명령에 대한 슬래시없이 :sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

이것이 docker forums가 제안하는 것입니다 : forums.docker.com/t/…
headdab

이것은 내 인생을 구한 멋진 솔루션입니다. :)
Niketh Sudhakaran

나는 위에서 처형했으며도 커가 작동 중입니다. 그러나 도커 이미지가 이미 존재하지 않습니다. 어떤 제안?
Thilina Viraj

13

이 솔루션은 Red Hat 7.2 및 Docker 1.12.0 에서 작동합니다

텍스트 편집기에서 /lib/systemd/system/docker.service 파일을 편집하십시오 .

추가 -g / 경로 /로 / 고정 표시기 /를 의 말에 ExecStart의 지시어. 완전한 줄은 다음과 같아야합니다.

ExecStart=/usr/bin/dockerd -g /path/to/docker/

아래 명령을 실행

systemctl daemon-reload
systemctl restart docker

docker directory를 확인하는 명령을 실행하십시오.

docker info | grep "loop file\|Dir"

당신이있는 경우 / 등은 / SYSCONFIG / 고정 표시기 레드햇에서 파일이나 고정 표시기 1.7.1 확인 대답을.


내 경우 : centos7, 최신 도커; "docker.service"파일을 찾기 위해 "systemctl status docker"를 호출하고 답과 같이 "-g"옵션을 추가했습니다. 감사합니다
datdinhquoc

13

승자 답변의 복사하여 붙여 넣기 버전 :)

이 컨텐츠만으로이 파일을 작성하십시오.

$ sudo vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

Ubuntu 16.04.2 LTS도커에서 테스트1.12.6


1
graphdaemon.json 의 속성은 v17.05.0부터 사용되지 않으며 data-root대신 cf를 사용하십시오. stackoverflow.com/a/50217666/743507
dschulten

12

CentOS 6.5에서

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

다음 줄 추가

other_args=" -g /data/docker -p /var/run/docker.pid"

그런 다음 파일을 저장하고 docker를 다시 시작하십시오.

service docker start

리포지토리 파일을 /data/docker


6

데비안 / 우분투 또는 페도라의 경우 다른 답변을 사용할 수 있습니다. 그러나 /etc/default/docker또는 아래에 파일이없고 /etc/sysconfig/docker시스템이 systemd를 실행중인 경우 h3nrik의이 답변 을 따르고 싶을 수 있습니다. . 나는 아치를 사용하고 있으며 이것은 나를 위해 작동합니다.

기본적으로, 새로운 docker 이미지 위치를 환경 변수로 읽고 해당 환경 변수를 Docker 데몬 실행 스크립트로 전달하도록 systemd를 구성해야합니다.

완성도를 높이기 위해 h3nrick의 답변은 다음과 같습니다.


당신은 /lib/systemd/system/docker.service 파일을?

그렇다면 Docker 서비스가 평소 /etc/default/docker를 환경 파일로 사용하도록 편집 하십시오.EnvironmentFile=-/etc/default/docker .

에서 /etc/default/docker파일 다음 추가DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images" .

결국에는 그냥 systemctl daemon-reload && systemctl restart docker .

자세한 내용은 설명서를 참조하십시오 .


데비안에 대한 현재 docker 설치 지침을 따르면 SysVinit 스크립트가 사용되지만 사용되지는 않습니다. 참조 github.com/docker/docker/issues/9889#issuecomment-109766580
시몬 우드 사이드에게

4

훨씬 간단한 해결책은 다음과 같이 원하는 곳에 소프트 링크 포인트를 만드는 것입니다.

link -s /var/lib/docker /mnt/whatever

CentOS 6.5 서버에서 작동합니다.


6
소프트 링크를 만들지 마십시오. 이유는 내가 전에 게시 한 내 의견을 참조하십시오 ... 'docker rm'명령에 문제가있을 수 있습니다!
suther

2
@suther : 5 월? 지금 당신이 곤경에 처한 상황이 있습니까? 기술 문서에 대해서는 다소 부정확 할 수 있습니다. 문제가 발생하면 정확히 언제 발생하는지, 문제가 어떻게 발생하는지, 결과가 어떻게 발생하는지 배우고 싶습니다.
hakre

4

@mbarthelemy가 추천 한 것처럼 -gdocker 데몬을 직접 시작할 때 옵션을 통해 수행 할 수 있습니다 .

그러나도 커가 시스템 서비스로 시작된 경우 /etc/default/docker파일 을 수정하지 않는 것이 좋습니다 . 이 위치에 대한 가이드 라인이 여기가 .

올바른 접근 방법은 /etc/docker/daemon.jsonLinux (또는 Mac) 시스템 또는 %programdata%\docker\config\daemon.jsonWindows 에서 파일 을 작성하는 것 입니다. 이 파일을 다른 용도로 사용하지 않는 경우 다음 필드로 충분합니다.

{
    "graph": "/docker/daemon_files"
}

이것은 docker가 데이터를 유지하려는 새 위치가 있다고 가정합니다. /docker/daemon_files


2

오픈 수 세리프 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

DOCKER_OPTS는 처음에 비어 있었고 Docker가 새 디렉토리를 사용하도록 인수에 추가 한 모든 것입니다.


2

Fedora 26 및 기타 여러 버전에서 위에서 설명한대로 기본 폴더 위치를 이동 한 후 오류가 발생할 수 있습니다. / home 아래로 이동하는 경우 특히 그렇습니다. SeLinux가 시작되어 도커 컨테이너가이 위치에서 많은 프로그램을 실행하지 못하기 때문입니다.

짧은 해결책은 -g 매개 변수를 추가 할 때 --enable-selinux 옵션을 제거하는 것입니다.


공격을위한 열린 공간이 아니겠습니까?
yuriploc

1

AWS Ubuntu 16.04 서버에서 Docker 이미지를 / home / ubuntu / kaggle /의 docker dir 아래에 마운트 된 별도의 EBS에 배치했습니다.

이 초기화 스크립트 스 니펫이 올바르게 작동했습니다.

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see /programming/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them

0

17.06.0-ce-mac19 버전의 Mac 사용자의 경우 환경 설정 옵션의 사용자 인터페이스에서 디스크 이미지 위치를 간단히 이동할 수 있습니다. 디스크 이미지의 위치를 ​​변경하면 디스크 이미지 이동 을 클릭 하고 다시 시작 하여 작동합니다. 도커. 이 접근법을 사용하여 외부 도크를 사용하여 도커 이미지를 저장할 수있었습니다.


도커의 기존 파일은 어떻습니까? 수동으로 움직여야합니까?
구스타프

원하는 위치에 도커를 다시 설치할 수 있습니다. 이미지 및 도커 파일은 독립적입니다.
sahu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.