web-dev-qa-db-ja.com

Docker Desktopでのデータボリュームの特定(Windows)

現在、Dockerを学習しようとしていますが、データボリュームが実際に存在する場所について混乱しています。

私はDocker Desktop for Windowsを使用しています。 (ウインドウズ10)

ドキュメントでは、オブジェクトでdocker inspectを実行するとソースが提供されると彼らは言っています: https://docs.docker.com/engine/tutorials/dockervolumes/#locating-a-volume

$ docker inspect web

"Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/webapp",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

しかし、私はこれを見ていない、私は次を得る:

$ docker inspect blog_postgres-data
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/blog_postgres-data/_data",
        "Name": "blog_postgres-data",
        "Options": {},
        "Scope": "local"
    }
]

誰も私を助けることができますか?自分のデータボリュームが実際にどこにあるかを知りたいのは、ホストマシン上ですか?もしそうなら、どうすればそれへのパスを取得できますか?

33
Brad

ボリュームディレクトリは/var/lib/docker/volumes/blog_postgres-data/_dataであり、/var/lib/dockerは通常C:\Users\Public\Documents\Hyper-V\Virtual hard disksにマウントされています。とにかく、Docker設定を調べることで確認できます。

WindowsでDockerとドライブを共有する方法については、 これらのドキュメント を参照してください。

ところで、次の出力では、Sourceはホスト上の場所であり、Destinationはコンテナ内の場所です。

"Mounts": [
{
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
}
]

================================================== =========================

コメントの質問に答えるように更新されました。

ここでの私の好奇心は、画像などの共有が素晴らしいことですが、どのようにデータを共有しますか?

実際、volumeはこの目的のために設計されています(Dockerコンテナのデータを管理します)。ボリューム内のデータはホスト上に保持されますFS= Dockerコンテナー/イメージのライフサイクルから分離されます。ボリューム内のデータを共有するには、次のようにします。

  • Dockerボリュームをホストにマウントして再利用する

    docker run -v /path/on/Host:/path/inside/container image

    その後、すべてのデータは/path/on/Hostに保持されます。バックアップして別のマシンにコピーし、同じボリュームでコンテナを再実行できます。

  • データコンテナを作成してマウントします。

    データコンテナを作成します:docker create -v /dbdata --name dbstore training/postgres /bin/true

    --volumes-fromdocker run -d --volumes-from dbstore --name db1 training/postgresを使用してこのコンテナに基づいて他のコンテナを実行すると、db1によって生成されたすべてのデータがコンテナdbstoreのボリュームに保持されます。

詳細については、 公式Dockerボリュームドキュメント を参照してください。

簡単に言えば、volumesはホスト上のすべてのコンテナデータを含むディレクトリであるため、以前に使用した任意の方法を使用してデータをバックアップ/共有できます。

画像のようにボリュームをdocker-hubにプッシュできますか?

いいえ。Dockerimageは、Dockerハブ(別名「レジストリ」)にプッシュできるものです。しかし、データはそうではありません。任意の方法でデータをバックアップ/永続化/共有できますが、データをDockerレジストリにプッシュして共有することは意味がありません。

バックアップなどはできますか?

はい、上記のように:-)

29
shizhz

NTFSベースのディレクトリのマウントは、私の目的では機能しませんでした(MongoDB-少なくともRedisとCouchDBの場合もそうです):NTFSアクセス許可は、コンテナで実行されているそのようなDBに必要なアクセスを許可しませんでした。以下は、HyperV上の名前付きボリュームのセットアップです。

次のアプローチでは、サービス内でsshサーバーを起動し、docker-compseでセットアップして、自動的に起動し、承認のためにホストとコンテナー間の公開キー暗号化を使用します。このように、データはscpまたはsftpを介してアップロード/ダウンロードできます。

Webapp + mongodbの完全なdocker-compose.ymlと、sshサービスの使用方法に関するドキュメントを以下に示します。

version: '3'
services:
  foo:
    build: .
    image: localhost.localdomain/${repository_name}:${tag}
    container_name: ${container_name}
    ports:
      - "3333:3333"
    links:
      - mongodb-foo
    depends_on:
      - mongodb-foo
      - sshd
    volumes:
      - "${Host_log_directory}:/var/log/app"

  mongodb-foo:
    container_name: mongodb-${repository_name}
    image: "mongo:3.4-jessie"
    volumes:
      - mongodata-foo:/data/db
    expose:
      - '27017'

  #since mongo data on Windows only works within HyperV virtual disk (as of 2019-4-3), the following allows upload/download of mongo data
  #setup: you need to copy your ~/.ssh/id_rsa.pub into $DOCKER_DATA_DIR/.ssh/id_rsa.pub, then run this service again
  #download (all mongo data): scp -r -P 2222 user@localhost:/data/mongodb [target-dir within /c/]
  #upload (all mongo data): scp -r -P 2222 [source-dir within /c/] user@localhost:/data/mongodb
  sshd:
    image: maltyxx/sshd
    volumes:
        - mongodata-foo:/data/mongodb
        - $DOCKER_DATA_DIR/.ssh/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro
    ports:
        - "2222:22"
    command: user::1001

#please note: using a named volume like this for mongo is necessary on Windows rather than mounting an NTFS directory.
#mongodb (and probably most other databases) are not compatible with windows native data directories due ot permissions issues.
#this means that there is no direct access to this data, it needs to be dumped elsewhere if you want to reimport something.
#it will however be persisted as long as you don't delete the HyperV virtual drive that docker Host is using.
#on Linux and Docker for Mac it is not an issue, named volumes are directly accessible from Host.
volumes:
  mongodata-foo:

これは無関係ですが、完全に機能する例では、docker-composeを呼び出す前に次のスクリプトを実行する必要があります。

#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset

working_directory="$(pwd)"
Host_repo_dir="${working_directory}"
repository_name="$(basename ${working_directory})"
branch_name="$(git rev-parse --abbrev-ref HEAD)"
container_name="${repository_name}-${branch_name}"
Host_log_directory="${DOCKER_DATA_DIR}/log/${repository_name}"
tag="${branch_name}"

export Host_repo_dir
export repository_name
export container_name
export tag
export Host_log_directory

Update:最近では docker cp を使用することもできるため、上記のsshdコンテナはおそらくもう必要ないことに注意してください、ただし、Windowsホスト下のコンテナで実行されているファイルシステムへのリモートアクセスが必要な場合を除きます。

1
Michel Müller