Dockerのvolumesでドライブやフォルダの共有がエラーになるときの対処法

私はWindows10Proの環境にDocker for Windowsをインストールして使ってますが、コンテナとホストの間でディレクトリを共有し、Volumesによるドライブの永続化を行おうとしたときに、エラーに悩まされました。

結局解決したのですが、その過程をメモしておきます。

ホストOSとDockerコンテナとのファイル共有の基本設定

基本的にはタスクトレイのDockerのsettingの「Shared Drives」にチェックが入っていることが必要です。

Settingの開き方

Dockerのsettingは、タスクトレイから開くことができます。

ドライブ共有の設定

ここでチェックの入っているディレクトリがコンテナと共有されます。

この「Shared」にチェックを入れて「Apply」ボタンを押すと、ユーザとパスワードの認証画面が出て、そのユーザの権限でドライブを共有できます。

別なユーザの権限にしたい時には、「Reset Credentials」を押すと、権限情報が消去されるので、再度認証できます。

上記でエラーが出る場合

しかし、「Apply」ボタンを押下したときに以下のようなエラーダイアログが表示されてしまいました。

ファイヤーウォールに阻まれて、ファイルシェアできなかった旨のエラーです。

この問題に対処するための情報へのリンクがありますね。

結局、多くの場合は、このリンクの情報のように

Firewallの許可の設定に、Tcp 445番ポートの、10.0.75.1から10.0.75.2への通信を許可する

設定を行えばうまくシェアできます。

ただ、環境によって、すんなりいく場合と行かない場合があるんですよね。。

問題の切り分け(上記の対応でうまく行かない場合)

ファイアウォールによってシェアが失敗しているのか、それともほかの原因なのかを判断するために、一回ファイアウォールの設定を無効にしてみました。

これで「Shared」にチェックを入れて「Apply」ボタンを押して成功したら、何かが445番ポートを遮断していると判断できます。

私の場合は、これで成功したので、ファイアウォール周りに原因がありそうでした。

ただ、Windowsの設定を見ても、以下のように、ちゃんと通信は許可しているんですよね。。

もう一つの原因は、Windowsのファイアーウォールの設定では通信が許可されているにも関わらず、セキュリティソフトで遮断されている場合があります。

もし、別途セキュリティソフトを入れている場合は、そちらの設定も確認してみてください。
(私の場合は、特にセキュリティソフトを入れていなかったので、別の原因でした。)

さらにもう一つの原因は、上記のポート開放の設定が、Dockerのネットワークに適用されていないということです。

どういうことかというと、

コントロールパネルの「ネットワークと共有センター」のところに、Dockerのネットワーク設定があります。

「vEthernet(DockerNAT)」というネットワークです。

実は、WindowsとDockerコンテナはこのネットワークを介して通信しているようで、このネットワークで、先ほどの445番ポートの通信ができるようになっている必要があります。

私の場合は、上記のように、「vEthernet(DockerNAT)」が所属しているネットワークが「パブリックネットワーク」になっていました。

で、私のファイアウォールの設定だと、「パブリックネットワーク」は445番を遮断するような設定になっていたわけです。

この制限を回避するために、「vEthernet(DockerNAT)」のネットワークを「プライベート」に変更することで、ようやく共有に成功しました!

やり方は以下の通り。

WindowsのPower Shellで

Get-NetConnectionProfile

と打つと、ネットワークの状態を確認することができます。

PS C:\Users\pakun> Get-NetConnectionProfile

Name             : 識別されていないネットワーク
InterfaceAlias   : vEthernet (DockerNAT)
InterfaceIndex   : 9
NetworkCategory  : Public
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic

Name             : xxxxxxx.co.jp
InterfaceAlias   : イーサネット
InterfaceIndex   : 17
NetworkCategory  : DomainAuthenticated
IPv4Connectivity : Internet

IPv6Connectivity : NoTraffic

こんな感じ。

これを、「vEthernet(DockerNAT)」の「NetworkCategory : 」が「Public」となっていることから、パブリックネットワークに所属していることが分かります。

これをプライベートに変更するには、

Set-NetConnectionProfile -InterfaceIndex 4 -NetworkCategory Private

のようにします。

InterfaceIndex は、上記コマンドの結果
InterfaceIndex : 4

から確認した数字を入れます。

これで、ネットワークがパブリック→プライベートに変わりました。

この後、再度Settingから「Shared Drives」にチェックを入れ、「Apply」ボタンを押すことで、共有に成功しました。

この設定を行う前には、

docker run -v c:/Users:/data alpine ls /data

のコマンドで、

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Drive sharing seems blocked by a firewall.

のようなエラーが出ていましたが、適用後は、エラーなく共有できるようになったことでも確認できます。