Docker 構成を使用してデータを保存する (1)
設定について
Docker swarm サービス構成を使用すると、構成ファイルなどの機密情報以外の情報をサービス イメージや実行中のコンテナーの外部に保存できます。これにより、構成ファイルをコンテナーにバインドしたり、環境変数を使用したりせずに、イメージを可能な限り汎用的に保つことができます。
構成はキーと同様に動作しますが、保存時に暗号化されず、RAM ディスクを使用せずにコンテナーのファイル システムに直接マウントされる点が異なります。構成はいつでもサービスに追加またはサービスから削除でき、サービスは構成を共有できます。最大限の柔軟性を実現するために、構成を環境変数またはラベルと組み合わせることもできます。構成値は、一般的な文字列またはバイナリ コンテンツ (最大 500kb のサイズ) にすることができます。
注: Docker 設定は swarm サービスにのみ適用され、スタンドアロン コンテナには適用されません。この機能を使用するには、コンテナーをスケール 1 のサービスとして実行するように調整することを検討してください。
Linux サービスと Windows サービスは両方とも構成をサポートしています。
Docker が構成を管理する方法
クラスターに構成を追加すると、Docker は相互 TLS 接続を介して構成を swarm マネージャーに送信します。設定は暗号化されて Raft ログに保存されます。Raft ログ全体が他のマネージャー間でレプリケートされるため、構成には他の Swarm 管理データと同じ高可用性が保証されます。
新しく作成されたサービスまたは実行中のサービスに構成へのアクセスを許可すると、構成はコンテナー内のファイルとしてマウントされます。Linux コンテナでは、コンテナ内のマウント ポイントの場所はデフォルトで です/<config-name>
。Windows コンテナでは、構成が にマウントされC:\ProgramData\Docker\configs
、希望の場所 (デフォルトは ) へのシンボリックリンクが作成されますC:\<config-name>
。
uid
所有権 (およびgid
)は、数値 ID、またはユーザーまたはグループの名前を使用して構成に設定できます。ファイルのアクセス許可 ( ) を指定することもできますmode
。Windows コンテナの場合、これらの設定は無視されます。
- 設定されていない場合、構成はコンテナ コマンドを実行している
root
ユーザー(通常は ) とそのユーザーのデフォルト グループ (多くの場合はroot
) によって所有されます。 - 如果没有设置,则配置具有世界可读权限(模式
0444
),除非在容器内设置了umask
,在这种情况下,该模式会受到该umask
值的影响。
我们可以随时更新服务,授予其对其他配置的访问权限或撤销对给定配置的访问权限。
只有当节点是集群的管理节点或正在运行已授予配置访问权限的服务任务时,节点才能访问配置。当容器任务停止运行时,与之共享的配置将从该容器的内存文件系统中卸载,并从节点的内存中刷新。
如果节点在运行可以访问配置的任务容器时失去与群的连接,则任务容器仍然可以访问其配置,但在节点重新连接到群之前无法接收更新。
我们可以随时添加或检查单个配置,或列出所有配置。但是无法删除正在运行的服务正在使用的配置。
要更轻松地更新或回滚配置,请考虑在配置名称中添加版本号或日期。由于能够在给定容器中控制配置的挂载点,这变得更加容易。
要更新堆栈,请更改您的Compose文件,然后重新运行docker stack deploy -c <new-compose-file> <stack-name>
。如果在该文件中使用新的配置,集群服务将开始使用它们。
我们可以运行docker stack rm
来停止应用程序并删除堆栈。这将删除由具有相同堆栈名称的docker stack deploy
创建的任何配置。这将删除所有配置,包括服务未引用的配置和docker service update --config-rm
后剩余的配置。
docker config
命令的信息
例子
我们跟着以下的示例来了解配置相关指令,这些示例说明了Docker配置是如何使用的。
在编写文件中定义和使用配置
docker stack
命令支持在Compose文件中定义配置。然而,docker compose
不支持configs
配置。
简单示例:开始配置m
这个简单的示例仅在几个命令中就显示了配置的工作原理。
-
向Docker添加配置。
docker config create
命令读取标准输入,因为最后一个参数(表示要从中读取配置的文件)设置为-
。echo "This is a config" | docker config create my-config -
-
创建一个
redis
服务,并授予它对配置的访问权限。默认情况下,容器可以在/my-config
访问配置,但我们可以使用target
选项自定义容器上的文件名。docker service create --name redis --config my-config redis:alpine
-
使用
docker service ps
验证任务是否正常运行。如果一切正常,输出看起来与此相似:docker service ps redis
-
使用
docker ps
获取redis
服务任务容器的ID,以便您可以使用docker container exec
连接到容器并读取配置文件数据文件的内容,该文件默认为可被所有人读取,并且与配置文件名称相同。下面的第一个命令说明了如何查找容器ID,第二个和第三个命令使用shell完成来自动执行此操作。docker ps --filter name=redis -q docker container exec $(docker ps --filter name=redis -q) ls -l /my-config docker container exec $(docker ps --filter name=redis -q) cat /my-config
-
尝试删除配置。删除失败,因为
redis
服务正在运行并可以访问配置。docker config ls docker config rm my-config
-
通过更新服务,从正在运行的
redis
服务中删除对配置的访问权限。docker service update --config-rm my-config redis
-
再次重复步骤3和4,验证该服务不再有权访问配置。容器ID不同,因为
service update
命令会重新部署服务。$ docker container exec -it $(docker ps --filter name=redis -q) cat /my-config cat: can't open '/my-config': No such file or directory
-
停止并删除服务,并从Docker中删除配置。
docker service rm redis docker config rm my-config