Docker

提供: ArchWiki
2016年12月4日 (日) 20:38時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

Docker は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。

インストール

ノート:
  • Docker は i686 をサポートしていません [1]
  • Docker は loop モジュールを必要とします。Docker を起動する前に以下のコマンドを実行してください:
# tee /etc/modules-load.d/loop.conf <<< "loop"
# modprobe loop

モジュールを有効にするには再起動が必要になる場合もあります。

公式リポジトリにある docker パッケージをインストールして docker.service起動してください。開発版を使いたい場合、docker-gitAUR をインストールしてください。動作検証するために、次を実行:

# docker info

docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker グループに追加してからログインし直してください:

警告: ユーザーを 'docker' グループに追加することは root にするのと同義です。詳しくは [2][3] を参照。
# gpasswd -a user docker

または、セッションが新しいグループを使うようにするには:

$ newgrp docker

設定

ストレージドライバー

ストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである devicemapper は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で devicemappper を使用することは推奨されません。

Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。overlay2 が新しいドライバーです。

現在のストレージドライバーを確認するには # docker info | head を実行してください。

ストレージドライバーを設定するには、ドロップインスニペットを作成して dockerd-s オプションを指定してください:

/etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -s overlay2

ExecStart を置き換えるには ExecStart= を上記のように設定する必要があります。

オプションに関する詳細は ユーザーガイド を見てください。

Remote API を開く

ポート 4243 で Remote API を手動で開くには:

# docker daemon -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

-H tcp://0.0.0.0:4243 で Remote API が開かれます。

-H unix:///var/run/docker.sock はターミナルからホストマシンにアクセスできるようにします。

Remote API と systemd

docker デーモンで Remote API を起動するには、以下の内容でドロップインスニペットを作成してください:

/etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

デーモンのソケットの設定

docker デーモンはデフォルトで Unix ソケットを使います。特定のポートを listen させるには、/etc/systemd/system/docker.socket を編集して、ListenStream を使用したいポートに置き換えてください:

[Socket]
ListenStream=0.0.0.0:2375

プロキシ

プロキシの設定は2つに分けられます。ひとつは Docker デーモンのホストの設定で、もうひとつはコンテナからプロキシにアクセスできるようにするための設定です。

デーモンのプロキシの設定

以下の内容でドロップインスニペットを作成:

/etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=192.168.1.1"
ノート: 上記ではプロクシサーバが 192.168.1.1 になっています、127.0.0.1 は使わないでください。

変更を適用: # systemctl daemon-reload

設定がロードされたことを確認:

# systemctl show docker --property Environment
Environment=HTTP_PROXY=192.168.1.1

Docker を再起動: # systemctl restart docker

コンテナの設定

docker.service ファイルの設定はコンテナには適用されません。DockerfileENV 変数を設定する必要があります:

FROM base/archlinux
ENV http_proxy="http://192.168.1.1:3128"
ENV https_proxy="https://192.168.1.1:3128"

Docker は Dockerfile で ENV を使って設定する方法について詳しい情報を提供しています。

DNS の設定

デフォルトでは、docker はホストマシンにある resolv.conf と同じ中身の resolv.conf をコンテナに作成します。その際、ローカルアドレス (例: 127.0.0.1) は消されます。それによって resolv.conf が空ファイルになった場合、Google の DNS サーバーが記述されます。Dnsmasq などのサービスを利用して名前を解決するようにしたい場合、設定が消されないように docker のネットワークインターフェイス用にエントリを /etc/resolv.conf に追加する必要があります。

イメージの置き場所

デフォルトでは、docker のイメージは /var/lib/docker に保存されます。置き場所は別のパーティションに移動することが可能です。

まず、docker.service停止してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを /var/lib/docker から好きな場所に移動してください。

その後、docker.serviceドロップインスニペットを作成して、ExecStart-g パラメータを追加してください:

/etc/systemd/system/docker.service.d/imagelocation.conf
[Service]
ExecStart= 
ExecStart=/usr/bin/dockerd -g /path/to/new/location/docker -H fd://

最後に、設定をリロードして docker.service を再度起動します。

Docker 0.9.0 -- 1.2.x と LXC

バージョン 0.9.0 から Docker は LXC に依存しないでコンテナを起動できる libcontainer という新しい方法を提供しています。

lxc exec ドライバーや -lxc-conf オプションは将来的には削除される可能性があります [4]

今後、デフォルトで Docker 0.9.0+ で管理されるコンテナで lxc-attach を使用する必要がなくなります。Docker デーモンを実行するには引数として -e lxc が必要です。

/etc/systemd/system/docker.service.d/ 下に lxc.conf という名前のファイルを以下の内容で作成することができます:

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -e lxc

イメージ

Arch Linux

x86_64

次のコマンドは base/archlinux x86_64 イメージを取得します:

# docker pull base/archlinux

i686

Docker Registry のデフォルトの Arch Linux イメージは x86_64 だけです。i686 イメージは手動で作成する必要があります。

イメージの作成

代わりに、docker base/archlinux registry をチェックして mkimage-arch.sh リンクをクリックして mkimage-arch.shmkimage-arch-pacman.conf を同一のフォルダにダウンロードしてください。そして、スクリプトに実行可能属性を付与して実行してください:

$ chmod +x mkimage-arch.sh
$ cp /etc/pacman.conf ./mkimage-arch-pacman.conf # or get a pacman.conf from somewhere else
$ ./mkimage-arch.sh
# docker run -t -i --rm archlinux /bin/bash # try it

ネットワーク接続や CPU が遅い場合は、ビルドのタイムアウト時間を伸ばすことができます:

$ sed -i 's/timeout 60/timeout 120/' mkimage-arch.sh

Debian

debootstrap で Debian イメージを作成:

# mkdir jessie-chroot
# debootstrap jessie ./jessie-chroot http://http.debian.net/debian/
# cd jessie-chroot
# tar cpf - . | docker import - debian
# docker run -t -i --rm debian /bin/bash

Skype

Skype#Docker を参照してください。

Arch Linux イメージとスナップショットリポジトリ

複数のイメージを作成した場合、アップデートによってパッケージのバージョンが食い違ってしまい問題が起こりやすくなります。Docker コンテナのパッケージのバージョンを統一するために、Docker イメージとスナップショットリポジトリ を利用することができます。スナップショットが作成された日に基づいて公式リポジトリから新しいパッケージをインストールすることができるようになります。

$ docker pull pritunl/archlinux:latest
$ docker run --rm -t -i pritunl/archlinux:latest /bin/bash

もしくは Arch Linux Archive を使って /etc/pacman.d/mirrorlist を凍らせる方法もあります:

Server=https://archive.archlinux.org/repos/2020/01/02/$repo/os/$arch

便利なヒント

実行中のコンテナの IP アドレスを取得するには:

$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-name OR id> 
172.17.0.37

トラブルシューティング

systemd 232 でコンテナが起動できない

カーネルパラメータとして systemd.legacy_systemd_cgroup_controller=yes を追加してください。詳しくは バグレポート を参照。

Docker info でエラーが出力される

docker info を実行すると以下のようなエラーが表示される場合:

 FATA[0000] Get http:///var/run/docker.sock/v1.17/info: read unix /var/run/docker.sock: connection reset by peer. Are you trying to connect to a TLS-enabled daemon without TLS?

おそらく bridge モジュールがロードされていません。lsmod を実行することで確認できます。ロードされていない場合は、modprobe を実行してロードするか、再起動してみてください (カーネルをアップグレードしたときに、bridge が最新のカーネル用にビルドされていた場合、再起動が必要になります)。

詳しくは GitHub の issue を見てください。

Btrfs ファイルシステムで Docker イメージを消去

btrfs ファイルシステムで docker イメージを削除すると /var/lib/docker/btrfs/subvolumes/ にサイズが0のイメージが残されてしまいます。これを削除しようとするとパーミッションエラーが表示されます:

# docker rm bab4ff309870
# rm -Rf /var/lib/docker/btrfs/subvolumes/*
rm: cannot remove '/var/lib/docker/btrfs/subvolumes/85122f1472a76b7519ed0095637d8501f1d456787be1a87f2e9e02792c4200ab': Operation not permitted

このエラーは btrfs が docker イメージのためにサブボリュームを作成したのが原因です。したがって削除するときの正しいコマンドは次のようになります:

# btrfs subvolume delete /var/lib/docker/btrfs/subvolumes/85122f1472a76b7519ed0095637d8501f1d456787be1a87f2e9e02792c4200ab

docker0 ブリッジが IP を取得できない / コンテナからインターネットにアクセスできない

Docker は自分で IP フォワーディングを有効にしますが、デフォルトでは systemd によって sysctl の設定が上書きされてしまいます。以下の設定によって上書きされないようにできます (全てのインターフェイスで有効):

/etc/systemd/network/ipforward.network
[Network]
IPForward=kernel
/etc/sysctl.d/99-docker.conf
net.ipv4.ip_forward = 1
# sysctl -w net.ipv4.ip_forward=1

最後に systemd-networkddocker サービスを再起動してください。

デフォルトで使用できるプロセスやスレッドの数が少なすぎる

以下のようなエラーメッセージが表示される場合:

java.lang.OutOfMemoryError: unable to create new native thread
fork failed: Resource temporarily unavailable

systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが (system.conf を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップインスニペットを作成してください:

/etc/systemd/system/docker.service.d/tasks.conf
[Service]
TasksMax=infinity

その後、systemd をリロードして docker.service を再起動してください。

参照