Docker では、データ ボリュームは 1 つ以上のコンテナで使用できるホスト上の特別なディレクトリです。コンテナ間で共有および再利用できます。ローカルとコンテナの間でデータを転送する方が効率的です。ボリュームへの変更はすぐに有効になり、データ ボリュームはコンテナ内とローカル ディレクトリの両方で変更できます。
このチュートリアルの動作環境: linux5.9.8 システム、docker-1.13.1 バージョン、Dell G3 コンピューター。
Docker データ ボリュームとは何ですか?
データ ボリューム (データ ボリューム) は、ホスト内のディレクトリまたはファイルです。データ ボリューム データの永続性であり、コンテナのライフサイクルから完全に独立しているため、コンテナが削除されても、Docker はマウントされたデータ ボリュームを削除しません。コンテナ ディレクトリとデータ ボリューム ディレクトリをバインドすると、互いの変更はすぐに同期され、1 つのデータ ボリュームを複数のコンテナで同時にマウントしたり、1 つのコンテナに複数のデータ ボリュームをマウントしたりすることもできます。
データ ボリュームの機能
データ ボリュームはコンテナ間で共有および再利用でき、ローカルとコンテナ間のデータ転送がより効率的になります
データ ボリュームへの変更はすぐに有効になります。データ ボリュームはコンテナ内またはローカル ディレクトリで変更できます。
データ ボリュームの更新イメージには影響せず、データとアプリケーションを切り離します
コンテナが使用されなくなるまで、ボリュームは常に存在します
Docker では、データの永続性 (Docker のいわゆるデータの永続性とは、コンテナの終わりでデータが終わらないことを意味します) を実現するために、データは次のことを行う必要があります。ホストからコンテナにマウントされます。現在、Docker は、ホストからコンテナーにデータをマウントする 3 つの異なる方法を提供しています。 (1) ボリューム: Docker は、/var/lib/docker/volumes にあるホスト ファイル システムの一部を管理します。ディレクトリ; (最も一般的に使用される方法)
上の図からわかるように、現在、すべてのコンテナ データはこのディレクトリに保存されています。作成時にボリュームが指定されていないため、Docker はデフォルトで多数の匿名 (上記の長い ID 名の集まりだけ) ボリュームを作成するのに役立ちます。
(2) バインド マウント: ホスト システムの任意の場所に保存できることを意味します; (
一般的に使用される方法)
ただし、バインド マウントは別の場所にあります。ホスト システムは移植可能ではありません。たとえば、Windows と Linux のディレクトリ構造は異なり、バインド マウントが指すホスト ディレクトリを同じにすることはできません。これは、Dockerfile に移植性がないため、バインド マウントを Dockerfile に含めることができない理由でもあります。 (3) tmpfs: マウントはホスト システムのメモリに保存され、ホストのファイル システムには書き込まれません; (
一般的には使用されない方法)
3 つの方法の概略図は次のとおりです:
2. Volume の基本的な使用方法
# docker volume create edc-nginx-vol // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息
2.2 指定したボリュームを使用してコンテナを作成する
カスタム コンテナ ボリュームを使用すると、このデータ ボリュームを使用してコンテナを作成できます。例: # docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/
-v が指定されていない場合、Docker はデフォルトでマッピングとマウント用の匿名データ ボリュームの作成を支援します。
コンテナを作成した後、コンテナに入って見てみましょう:
デフォルトのページが 2 つあることがわかります。新しい SSH を開始します。 ホストに接続し、作成したばかりのデータ ボリュームの内部を確認します。
可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。
这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。
由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。
此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。
2.3 清理卷
如果不再使用自定义数据卷了,那么可以手动清理掉:
# docker stop edc-nginx // 暂停容器实例 # docker rm edc-nginx // 移除容器实例 # docker volume rm edc-nginx-vol // 删除自定义数据卷
3.1 使用卷创建一个容器
docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx
这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
这时我们再次进入容器内部看看:
可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。
但是,我们可以将宿主机上的文件随时挂载到容器中:
Step1.新建一个index.html
Step2.在容器中查看
3.2 验证绑定
docker inspect edc-nginx
通过上述命令可以看到一大波配置,我们要关注的是:
3.3 清理
docker stop edc-nginx docker rm edc-nginx
同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。
3.4 应用案例
在服务治理组件中,服务发现组件是一个最常用的组件之一,Consul是一个流行的服务发现开源项目,Consul推荐我们使用配置文件的方式注册服务信息。因此,我们常常会将填写好服务注册配置文件放在宿主机的一个文件目录下将其挂载到Consul的容器指定目录下,如下所示:
docker run -d -p : --restart=always \ -v /XiLife/consul/data/server1:/consul/data -v /XiLife/consul/conf/server1:/consul/config \ -e CONSUL_BIND_INTERFACE= --privileged= \ --name=consul_server_1 consul:. agent -server -bootstrap-expect= -ui -node=consul_server_1 -client= \ -data- /consul/data -config- /consul/config -datacenter=xdp_dc;
可以看到,我们通过Bind Mounts的方式将宿主机上的/XiLife/consul/data/server1目录挂载到了容器的/consul/data目录下,还将/XiLife/consul/conf/server1目录挂载到了容器的/consul/config目录下,而容器下的两个目录/consul/data和/consul/config则是我们指定的存放agent数据和配置文件的地方。因此,宿主机上的配置文件的变化会及时反映到容器中,比如我们在宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:
docker exec consul-server consul reload
*.这里的consul-server是容器的名字,consul reload是重新加载的命令(非restart)。
推荐学习:《docker视频教程》
以上がDocker データ ボリュームとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。