現在、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"
}
]
誰も私を助けることができますか?自分のデータボリュームが実際にどこにあるかを知りたいのは、ホストマシン上ですか?もしそうなら、どうすればそれへのパスを取得できますか?
ボリュームディレクトリは/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-from
:docker run -d --volumes-from dbstore --name db1 training/postgres
を使用してこのコンテナに基づいて他のコンテナを実行すると、db1
によって生成されたすべてのデータがコンテナdbstore
のボリュームに保持されます。
詳細については、 公式Dockerボリュームドキュメント を参照してください。
簡単に言えば、volumes
はホスト上のすべてのコンテナデータを含むディレクトリであるため、以前に使用した任意の方法を使用してデータをバックアップ/共有できます。
画像のようにボリュームをdocker-hubにプッシュできますか?
いいえ。Dockerimageは、Dockerハブ(別名「レジストリ」)にプッシュできるものです。しかし、データはそうではありません。任意の方法でデータをバックアップ/永続化/共有できますが、データをDockerレジストリにプッシュして共有することは意味がありません。
バックアップなどはできますか?
はい、上記のように:-)
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ホスト下のコンテナで実行されているファイルシステムへのリモートアクセスが必要な場合を除きます。