Docker コンテナーに IP アドレスを付ける方法

半分は備忘録ですが、 MACVLAN を使って Docker コンテナーに IP アドレスを付ける方法を記述します。

MACVLAN の設定

/etc/network/interfaces の記述例:

allow-hotplug eth0
iface eth0 inet manual
        up ip link set $IFACE up arp off
        up ifup macvlan0 || true
iface eth0 inet6 auto
        accept_ra 0
        down ifdown macvlan0 || true
        down ip link set $IFACE down

iface macvlan0 inet static
        address 192.0.2.2
        netmask 255.255.255.0
        gateway 192.0.2.1
        pre-up ip link add link eth0 name "$IFACE" type macvlan mode bridge 1
iface macvlan0 inet6 static
        address 2001:DB8::2/64
        accept_ra 2
        autoconf 1
        post-down ip link delete "$IFACE" type macvlan || true

補足: eth0 は IP 通信に使わないので ARP と RA を無効化しておきます。

Docker ネットワークの設定

コマンド例:

docker network create -d macvlan \
    --subnet=192.0.2.0/24 \
    --gateway=192.0.2.1 \
    --ip-range=192.0.2.128/25 \
    -o parent=eth0 \
    network-name

Docker コンテナーの設定

コマンド例:

docker container --network=network-name \
    --ip=192.0.2.3 \
    image 

Plasso はじめました

先日 Plasso という決済プラットフォームを見つけたので、申し込んでみました。

Plasso は、簡単に言えばデジタル コンテンツのダウンロード販売や有料会員制サービスに向けた決済プラットフォームとなります。この種のサービスでは PayPal の利用が多いようですが、 Plasso は Stripe を利用しているのが特徴でしょうか。

ということで、とりあえず XLLMNRD 2.0 RPM という product ($0 ~) と XLLMNRD RPM Update という plan (無料) を用意してみましたので、興味があればご覧ください。

(追記) 利用料金は、固定費なしで価格の 4% (+ Stripe の決済手数料) からになっています。

ブラウザー上で X11 サーバーは動くか

最近はウェブ ブラウザー上に JavaScript でいろいろ作るのが流行っているようなので、昔懐かしい X11 サーバーを作れないかと考え始めてしまいました。

まず WebSocket で双方向通信が容易になったとは言え、 X11 サーバーには TCP 接続を待ち受けるサーバー ソケットが必要なので、何らかのエージェント プロセスは必要になりそうです。

複数クライアントに対応するとなると、 WebSocket の多重化も必要でしょうか。もっともこれは標準化が進められている様子なので、簡易なもので良さそうですかね。

Dockerfile 中で鍵サーバーから公開鍵の取得を試みるとエラーになる

Dockerfile の中で gpg --recv-keys を実行して公開鍵を取得しようとすると、エラーになったりならなかったりということがあったので、試行錯誤しながら対策してみました。

原因はおそらく IPv6 で鍵サーバーに接続しようとしたことで、 IPv6 を無効化することでひとまずエラーはなくなりなりました。

今回採用した IPv6 を無効化する方法は、 dirmngr.conf

disable-ipv6

を書くというものです。 gpg のオプションではなかったので、これにたどり着くまでは少し遠回りでしたね。

追記

エラー メッセージはこうでした。

gpg: keyserver receive failed: Cannot assign requested address

SRI を適用したスタイルシートのプリロードが機能しなかった

スタイルシートのフェッチを早くする目的で、プリロードを利用しようとして、

<link rel="preload" as="style" href="…" crossorigin="anonymous" integrity="…">

のあとに、

<link rel="stylesheet" href="…" crossorigin="anonymous" integrity="…">

としてみたところ、現バージョンの Chrome では両方ともフェッチしてむしろ無駄が増えることが判明したので、 SRI との併用は断念しました。

関連のバグは以下のようです。

https://bugs.chromium.org/p/chromium/issues/detail?id=677022

Azure VM で IPv6 に対応するには

この年末年始に Azure VM の構築に挑戦してみたのだが、その際に気づいた Azure VM での IPv6 対応について少し。

  1. Azure VM には直接公開 IPv6 アドレスを付与することができず、Load Balancer (無料) に付与する必要があること。
  2. Load Balancer では IPv6 通信を終端せず、NAT により内部 IPv6 アドレス (とポート番号) に変換されること。
  3. Azure VM で DHCPv6 により内部 IPv6 アドレスの利用ができるようになっている必要があること。

    資料: Azure Load Balancer の IPv6 の概要

    Docker にマウントしたディレクトリに作られる root 所有ディレクトリ対策

    Docker コンテナーにディレクトリをマウントして何か作業をすると、root 所有のディレクトリが作られてしまうことがある。

    そのようなディレクトリが作られても簡単に削除できるようにするのに、あらかじめ次のコマンドを実行してディレクトリに ACL を設定しておく方法が使える。

    find . -type d -exec setfacl -m d:u:${USER}:rwx {} \;