exlar's IT note

ITやスマートデバイスを中心とした趣味情報の寄せ集め

DockerでmacOSファイル共有サーバをお手軽構築

自宅のサーバーが古くなり、いつ故障してもおかしくない状況なので少しずつ移行をはじめています。新サーバーでは原則ルールとして Docker コンテナでの再構築に取り組んでいるため、それぞれの機能をメモしていこうと思います。

今回は Netatalk について。

Netatalk とは

Netatalk - Wikipedia

netatalkはUnix系OS上でMac OSやOS Xに対してAFPによるファイルサーバの機能を提供するオープンソースのソフトウェアである。 かつてはAppleTalkも実装したが、この機能は削除された。

MacのローカルファイルシステムであるHFSやHFS+は、リソースフォークやFinder情報といったメタデータをもつ。更に最近のOS Xでは拡張属性 (EA)も扱う。netatalkは、こうしたApple独自のメタデータを完全に保存することを目的として設計されたファイルサーバソフトウェアである。 メタデータは可能な限りサーバ側のファイルシステムの拡張属性に保存する。これが出来ない場合は隠しファイルを作って保存する。 また、バックアップソフトウェアであるTime Machineの保存先として利用することもできる。

引用の通り、macOS 向けのファイル共有プロトコルです。Mac は賢いので Windows の共有フォルダ(SMB)も普通に使えるのですが、.DS_Store といったゴミファイルが見えてしまったりと煩わしい点も若干あるので、より純粋なファイル共有プロトコルを採用します。

余談になりますが、自宅には一応Windowsもあるので、結局は Samba も構築することになります。

Docker Image の選定

ここでは Docker そのものの利用について触れません。docker rundocker-compose up のコマンドを用いたことがある方を想定しています。

Image を Dockerfile で新規構築してもよいのですが、先人たちの優れたコンテナが登録されていることも多々あるため、まずは DockerHub で検索します。環境変数での設定可能箇所が多いほど、柔軟で使いやすいコンテナであることが多いです。

❯ docker search netatalk
INDEX       NAME                                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/odarriba/timemachine                  Lastest Netatalk with configurable user/pa...   22                   [OK]
docker.io   docker.io/cptactionhank/netatalk                                                                13                   [OK]
docker.io   docker.io/cilix/netatalk                        Docker image designed to make it easy to h...   1                    [OK]
docker.io   docker.io/ironicbadger/build-netatalk3-debian   Builds v3 of netatalk for Debian from source    1                    [OK]
docker.io   docker.io/r1kelsey/netatalk                                                                     1                    [OK]
docker.io   docker.io/chattaway/netatalk                    netatalk                                        0                    [OK]

(2016/09/17 18:00現在)

Stars の数が一定数あるものを選びます。必ずしも Star が多からよいというわけではなく、少ないものでも日が浅いだけで高品質なものが埋もれている可能性はありますが、品質を測る一定の目安にはなるはずです。

一番多い odarriba/timemachine は timemachine 目的に特化しているみたいなので、今回選定対象からは外しました。そして選択したのがこちら。

cptactionhank/netatalk

下記の通り docker-compose.yml を作成したところ、正常に動作しました。

docker-compose.yml:

version: '2'

services:
  netatalk:
    image: cptactionhank/netatalk:latest
    container_name: netatalk
    network_mode: host
    env_file: credential.env #パスワード系のファイルは外部に
    environment:
      - AVAHI=1
    ports:
      - "548:548"
    volumes:
      - /your/media/path:/media/share
    restart: always

credential.env (docker-compose.yml の中に書いても構いません):

AFP_USER=username
AFP_PASSWORD=password
AFP_UID=1000
AFP_GID=1000

Netatalk 動作仕様の簡単なメモ

  • デフォルト設定 (afp.conf) では、 /media/share のみが共有されるようになっています
  • 1組(のみ?)のユーザーID/パスワードを環境変数で設定しなければ動作しません
  • 標準設定では不足する場合、/etc/afp.conf を volume mount (-v) で置換することで自由に設定可能です

凝った使い方をしなければこれだけで十分な気がします。

コンテナ設定のポイント

  • 環境変数にて AVAHI=1 を設定すると Auto Discovery が有効になります。Finderの左メニューに「共有」として自動検出されるものです。
  • network_mode: host オプションにて、ホストマシンの Interface に bind します。これをせずに通常の起動でコンテナの仮想NICに bind した場合、avahi による Auto Discovery が機能しません。
    • この時、Finderから「サーバへ接続(Command + K)」を選択してホストマシンのIPアドレス指定 (afp://IP_Address/) すれば接続することはできますが不便です。

まとめ

DockerHub のイメージを利用して簡単に Mac ファイル共有サーバーを作成しました。なお、この方法で作成したネットワークパスを TimeMacahine 保存場所としても利用できるはずです。

参考リンク

GitHub - cptactionhank/docker-netatalk: Docker container running Netatalk