「Docker」の版間の差分
(同期) |
(英語版に同期) |
||
(4人の利用者による、間の11版が非表示) | |||
2行目: | 2行目: | ||
[[en:Docker]] |
[[en:Docker]] |
||
[[ru:Docker]] |
[[ru:Docker]] |
||
− | [[zh- |
+ | [[zh-hant:Docker]] |
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|systemd-nspawn}} |
{{Related|systemd-nspawn}} |
||
9行目: | 9行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | [ |
+ | [https://www.docker.com Docker] は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。 |
== インストール == |
== インストール == |
||
+ | {{Pkg|docker}} パッケージ、または開発版を使いたい場合は {{Aur|docker-git}} パッケージを [[インストール]] して下さい。次に {{ic|docker.service}} を [[起動]] して有効化してください。動作検証するために、次を実行: |
||
− | {{Note|Docker は i686 をサポートしていません [https://github.com/docker/docker/issues/136]。}} |
||
− | |||
− | [[公式リポジトリ]]にある {{Pkg|docker}} パッケージを[[pacman|インストール]]して {{ic|docker.service}} を[[systemd#ユニットを使う|起動]]してください。開発版を使いたい場合、{{AUR|docker-git}} をインストールしてください。動作検証するために、次を実行: |
||
# docker info |
# docker info |
||
+ | 有効な vpn 接続がある場合 docker サービスの起動に失敗することがあることに注意して下さい。このような場合、docker サービスの起動前に vpn を切断してみて下さい。その後すぐに vpn に再接続できます。 |
||
− | docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker グループに追加してからログインし直してください: |
||
+ | docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを {{ic|docker}} [[グループ]]に追加してください。 |
||
− | {{Warning|ユーザーを 'docker' グループに追加することは root にするのと同義です。詳しくは [https://github.com/docker/docker/issues/9976] や [http://docs.docker.com/engine/articles/security/] を参照。}} |
||
+ | {{Warning|ユーザーを {{ic|docker}} グループに追加することは root にするのと同義です。詳しくは [https://github.com/docker/docker/issues/9976 こちら] や [https://docs.docker.com/engine/security/security/ こちら] を参照。}} |
||
− | # gpasswd -a ''user'' docker |
||
+ | {{Note|{{Pkg|linux}} 4.15.0-1 の時点で、特定のプログラム(''apt-get'' など)で必要な ''vsyscalls'' は、カーネルの設定ではデフォルトで無効になっています。再度有効にするには、{{ic|1=vsyscall=emulate}} を[[カーネルパラメータ]]に追加します。さらに詳しい情報は {{bug|57336}} を参照。}} |
||
− | または、セッションが新しいグループを使うようにするには: |
||
− | |||
− | $ newgrp docker |
||
== 設定 == |
== 設定 == |
||
− | === |
+ | === ストレージドライバー === |
+ | |||
+ | docker のストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである {{ic|devicemapper}} は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で {{ic|devicemappper}} を使用することは推奨されません。 |
||
+ | |||
+ | Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。{{ic|overlay2}} が新しいドライバーです。 |
||
+ | |||
+ | 現在のストレージドライバーを確認するには {{ic|# docker info {{!}} head}} を実行してください。最近の docker 環境では {{ic|overlay2}} がデフォルトで使われます。 |
||
+ | |||
+ | 自分で選択したストレージドライバーを設定するには、{{ic|/etc/docker/daemon.json}} (無い場合は作成して下さい)を編集して下さい: |
||
+ | {{hc|/etc/docker/daemon.json|2= |
||
+ | { |
||
+ | "storage-driver": "overlay2" |
||
+ | } |
||
+ | |||
+ | }} |
||
+ | |||
+ | その後、docker を [[再起動]] して下さい。 |
||
+ | |||
+ | オプションに関する詳細は [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ ユーザーガイド] を見てください。 |
||
+ | {{ic|daemon.json}} の中のオプションの詳細は [https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file dockerd のドキュメント] を見てください。 |
||
+ | |||
+ | === Remote API === |
||
ポート {{ic|4243}} で Remote API を手動で開くには: |
ポート {{ic|4243}} で Remote API を手動で開くには: |
||
− | # |
+ | # /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock |
{{ic|-H tcp://0.0.0.0:4243}} で Remote API が開かれます。 |
{{ic|-H tcp://0.0.0.0:4243}} で Remote API が開かれます。 |
||
41行目: | 58行目: | ||
{{ic|-H unix:///var/run/docker.sock}} はターミナルからホストマシンにアクセスできるようにします。 |
{{ic|-H unix:///var/run/docker.sock}} はターミナルからホストマシンにアクセスできるようにします。 |
||
− | === |
+ | ==== Remote API と systemd ==== |
+ | docker デーモンで Remote API を起動するには、以下の内容で[[ドロップインスニペット]]を作成してください: |
||
− | プロキシの設定は2つに分けられます。一つは Docker デーモンのホストの設定で、もうひとつはコンテナからプロキシにアクセスできるようにするための設定です。 |
||
+ | {{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
||
− | ==== デーモンのプロキシの設定 ==== |
||
+ | [Service] |
||
+ | ExecStart= |
||
+ | ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock |
||
+ | }} |
||
+ | === デーモンのソケットの設定 === |
||
− | {{ic|/usr/lib/systemd/system/docker.service}} を {{ic|/etc/systemd/system/docker.service}} にコピーしてください。そして {{ic|/etc/systemd/system/docker.service}} を以下のように編集してください、{{ic|http_proxy}} はプロキシサーバーに {{ic|-g <path>}} は docker のホームに置き換えて下さい。デフォルトのパスは {{ic|/var/lib/docker}} です。 |
||
+ | ''docker'' デーモンはデフォルトで [[Wikipedia:ja:UNIXドメインソケット|Unix ソケット]]を使います。特定のポートを listen させるには、以下の内容の [[ドロップインスニペット]] を作成してください: |
||
− | まず、docker サービスの systemd ドロップインディレクトリを作成: {{ic|# mkdir /etc/systemd/system/docker.service.d}}。 |
||
− | + | {{hc|/etc/systemd/system/docker.socket.d/socket.conf|2= |
|
+ | [Socket] |
||
+ | ListenStream=0.0.0.0:2375 |
||
+ | }} |
||
+ | === プロキシ === |
||
− | [Service] |
||
− | Environment="HTTP_PROXY=192.168.1.1" |
||
+ | プロキシの設定は2つに分けられます。ひとつは Docker デーモンのホストの設定で、もうひとつはコンテナからプロキシにアクセスできるようにするための設定です。 |
||
− | {{Note|上記ではプロクシサーバが {{ic|192.168.1.1}} になっています、{{ic|127.0.0.1}} は使わないでください。}} |
||
+ | ==== プロキシの設定 ==== |
||
− | 変更を適用: {{ic|# systemctl daemon-reload}}。 |
||
+ | 以下の内容で[[ドロップインスニペット]]を作成: |
||
− | 設定がロードされたことを確認: {{hc|# systemctl show docker --property Environment|2=Environment=HTTP_PROXY=192.168.1.1}} |
||
+ | {{hc|/etc/systemd/system/docker.service.d/proxy.conf|2= |
||
+ | [Service] |
||
+ | Environment="HTTP_PROXY=192.168.1.1:8080" |
||
+ | Environment="HTTPS_PROXY=192.168.1.1:8080" |
||
+ | }} |
||
+ | {{Note|これはあなたのプロクシサーバが {{ic|192.168.1.1}} だと仮定しています、{{ic|127.0.0.1}} は使わないでください。}} |
||
− | Docker を再起動: {{ic|# systemctl restart docker}}。 |
||
+ | 設定がロードされたことを確認: |
||
− | ==== コンテナの設定 ==== |
||
+ | {{hc|# systemctl show docker --property Environment|2= |
||
− | {{ic|docker.service}} ファイルの設定はコンテナには換算されません。{{ic|Dockerfile}} で {{ic|ENV}} 変数を設定する必要があります: |
||
+ | Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080 |
||
+ | }} |
||
+ | ==== コンテナの設定 ==== |
||
− | FROM base/archlinux |
||
− | ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>" |
||
− | ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>" |
||
− | + | {{ic|docker.service}} ファイルの設定はコンテナには適用されません。{{ic|Dockerfile}} で {{ic|ENV}} 変数を設定する必要があります: |
|
+ | FROM base/archlinux |
||
− | === デーモンのソケットの設定 === |
||
+ | ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>" |
||
+ | ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>" |
||
+ | [https://docs.docker.com/engine/reference/builder/#env Docker] は Dockerfile で {{ic|ENV}} を使って設定する方法について詳しい情報を提供しています。 |
||
− | ''docker'' デーモンはデフォルトで [[Wikipedia:ja:UNIXドメインソケット|Unix ソケット]]を使います。特定のポートで待機させるには、{{ic|/etc/systemd/system/docker.socket}} を編集して、{{ic|ListenStream}} を使用したいポートに置き換えてください: |
||
− | |||
− | [Socket] |
||
− | ListenStream=0.0.0.0:2375 |
||
=== DNS の設定 === |
=== DNS の設定 === |
||
− | デフォルトでは、docker はホストマシンにある {{ic|resolv.conf}} と同じ中身の {{ic|resolv.conf}} をコンテナに作成します。その際、ローカルアドレス (例: {{ic|127.0.0.1}}) は消されます。それによって {{ic|resolv.conf}} が空ファイルになった場合、Google の DNS サーバーが記述されます。[[ |
+ | デフォルトでは、docker はホストマシンにある {{ic|resolv.conf}} と同じ中身の {{ic|resolv.conf}} をコンテナに作成します。その際、ローカルアドレス (例: {{ic|127.0.0.1}}) は消されます。それによって {{ic|resolv.conf}} が空ファイルになった場合、[https://developers.google.com/speed/public-dns/ Google の DNS サーバー] が記述されます。[[dnsmasq]] などのサービスを利用して名前を解決するようにしたい場合、設定が消されないように docker のネットワークインターフェイス用にエントリを {{ic|/etc/resolv.conf}} に追加する必要があります。 |
+ | === systemd-networkd 上に手動で定義したネットワークで Docker を実行 === |
||
− | === イメージの置き場所 === |
||
+ | バージョン ''220'' または ''それ以上'' の [[systemd-networkd]] を使ってネットワークを手動設定している場合、Docker で起動したコンテナがネットワークにアクセスできない場合があります。バージョン 220 から、ネットワークの転送設定 ({{ic|net.ipv4.conf.<interface>.forwarding}}) はデフォルトで {{ic|off}} です。この設定で IP フォワーディングが使えません。また、コンテナの中で Docker によって有効になる {{ic|net.ipv4.conf.all.forwarding}} の設定と衝突します。 |
||
− | デフォルトでは、docker のイメージは {{ic|/var/lib/docker}} に保存されます。置き場所は別のパーティションに移動することが可能です。 |
||
+ | インターネットにアクセスするには、Docker のホスト側で {{ic|/etc/systemd/network/}} にある {{ic|<interface>.network}} ファイルを編集して {{ic|1=IPForward=kernel}} を追加してください: |
||
− | まず、{{ic|docker.service}} を[[systemd#ユニットを使う|停止]]してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。 |
||
+ | {{hc|/etc/systemd/network/<interface>.network|2= |
||
− | その後、{{ic|docker.service}} の[[systemd#ドロップインスニペット|ドロップインスニペット]]を作成して、{{ic|ExecStart}} に {{ic|-g}} パラメータを追加してください: |
||
+ | [Network] |
||
+ | ... |
||
+ | IPForward=kernel |
||
+ | ...}} |
||
+ | 上記の設定でコンテナから IP フォワーディングが使えるようになります。 |
||
− | {{hc|/etc/systemd/system/docker.service.d/imagelocation.conf|2= |
||
− | [Service] |
||
− | ExecStart= |
||
− | ExecStart=/usr/bin/docker daemon -g ''/path/to/new/location/docker'' -H fd://}} |
||
+ | === イメージの置き場所 === |
||
− | 最後に、設定をリロードして {{ic|docker.service}} を再度[[起動]]します。 |
||
+ | デフォルトでは、docker のイメージは {{ic|/var/lib/docker}} に保存されます。置き場所は別のパーティションに移動することが可能です。 |
||
− | == Docker 0.9.0 -- 1.2.x と LXC == |
||
+ | まず、{{ic|docker.service}} を[[停止]]してください。 |
||
− | バージョン 0.9.0 から Docker は LXC に依存しないでコンテナを起動できる ''libcontainer'' という新しい方法を提供しています。 |
||
+ | docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。 |
||
− | lxc exec ドライバーや -lxc-conf オプションは将来的には削除される可能性があります [https://github.com/docker/docker/pull/5797]。 |
||
+ | その後、{{ic|docker.service}} の[[ドロップインスニペット]]を作成して、{{ic|ExecStart}} に {{ic|--data-root}} パラメータを追加してください: |
||
− | 今後、デフォルトで Docker 0.9.0+ で管理されるコンテナで {{ic|lxc-attach}} を使用する必要がなくなります。Docker デーモンを実行するには引数として {{ic|-e lxc}} が必要です。 |
||
− | {{ |
+ | {{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2= |
+ | [Service] |
||
+ | ExecStart= |
||
+ | ExecStart=/usr/bin/dockerd --data-root=''/path/to/new/location/docker'' -H fd://}} |
||
+ | === 安全ではないレジストリ === |
||
− | [Service] |
||
+ | |||
− | ExecStart= |
||
+ | もしプライベートレジストリに自己署名証明書を使うことに決めた場合、あなたが信頼すると宣言するまで Docker はその使用を拒否します。 |
||
− | ExecStart=/usr/bin/docker -d -e lxc |
||
+ | {{ic|docker.service}} の [[ドロップインスニペット]] を追加して、{{ic|--insecure-registry}} パラメータを {{ic|dockerd}} に追加してください: |
||
+ | {{hc|/etc/systemd/system/docker.service.d/override.conf|2= |
||
+ | [Service] |
||
+ | ExecStart= |
||
+ | ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000 |
||
+ | }} |
||
== イメージ == |
== イメージ == |
||
=== Arch Linux === |
=== Arch Linux === |
||
+ | 次のコマンドは [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 イメージを取得します。これはネットワーク、その他を削減したバージョンの Arch core です: |
||
− | ==== x86_64 ==== |
||
+ | # docker pull archlinux/base |
||
− | 次のコマンドは [https://hub.docker.com/r/base/archlinux/ base/archlinux] x86_64 イメージを取得します: |
||
− | # docker pull base/archlinux |
||
+ | 詳しくは [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md] を参照してください。 |
||
− | ==== i686 ==== |
||
− | Docker Registry のデフォルトの Arch Linux イメージは x86_64 だけです。i686 イメージは手動で作成する必要があります。 |
||
+ | 完全な Arch base を得るには、上記から repo を clone して自分でイメージを作成してください。 |
||
− | ==== イメージの作成 ==== |
||
− | 代わりに、[https://registry.hub.docker.com/u/base/archlinux/ docker base/archlinux registry] をチェックして {{ic|mkimage-arch.sh}} リンクをクリックして {{ic|mkimage-arch.sh}} と {{ic|mkimage-arch-pacman.conf}} を同一のフォルダにダウンロードしてください。そして、スクリプトに実行可能属性を付与して実行してください: |
||
+ | $ git clone https://github.com/archlinux/archlinux-docker.git |
||
− | $ 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 |
||
+ | 'base' のみを含めるようにパッケージファイルを編集してください。そして実行: |
||
− | ネットワーク接続や CPU が遅い場合は、ビルドのタイムアウト時間を伸ばすことができます: |
||
+ | |||
− | $ sed -i 's/timeout 60/timeout 120/' mkimage-arch.sh |
||
+ | # make docker-image |
||
=== Debian === |
=== Debian === |
||
+ | 以下のコマンドで [https://hub.docker.com/r/_/debian/ debian] x86_64 イメージが取得されます: |
||
+ | # docker pull debian |
||
+ | |||
+ | ==== 手動 ==== |
||
{{Pkg|debootstrap}} で Debian イメージを作成: |
{{Pkg|debootstrap}} で Debian イメージを作成: |
||
# mkdir jessie-chroot |
# mkdir jessie-chroot |
||
− | # debootstrap jessie ./jessie-chroot |
+ | # debootstrap jessie ./jessie-chroot http://http.debian.net/debian/ |
# cd jessie-chroot |
# cd jessie-chroot |
||
# tar cpf - . | docker import - debian |
# tar cpf - . | docker import - debian |
||
# docker run -t -i --rm debian /bin/bash |
# docker run -t -i --rm debian /bin/bash |
||
+ | == Docker とイメージの削除 == |
||
− | === Skype === |
||
− | + | Docker を完全に削除したい場合は以下の手順に従ってください。 |
|
+ | {{Note|コマンドを実行する前にどういう意味なのか考えてください。何も考えずにコピーアンドペーストしてはいけません。}} |
||
− | == Arch Linux イメージとスナップショットリポジトリ == |
||
− | 複数のイメージを作成した場合、アップデートによってパッケージのバージョンが食い違ってしまい問題が起こりやすくなります。Docker コンテナのパッケージのバージョンを統一するために、[https://registry.hub.docker.com/u/pritunl/archlinux/ Docker イメージとスナップショットリポジトリ] を利用することができます。スナップショットが作成された日に基づいて公式リポジトリから新しいパッケージをインストールすることができるようになります。 |
||
+ | 実行中のコンテナをチェック: |
||
− | $ docker pull pritunl/archlinux:latest |
||
+ | |||
− | $ docker run --rm -t -i pritunl/archlinux:latest /bin/bash |
||
+ | # docker ps |
||
+ | |||
+ | 削除するホストで実行中の全てのコンテナを確認: |
||
+ | |||
+ | # docker ps -a |
||
+ | |||
+ | 実行中のコンテナを停止: |
||
+ | |||
+ | # docker stop <CONTAINER ID> |
||
+ | |||
+ | 停止しないコンテナを終了: |
||
+ | |||
+ | # docker kill <CONTAINER ID> |
||
+ | |||
+ | ID で指定して全てのコンテナを削除: |
||
+ | |||
+ | # docker rm <CONTAINER ID> |
||
+ | |||
+ | 全ての Docker イメージを確認: |
||
+ | |||
+ | # docker images |
||
+ | |||
+ | ID で指定して全てのイメージを削除: |
||
+ | |||
+ | # docker rmi <IMAGE ID> |
||
+ | |||
+ | 全ての Docker データを削除: |
||
+ | |||
+ | # rm -R /var/lib/docker |
||
== 便利なヒント == |
== 便利なヒント == |
||
157行目: | 221行目: | ||
実行中のコンテナの IP アドレスを取得するには: |
実行中のコンテナの IP アドレスを取得するには: |
||
− | {{hc|<nowiki>$ docker inspect --format |
+ | {{hc|<nowiki>$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id> </nowiki>| |
172.17.0.37}} |
172.17.0.37}} |
||
+ | それぞれの実行中のコンテナについて、{{ic|/etc/hosts}} で使うために名前と対応する IP アドレスを出力: |
||
− | == トラブルシューティング == |
||
+ | {{bc|#!/usr/bin/env sh |
||
− | === Docker info でエラーが出力される === |
||
+ | <nowiki>for ID in $(docker ps -q | awk '{print $1}'); do |
||
+ | IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID") |
||
+ | NAME=$(docker ps | grep "$ID" | awk '{print $NF}') |
||
+ | printf "%s %s\n" "$IP" "$NAME" |
||
+ | done</nowiki>}} |
||
+ | == トラブルシューティング == |
||
− | {{ic|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? |
||
− | |||
− | おそらく {{ic|bridge}} モジュールがロードされていません。{{ic|lsmod | grep bridge}} を実行することで確認できます。ロードされていない場合は、{{ic|modprobe}} を実行してロードするか、再起動してみてください (カーネルをアップグレードしたときに、bridge が最新のカーネル用にビルドされていた場合、再起動が必要になります)。 |
||
+ | === systemd 232 でコンテナが起動できない === |
||
− | 詳しくは [https://github.com/docker/docker/issues/6853 GitHub の issue] を見てください。 |
||
+ | [[カーネルパラメータ]]として {{ic|1=systemd.legacy_systemd_cgroup_controller=yes}} を追加してください。詳しくは [https://github.com/opencontainers/runc/issues/1175 バグレポート] を参照。 |
||
=== Btrfs ファイルシステムで Docker イメージを消去 === |
=== Btrfs ファイルシステムで Docker イメージを消去 === |
||
184行目: | 250行目: | ||
=== docker0 ブリッジが IP を取得できない / コンテナからインターネットにアクセスできない === |
=== docker0 ブリッジが IP を取得できない / コンテナからインターネットにアクセスできない === |
||
− | Docker は自分で IP フォワーディングを有効にしますが、デフォルトでは systemd によって sysctl の設定が上書きされてしまいます。 |
+ | Docker は自分で IP フォワーディングを有効にしますが、デフォルトでは [[systemd-networkd]] によって sysctl の設定が上書きされてしまいます。ネットワークプロファイルに {{ic|1=IPForward=yes}} を設定してください。詳しくは [[インターネット共有#パケット転送の有効化]] を参照してください。 |
+ | === デフォルトで使用できるプロセスやスレッドの数が少なすぎる === |
||
− | {{hc|/etc/systemd/network/ipforward.network|<nowiki> |
||
− | [Network] |
||
− | IPForward=ipv4 |
||
− | </nowiki>}} |
||
+ | 以下のようなエラーメッセージが表示される場合: |
||
− | {{hc|/etc/systemd/network/99-docker.conf|<nowiki> |
||
− | net.ipv4.ip_forward = 1 |
||
− | </nowiki>}} |
||
+ | # e.g. Java |
||
− | # sysctl -w net.ipv4.ip_forward=1 |
||
+ | java.lang.OutOfMemoryError: unable to create new native thread |
||
+ | # e.g. C, bash, ... |
||
+ | fork failed: Resource temporarily unavailable |
||
+ | systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のスニペットで {{ic|docker.service}} を [[編集]] してください: |
||
− | 最後に {{ic|systemd-networkd}} と {{ic|docker}} サービスを[[再起動]]してください。 |
||
+ | {{hc|# systemctl edit docker.service|2= |
||
− | === ループバックデバイスが存在しないというエラーが発生する === |
||
+ | [Service] |
||
+ | TasksMax=infinity |
||
+ | }} |
||
+ | === Error initializing graphdriver: devmapper === |
||
− | docker サービスの起動が失敗するときに {{ic|journalctl}} でループバックデバイスが存在しないというエラーが確認できる場合、[[TrueCrypt#Failed to set up a loop device|TrueCrypt のトラブルシューティングセクション]]に書かれていることを試してみてください。また、カーネルをアップグレードした場合、再起動が必要です。 |
||
+ | ''systemctl'' で docker の起動に失敗して以下のエラーが表示される場合: |
||
− | === デフォルトで使用できるプロセスやスレッドの数が少なすぎる === |
||
+ | Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool |
||
− | 以下のようなエラーメッセージが表示される場合: |
||
+ | エラーを解消するために続く手順を試してください。サービスを停止して、{{ic|/var/lib/docker/}} を(必要に応じて)バックアップし、{{ic|/var/lib/docker/}} の中身を消してから、サービスを起動してみてください。詳しくは [https://github.com/docker/docker/issues/21304 GitHub issue] を参照。 |
||
− | java.lang.OutOfMemoryError: unable to create new native thread |
||
+ | === Failed to create some/path/to/file: No space left on device === |
||
− | fork failed: Resource temporarily unavailable |
||
+ | 以下のようにエラーメッセージが表示される場合: |
||
− | systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップインスニペットを作成してください: |
||
+ | ERROR: Failed to create some/path/to/file: No space left on device |
||
− | {{hc|/etc/systemd/system/docker.service.d/tasks.conf|<nowiki> |
||
+ | |||
− | [Service] |
||
+ | Docker イメージの作成・実行時、ディスク容量が十分に存在するにもかかわらず表示されるときは以下を確認してください: |
||
− | TasksMax=infinity |
||
+ | |||
− | </nowiki>}} |
||
+ | * [[Tmpfs]] が無効になっている、あるいは十分なメモリが割り当てられている。Docker が {{ic|/tmp}} にファイルを書き出そうとしていて、ディスク容量ではなくメモリ使用量が制限となっている可能性があります。 |
||
+ | * [[XFS]] を使っている場合、{{ic|/etc/fstab}} の ({{ic|/tmp}} や {{ic|/var/lib/docker}} がある) エントリから {{ic|noquota}} マウントオプションを削除すると良いかもしれません。詳しくは[[ディスククォータ]]を参照してください。Docker ストレージドライバーの {{ic|overlay2}} を使用するときは特に注意してください。 |
||
+ | * XFS クォータのマウントオプション ({{ic|uquota}}, {{ic|gquota}}, {{ic|prjquota}} など) がファイルシステムの再マウント時に失敗している。ルートファイルシステムでクォータを使うには、マウントオプションを {{ic|1=rootflags=}} [[カーネルパラメータ]]で initramfs に渡す必要があります。その場合、root ({{ic|/}}) ファイルシステムの マウントオプションとして {{ic|/etc/fstab}} に指定してはいけません。 |
||
+ | |||
+ | {{Note|XFS のクォータと Linux 標準の[[ディスククォータ]]には違いが存在します。詳しくは [http://inai.de/linux/adm_quota] を参照してください。}} |
||
+ | |||
+ | === Invalid cross-device link in kernel 4.19.1 === |
||
+ | |||
+ | docker 内で 'dpkg' のようなコマンドの実行に失敗する、例えば: |
||
+ | |||
+ | dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link |
||
+ | {{ic|1=overlay.metacopy=N}} [[カーネルパラメータ]] を追加するか、[https://github.com/docker/for-linux/issues/480 this issue] が解決するまで 4.18.x にダウングレードしてください。詳しくは [https://bbs.archlinux.org/viewtopic.php?id=241866 Arch forum] を参照。 |
||
− | その後、systemd をリロードして {{ic|docker.service}} を再起動してください。 |
||
== 参照 == |
== 参照 == |
||
− | * [https:// |
+ | * [https://www.docker.com Official website] |
+ | * [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux on docs.docker.com] |
||
* [http://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com |
* [http://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com |
2018年12月2日 (日) 01:30時点における版
Docker は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。
目次
- 1 インストール
- 2 設定
- 3 イメージ
- 4 Docker とイメージの削除
- 5 便利なヒント
- 6 トラブルシューティング
- 6.1 systemd 232 でコンテナが起動できない
- 6.2 Btrfs ファイルシステムで Docker イメージを消去
- 6.3 docker0 ブリッジが IP を取得できない / コンテナからインターネットにアクセスできない
- 6.4 デフォルトで使用できるプロセスやスレッドの数が少なすぎる
- 6.5 Error initializing graphdriver: devmapper
- 6.6 Failed to create some/path/to/file: No space left on device
- 6.7 Invalid cross-device link in kernel 4.19.1
- 7 参照
インストール
docker パッケージ、または開発版を使いたい場合は docker-gitAUR パッケージを インストール して下さい。次に docker.service
を 起動 して有効化してください。動作検証するために、次を実行:
# docker info
有効な vpn 接続がある場合 docker サービスの起動に失敗することがあることに注意して下さい。このような場合、docker サービスの起動前に vpn を切断してみて下さい。その後すぐに vpn に再接続できます。
docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker
グループに追加してください。
設定
ストレージドライバー
docker のストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである devicemapper
は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で devicemappper
を使用することは推奨されません。
Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。overlay2
が新しいドライバーです。
現在のストレージドライバーを確認するには # docker info | head
を実行してください。最近の docker 環境では overlay2
がデフォルトで使われます。
自分で選択したストレージドライバーを設定するには、/etc/docker/daemon.json
(無い場合は作成して下さい)を編集して下さい:
/etc/docker/daemon.json
{ "storage-driver": "overlay2" }
その後、docker を 再起動 して下さい。
オプションに関する詳細は ユーザーガイド を見てください。
daemon.json
の中のオプションの詳細は dockerd のドキュメント を見てください。
Remote API
ポート 4243
で Remote API を手動で開くには:
# /usr/bin/dockerd -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.d/socket.conf
[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 show docker --property Environment
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080
コンテナの設定
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
に追加する必要があります。
systemd-networkd 上に手動で定義したネットワークで 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
ファイルを編集して IPForward=kernel
を追加してください:
/etc/systemd/network/<interface>.network
[Network] ... IPForward=kernel ...
上記の設定でコンテナから IP フォワーディングが使えるようになります。
イメージの置き場所
デフォルトでは、docker のイメージは /var/lib/docker
に保存されます。置き場所は別のパーティションに移動することが可能です。
まず、docker.service
を停止してください。
docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを /var/lib/docker
から好きな場所に移動してください。
その後、docker.service
のドロップインスニペットを作成して、ExecStart
に --data-root
パラメータを追加してください:
/etc/systemd/system/docker.service.d/docker-storage.conf
[Service] ExecStart= ExecStart=/usr/bin/dockerd --data-root=/path/to/new/location/docker -H fd://
安全ではないレジストリ
もしプライベートレジストリに自己署名証明書を使うことに決めた場合、あなたが信頼すると宣言するまで Docker はその使用を拒否します。
docker.service
の ドロップインスニペット を追加して、--insecure-registry
パラメータを dockerd
に追加してください:
/etc/systemd/system/docker.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000
イメージ
Arch Linux
次のコマンドは archlinux/base x86_64 イメージを取得します。これはネットワーク、その他を削減したバージョンの Arch core です:
# docker pull archlinux/base
詳しくは README.md を参照してください。
完全な Arch base を得るには、上記から repo を clone して自分でイメージを作成してください。
$ git clone https://github.com/archlinux/archlinux-docker.git
'base' のみを含めるようにパッケージファイルを編集してください。そして実行:
# make docker-image
Debian
以下のコマンドで debian x86_64 イメージが取得されます:
# docker pull 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
Docker とイメージの削除
Docker を完全に削除したい場合は以下の手順に従ってください。
実行中のコンテナをチェック:
# docker ps
削除するホストで実行中の全てのコンテナを確認:
# docker ps -a
実行中のコンテナを停止:
# docker stop <CONTAINER ID>
停止しないコンテナを終了:
# docker kill <CONTAINER ID>
ID で指定して全てのコンテナを削除:
# docker rm <CONTAINER ID>
全ての Docker イメージを確認:
# docker images
ID で指定して全てのイメージを削除:
# docker rmi <IMAGE ID>
全ての Docker データを削除:
# rm -R /var/lib/docker
便利なヒント
実行中のコンテナの IP アドレスを取得するには:
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id>
172.17.0.37
それぞれの実行中のコンテナについて、/etc/hosts
で使うために名前と対応する IP アドレスを出力:
#!/usr/bin/env sh for ID in $(docker ps -q | awk '{print $1}'); do IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID") NAME=$(docker ps | grep "$ID" | awk '{print $NF}') printf "%s %s\n" "$IP" "$NAME" done
トラブルシューティング
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-networkd によって sysctl の設定が上書きされてしまいます。ネットワークプロファイルに IPForward=yes
を設定してください。詳しくは インターネット共有#パケット転送の有効化 を参照してください。
デフォルトで使用できるプロセスやスレッドの数が少なすぎる
以下のようなエラーメッセージが表示される場合:
# e.g. Java java.lang.OutOfMemoryError: unable to create new native thread # e.g. C, bash, ... fork failed: Resource temporarily unavailable
systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが (system.conf
を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のスニペットで docker.service
を 編集 してください:
# systemctl edit docker.service
[Service] TasksMax=infinity
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 を参照。
Failed to create some/path/to/file: No space left on device
以下のようにエラーメッセージが表示される場合:
ERROR: Failed to create some/path/to/file: No space left on device
Docker イメージの作成・実行時、ディスク容量が十分に存在するにもかかわらず表示されるときは以下を確認してください:
- Tmpfs が無効になっている、あるいは十分なメモリが割り当てられている。Docker が
/tmp
にファイルを書き出そうとしていて、ディスク容量ではなくメモリ使用量が制限となっている可能性があります。 - XFS を使っている場合、
/etc/fstab
の (/tmp
や/var/lib/docker
がある) エントリからnoquota
マウントオプションを削除すると良いかもしれません。詳しくはディスククォータを参照してください。Docker ストレージドライバーのoverlay2
を使用するときは特に注意してください。 - XFS クォータのマウントオプション (
uquota
,gquota
,prjquota
など) がファイルシステムの再マウント時に失敗している。ルートファイルシステムでクォータを使うには、マウントオプションをrootflags=
カーネルパラメータで initramfs に渡す必要があります。その場合、root (/
) ファイルシステムの マウントオプションとして/etc/fstab
に指定してはいけません。
Invalid cross-device link in kernel 4.19.1
docker 内で 'dpkg' のようなコマンドの実行に失敗する、例えば:
dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link
overlay.metacopy=N
カーネルパラメータ を追加するか、this issue が解決するまで 4.18.x にダウングレードしてください。詳しくは Arch forum を参照。