Writing Appropriately

職務経歴

DockerコンテナのvolumeマウントとWindwos

Windows 10 pro
Docker Version 18.03.1-ce-win65

コンテナにWindowsのフォルダをマウントさせれるが、が、が、アプリケーションの動作が時々不安定になる。ruby gemとかruby gemとか
なので、コンテナOSにsambaをインストールしてWindowsからマウントするのがよい
永続化データはイメージにvolumesを定義しておけばDockerホストOSのHyper-VのMobyLinuxVMに残るため問題ない

作業時間目安3分

目次

1 Windowsからコンテナへのルート追加
 1.1 コンテナのアドレス範囲を調べる
 1.2 MobyLinuxVMのアドレスを調べる
 1.3 WindowsのDockerNATのインタフェース番号を調べる
 1.4 Windowsにroute追加
 1.5 pingが通る事を確認
2 コンテナにsambaインストール
 2.1 インストール
 2.2 コンテナの/etc/samba/smb.confを編集
 2.3 コンテナの/et..a/smb.confのチェック
 2.4 コンテナのsmbd自動起動の登録
3 確認

1 Windowsからコンテナへのルート追加

1.1 コンテナのアドレス範囲を調べる

docker exec -it コンテナ名 ifconfig

    eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02
              inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0

1.2 MobyLinuxVMのアドレスを調べる

  • 方法1 netstatWindowsのDockerNATアドレスで絞り込めばほぼ分かる

    • WindowsのDockerNATのipアドレス

        ipconfig /all
      
            イーサネット アダプター vEthernet (DockerNAT):
               接続固有の DNS サフィックス . . . . .:
               説明. . . . . . . . . . . . . . . . .: Hyper-V Virtual Ethernet Adapter #2
               IPv4 アドレス . . . . . . . . . . . .: 10.0.75.1(優先)
      
    • WindowsのDockerNATの接続している先はMobyLinuxVMしかないだろう

        netstat -ano | findstr 10.0.75.1
      
              TCP         10.0.75.1:445          10.0.75.2:39474        ESTABLISHED     4
      
  • 方法2 arpテーブルから

    • Hyper-V マネージャから物理アドレスを調べる

    • キャッシュするためロードキャストアドレス宛にpingを打つ(正直必要ないが手順として記述)

        ping 10.0.75.255
      
    • arpWindowsのDockerNATアドレスで絞り込み

        arp /a /n 10.0.75.1
      
            インターフェイス: 10.0.75.1 --- 0x1d
              インターネット アドレス 物理アドレス           種類
              10.0.75.2             00-15-5d-00-02-09     動的
      

1.3 WindowsのDockerNATのインタフェース番号を調べる

番号は29 16進数で0x1d

  • 方法1 netsh

      netsh interface ipv4 show interface
    
              Idx     Met         MTU          状態                 名前
              ---  ----------  ----------  ------------  ---------------------------
               29          15        1500  connected     vEthernet (DockerNAT)
    
  • 方法2 route

      route print
    
              インターフェイス一覧
               29...00 15 5d 00 02 08 ......Hyper-V Virtual Ethernet Adapter #2
    

1.4 Windowsにroute追加

管理者でpowersehllかコマンドプロンプト起動

コンテナのアドレス範囲への接続にMobyLinuxVMを通すというrouteの追加
アドレス空間とMaskは項1.1で調べた値
ゲートウェイはMobylinuxVMで項1.2で調べた値
WindowsのDockerNATのインタフェース番号は項1.3で調べた番号
  ifは16進数で指定 29は16進数で0x1d
  (ifはなくても適切なインタフェースが自動的に割り当てられる)

一時追加

再起動で失われる
Docker startと共にバッチに書いて置けばいい

route add 172.18.0.0 mask 255.255.0.0 10.0.75.2 if 0x1d

永続追加

永続追加するなら-pオプションを付ける

route -p add 172.18.0.0 mask 255.255.0.0 10.0.75.2 if 0x1d

"削除はこう
route delete 172.18.0.0 mask 255.255.0.0

正直こうでいい

route -p add 172.17.0.0 mask 255.255.0.0 10.0.75.2
route -p add 172.18.0.0 mask 255.255.0.0 10.0.75.2

1.5 pingが通る事を確認

ping コンテナIP

2 コンテナにsambaインストール

alpineはこれ

samba-alpine-docker/Dockerfile at master · pwntr/samba-alpine-docker · GitHub

2.1 インストール

  • Ubuntu

      docker exec -it コンテナ名 apt-get install samba
    

2.2 コンテナの/etc/samba/smb.confを編集

docker exec -it コンテナ名 vi /etc/samba/smb.conf

追加

[USERNAME]
comment = USERNAME share
path = /home/USERNAME
browsable = yes
public = yes
read only = no
writable = yes
force user = USERNAME

2.3 コンテナの/etc/samba/smb.confのチェック

docker exec -it コンテナ名 testparm

2.4 コンテナのsmbd起動

通常はデーモンのsmbd
古いものはsambaがサービス名(もうないか)

  • コンテナOSに合わせて起動や自動登録

      docker exec -it コンテナ名 chkconfig smbd on
    
      docker exec -it コンテナ名 update-rc.d smbd defaults
      docker exec -it コンテナ名 update-rc.d smbd enable 1 2 3 4 5
    

3 確認

  • Windowsでネットワーク接続

      \\172.18.0.2\
    
  • ファイルの書き込みができるか確認

  • コンテナでファイルのパーミッション・所有者・グループを確認