Dockerイメージのインストールディレクトリを変更するにはどうすればよいですか?


183

私が知ることができることから、ドッカーのイメージは、/var/lib/dockerプルされるときににインストールされます。などのマウントされたボリュームなど、この場所を変更する方法はあり/mntますか?


3
ドッカーはどのオペレーティングシステムで実行されていますか?
Thomasleveil 2014年

回答:


135

Dockerの最近のバージョンでは、data-rootパラメーターの値を/etc/docker/daemon.jsonhttps://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-fileに従って)カスタムパスに設定します)。

古いバージョンでは-g、Dockerデーモンの起動時にオプションを使用して、Dockerのストレージベースディレクトリ(コンテナーとイメージが配置される場所)を変更できます。(チェックdocker --help)。/ etc / default / dockerに追加することで、Dockerの起動時にこの設定を自動的に適用できます


4
最善の解決策は-g、Upstartファイルを変更する代わりに、/ etc / defaults / dockerにこのオプションを追加することだと思います。私の回答を参照してください。
mbarthelemy 2014年

9
はい、この行をDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy 2014年

6
Fedoraでは機能しません。あなたのディストリビューションがFedoraである場合は私の回答を参照してください
Vitor 2014年

3
dockerがファイルを無視する場合、DebianまたはUbuntuの一部のバージョンのバグにこのソリューションを実装する必要がある場合があり/etc/default/dockerます。
ニーディム2015

4
graphdaemon.json の属性はv17.05.0で廃止されました。data-root代わりにcfを 使用してください。stackoverflow.com/a/50217666/743507
dschulten

141

コメントからのアドバイスに従って、私はDocker systemdドキュメントを利用してこの回答を改善しています。以下の手順は再起動を必要とせず、よりクリーンです。

最初に、カスタム構成用のディレクトリとファイルを作成します。

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

17.06-ce以前の dockerバージョンの場合:

[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
Ubuntu 16.04で私を助けた唯一の方法です!
Vadim

1
このリンクdocs.docker.com/engine/admin/systemdは、Dockerをsystemdで構成する方法を説明しています。これは、Ubuntu 16.04などの新しいLinuxディストリビューションで機能します。
ジョセフ・ホイ

6
docker info声明は、おそらく時代遅れです。Ubuntu 16.04では、再構成のチェックはsudo docker info | grep "Docker Root Dir"です。それ以外の場合は、良い答えが受け入れられます;)
Guillaume 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
のSer

62

私たちが使用する必要が新しいドッキングウィンドウのバージョンの場合data-rootのようにgraph:v17.05.0で廃止され、公式廃止予定のドキュメント

編集/etc/docker/daemon.json(存在しない場合は作成)して、次を含めます。

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

次に、次のコマンドでDockerを再起動します。

sudo systemctl daemon-reload
sudo systemctl restart docker
  • data-rootで Docker Storageを使用したより詳細なステップバイステップの説明(データの移動を含む)は以下にあります:ブログ投稿
  • Windowsの場合、同様のWindows固有の投稿

あなたのコメントは私がこのページを見つけるのに役立ちました:adriel.co.nz/blog/2018/01/25/… ありがとう!
nasatome

8
現在のバージョンで機能しているので、この回答に「承認済み」フラグを付けるときがきたと思います。
Bndr

github.com/docker/docker.dochub.io/pull/5978のリリース後、公式ウェブサイトが変更されたため、これを使用できるバージョンを人々に知らせるためにここにコメントします。
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、2015年

現在、このオプションはDOCKER_OPTSと呼ばれています(dockerバージョン1.7.0)。
ニーディム2015

6
Dockerのバージョン1.8以降では、/ etc / sysconfig内のDocker構成ファイルの使用は非推奨です。代わりに、etc / systemd / system / docker.service.dにあるsystemdドロップイン構成ファイルを使用する必要があります。dockerサービスの実行中にドロップインファイルを追加または変更した後、コマンドsystemctl daemon-reloadを実行して、systemdにサービスの構成を再読み込みするように指示します。docs.oracle.com/cd/E52668_01/E54669/html/...
パブロ・マリン・ガルシアは、


23

シンボリックリンクを使用してdockerフォルダーを/ mntに移動しないでください(たとえば)。これはdocker rmに問題を引き起こす可能性がありますコマンドます。

dockerには-gオプションを使用することをお勧めします。Ubuntuでは、/ etc / default / docker.ioで永続的に設定できます。DOCKER_OPTS行を拡張または置換します。

ここに例: `DOCKER_OPTS ="-g / mnt / somewhere / else / docker / "


私の場合、私は再起動しなければなり
ませんでした

1
docker rmシンボリックリンクを使用する場合、どのような問題が発生しますか?
bjhend 2016

1
私はまた、中にこれをしなければならなかったUbuntu 16.04 stackoverflow.com/a/30219552/977622仕事にそれを得るために
psychok7

21

そうするためのはるかに簡単な方法:

Dockerサービスを停止する

sudo systemctl stop docker

既存のDockerディレクトリを新しい場所に移動する

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

シンボリックリンクを作成する

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

Dockerサービスを開始する

sudo systemctl start docker

2
これはIMOが適切で最も簡単な解決策です-私にとってはうまくいきました。
Martin Dvorak

2
私にとっては魅力のように機能しましたが、シンボリックリンクコマンドの末尾にスラッシュはありませんでした:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

これは、ドッキングウィンドウフォーラムが示唆するものである:forums.docker.com/t/...
headdab

これは私の命を救った素晴らしいソリューションです。:)
Niketh Sudhakaran

私は上記を実行し、Dockerが稼働していました。しかし、Dockerイメージが既に存在することはわかりません。助言がありますか?
Thilina Viraj

13

このソリューションは、Red Hat 7.2およびDocker 1.12.0で動作します

/lib/systemd/system/docker.serviceファイルを編集します テキストエディターでを。

ExecStartディレクティブの最後に-g / path / to / docker /を追加します。完全な行は次のようになります。

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

以下のコマンドを実行します

systemctl daemon-reload
systemctl restart docker

コマンドを実行してdockerディレクトリを確認します

docker info | grep "loop file\|Dir"

お持ちの場合は/ etc /のsysconfig /ドッキングウィンドウの Red Hatのか、ドッキングウィンドウ1.7.1チェックでファイルをこの答えを。


私の場合:centos7、最新のドッカー。私は「systemctl status docker」を呼び出して「docker.service」ファイルを見つけ、回答のようにオプション「-g」を追加する必要がありました。ありがとう
datdinhquoc 2018

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

Debian / UbuntuまたはFedoraの場合、おそらく他の回答を使用できます。しかし、/etc/default/dockerまたはの下にファイルがなく/etc/sysconfig/docker、システムがsystemdを実行している場合は、h3nrikによるこの回答に従うことをお勧めします。私はArchを使用していますが、これでうまくいきます。

基本的に、新しいdockerイメージの場所を環境変数として読み取るようにsystemdを構成し、その環境変数をDockerデーモン実行スクリプトに渡す必要があります。

完全を期すために、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ます。

詳細については、ドキュメントもご覧ください。


Debianの最新のDockerインストール手順に従うと、SysVinitスクリプトを取得しますが、それらは使用されません。参照してくださいgithub.com/docker/docker/issues/9889#issuecomment-109766580
サイモン・ウッドサイド

4

より簡単な解決策は、次のように、必要なものへのソフトリンクポイントを作成することです。

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

CentOS 6.5サーバーで動作します。


6
ソフトリンクを作成しないでください。以前投稿した私のコメントが表示される理由... 'docker rm'コマンドで問題が発生する可能性があります!
2015年

2
@suther:5月?困ったことはありませんか?5月は技術文書としては少し不正確です。問題が発生した場合、正確にそれがいつ発生し、その問題がどのように発生し、どのような結果になるかを知りたいと思います。
hakre

4

@mbarthelemyで推奨されているように、これはdocker -gデーモンを直接起動するときにオプションを介して実行できます。

ただし、Dockerがシステムサービスとして開始されている場合は、/etc/default/dockerファイルを変更することはお勧めしません。これに関するガイドラインはここにあります

正しい方法は/etc/docker/daemon.json、Linux(またはMac)システムまたは%programdata%\docker\config\daemon.jsonWindowsでファイルを作成することです。このファイルが他の目的で使用されていない場合は、次のフィールドで十分です。

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

これは、Dockerにデータを永続化させる新しい場所を想定しています。 /docker/daemon_files


2

openSUSE Leap 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が起動し、Dockerコンテナーがこの場所から多くのプログラムを実行できないようにするためです。

短い解決策は、-gパラメーターを追加するときに--enable-selinuxオプションを削除することです。


攻撃の余地はありませんか?
yuriploc

1

AWS Ubuntu 16.04サーバーでは、Dockerイメージを/ home / ubuntu / kaggle /にマウントされた別のEBSのdocker dirの下に置きました

この初期化スクリプトのスニペットは正しく機能しました

# 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ユーザーの場合、設定オプションのユーザーインターフェイスからディスクイメージの場所を移動するだけです。ディスクイメージの場所を変更するだけで機能します([ ディスクイメージの移動 ]をクリックして)、再起動します。ドッカー。このアプローチを使用して、Dockerイメージを格納するために外部hardiskを使用することができました。


ドッカーの既存のファイルはどうですか?手動で移動する必要がありますか?
gustav

お好みの場所にdockerを再インストールしてみてください。画像とDockerファイルは独立しています。
サフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.