「Docker」の版間の差分
(同期) |
Kusakata.bot (トーク | 投稿記録) 細 (文字列「ドロップインスニペット」を「ドロップインファイル」に置換) |
||
43行目: | 43行目: | ||
現在のストレージドライバーを確認するには {{ic|# docker info {{!}} head}} を実行してください。最近の docker 環境では {{ic|overlay2}} がデフォルトで使われます。 |
現在のストレージドライバーを確認するには {{ic|# docker info {{!}} head}} を実行してください。最近の docker 環境では {{ic|overlay2}} がデフォルトで使われます。 |
||
− | ストレージドライバーを設定するには、[[ドロップイン |
+ | ストレージドライバーを設定するには、[[ドロップインファイル]]を作成して {{ic|dockerd}} に {{ic|-s}} オプションを指定してください: |
{{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
{{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
||
[Service] |
[Service] |
||
66行目: | 66行目: | ||
==== Remote API と systemd ==== |
==== Remote API と systemd ==== |
||
− | docker デーモンで Remote API を起動するには、以下の内容で[[ドロップイン |
+ | docker デーモンで Remote API を起動するには、以下の内容で[[ドロップインファイル]]を作成してください: |
{{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
{{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
||
87行目: | 87行目: | ||
==== デーモンのプロキシの設定 ==== |
==== デーモンのプロキシの設定 ==== |
||
− | 以下の内容で[[ドロップイン |
+ | 以下の内容で[[ドロップインファイル]]を作成: |
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2= |
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2= |
||
[Service] |
[Service] |
||
136行目: | 136行目: | ||
まず、{{ic|docker.service}} を[[systemd#ユニットを使う|停止]]してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。 |
まず、{{ic|docker.service}} を[[systemd#ユニットを使う|停止]]してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。 |
||
− | その後、{{ic|docker.service}} の[[systemd#ドロップイン |
+ | その後、{{ic|docker.service}} の[[systemd#ドロップインファイル|ドロップインファイル]]を作成して、{{ic|ExecStart}} に {{ic|-g}} パラメータを追加してください: |
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2= |
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2= |
||
237行目: | 237行目: | ||
fork failed: Resource temporarily unavailable |
fork failed: Resource temporarily unavailable |
||
− | systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップイン |
+ | systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップインファイルを作成してください: |
{{hc|/etc/systemd/system/docker.service.d/tasks.conf|<nowiki> |
{{hc|/etc/systemd/system/docker.service.d/tasks.conf|<nowiki> |
2017年6月3日 (土) 19:43時点における版
Docker は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。
インストール
公式リポジトリにある docker パッケージをインストールして docker.service
を起動してください。開発版を使いたい場合、docker-gitAUR をインストールしてください。動作検証するために、次を実行:
# docker info
docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker グループに追加してからログインしなおしてください。
セッションが新しいグループを使うようにするには:
$ newgrp docker
設定
ストレージドライバー
docker のストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである devicemapper
は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で devicemappper
を使用することは推奨されません。
Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。overlay2
が新しいドライバーです。
現在のストレージドライバーを確認するには # docker info | head
を実行してください。最近の docker 環境では overlay2
がデフォルトで使われます。
ストレージドライバーを設定するには、ドロップインファイルを作成して 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:8080" Environment="HTTPS_PROXY=192.168.1.1:8080"
変更を適用: # systemctl daemon-reload
。
設定がロードされたことを確認:
# systemctl show docker --property Environment
Environment=HTTP_PROXY=192.168.1.1
Docker を再起動: # systemctl restart docker
。
コンテナの設定
docker.service
ファイルの設定はコンテナには適用されません。Dockerfile
で ENV
変数を設定する必要があります:
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 を実行
バージョン 220 以上の systemd-networkd を使ってネットワークを手動設定している場合、Docker で起動したコンテナがネットワークにアクセスできない場合があります。バージョン 220 から、ネットワークの転送設定 (net.ipv4.conf.<interface>.forwarding
) はデフォルトで off
になっており IP フォワーディングが使えません。また、コンテナの中で Docker によって有効になる net.ipv4.conf.all.forwarding
の設定と衝突します。
インターネットにアクセスするには、Docker のホスト側で /etc/systemd/network/
にある <interface>.network
ファイルを編集して以下のブロックを追加してください:
/etc/systemd/network/<interface>.network
[Network] ... IPForward=kernel ...
上記の設定でコンテナから IP フォワーディングが使えるようになります。
イメージの置き場所
デフォルトでは、docker のイメージは /var/lib/docker
に保存されます。置き場所は別のパーティションに移動することが可能です。
まず、docker.service
を停止してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを /var/lib/docker
から好きな場所に移動してください。
その後、docker.service
のドロップインファイルを作成して、ExecStart
に -g
パラメータを追加してください:
/etc/systemd/system/docker.service.d/docker-storage.conf
[Service] ExecStart= ExecStart=/usr/bin/dockerd -g /path/to/new/location/docker -H fd://
最後に、設定をリロードして docker.service
を再度起動します。
イメージ
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.sh
と mkimage-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
を追加してください。詳しくは バグレポート を参照。
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-networkd
と docker
サービスを再起動してください。
デフォルトで使用できるプロセスやスレッドの数が少なすぎる
以下のようなエラーメッセージが表示される場合:
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
を再起動してください。
Error initializing graphdriver: devmapper
systemctl
で docker の起動に失敗して以下のエラーが表示される場合:
Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool
サービスを停止して、/var/lib/docker/
をバックアップし、/var/lib/docker/
の中身を消してから、サービスを起動してみてください。詳しくは GitHub issue を参照。
参照
- Arch Linux on docs.docker.com
- Are Docker containers really secure? — opensource.com