「Docker」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(4人の利用者による、間の15版が非表示)
2行目: 2行目:
 
[[en:Docker]]
 
[[en:Docker]]
 
[[ru:Docker]]
 
[[ru:Docker]]
  +
[[zh-hant:Docker]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|systemd-nspawn}}
 
{{Related|systemd-nspawn}}
 
{{Related|Linux Containers}}
 
{{Related|Linux Containers}}
{{Related4|Lxc-systemd}}
 
 
{{Related|Vagrant}}
 
{{Related|Vagrant}}
 
{{Related articles end}}
 
{{Related articles end}}
   
[http://www.docker.io Docker] は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。
+
[https://www.docker.com Docker] は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。
   
 
== インストール ==
 
== インストール ==
   
[[公式リポジトリ]]にある {{Pkg|docker}} パッケージを[[pacman|インストール]]して {{ic|docker.service}} を[[systemd#ユニットを使う|有効化]]してください。i686 アーキテクチャの場合、{{AUR|docker-git}} をインストールしてください。動作検証するために、次を実行:
+
{{Pkg|docker}} パッケージを[[pacman|インストール]]して {{ic|docker.service}} を[[systemd#ユニットを使う|起動]]してください。開発版を使いたい場合、{{AUR|docker-git}} をインストールしてください。動作検証するために、次を実行:
   
 
# docker info
 
# docker info
   
docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker グループに追加してからログインししてください:
+
docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker [[グループ]]に追加してからログインしなおしてください
   
  +
{{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
 
   
 
== 設定 ==
 
== 設定 ==
   
  +
=== ストレージドライバー ===
{{ic|/etc/systemd/system/docker.service}} を以下のように編集してください、{{ic|http_proxy}} はプロキシサーバーに {{ic|-g <path>}} は docker のホームに置き換えて下さい。デフォルトのパスは {{ic|/var/cache/docker}} です。
 
   
  +
docker のストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである {{ic|devicemapper}} は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で {{ic|devicemappper}} を使用することは推奨されません。
[Service]
 
Environment="http_proxy=192.168.1.1:3128"
 
ExecStart=
 
ExecStart=/usr/bin/docker -d -g /var/yourDockerDir
 
   
  +
Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。{{ic|overlay2}} が新しいドライバーです。
{{Note|上記ではプロクシサーバが {{ic|192.168.1.1}} になっています、{{ic|127.0.0.1}} は使わないでください。}}
 
   
  +
現在のストレージドライバーを確認するには {{ic|# docker info {{!}} head}} を実行してください。最近の docker 環境では {{ic|overlay2}} がデフォルトで使われます。
''docker'' デーモンはデフォルトで [[Wikipedia:ja:UNIXドメインソケット|Unix ソケット]]を使います。特定のポートで待機させるには、{{ic|/etc/systemd/system/docker.socket}} を編集して、{{ic|ListenStream}} を使用したいポートに置き換えてください:
 
  +
  +
ストレージドライバーを設定するには、[[ドロップインファイル]]を作成して {{ic|dockerd}} に {{ic|-s}} オプションを指定してください:
  +
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=
  +
[Service]
  +
ExecStart=
  +
ExecStart=/usr/bin/dockerd -H fd:// -s overlay2
  +
}}
  +
  +
{{ic|ExecStart}} を置き換えるには {{ic|1=ExecStart=}} を上記のように設定する必要があります。
  +
  +
オプションに関する詳細は [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ ユーザーガイド] を見てください。
  +
  +
=== 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 unix:///var/run/docker.sock}} はターミナルからホストマシンにアクセスできるようにします。
  +
  +
==== Remote API と systemd ====
  +
  +
docker デーモンで Remote API を起動するには、以下の内容で[[ドロップインファイル]]を作成してください:
  +
  +
{{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
  +
}}
  +
  +
=== デーモンのソケットの設定 ===
  +
  +
''docker'' デーモンはデフォルトで [[Wikipedia:ja:UNIXドメインソケット|Unix ソケット]]を使います。特定のポートを listen させるには、{{ic|/etc/systemd/system/docker.socket}} を編集して、{{ic|ListenStream}} を使用したいポートに置き換えてください:
   
 
[Socket]
 
[Socket]
 
ListenStream=0.0.0.0:2375
 
ListenStream=0.0.0.0:2375
   
  +
=== プロキシ ===
== Docker 0.9.0 -- 1.2.x と LXC ==
 
バージョン 0.9.0 から Docker は LXC に依存しないでコンテナを起動できる ''libcontainer'' という新しい方法を提供しています。
 
   
  +
プロキシの設定は2つに分けられます。ひとつは Docker デーモンのホストの設定で、もうひとつはコンテナからプロキシにアクセスできるようにするための設定です。
lxc exec ドライバーや -lxc-conf オプションは将来的には削除される可能性があります [https://github.com/docker/docker/pull/5797]。
 
   
  +
==== デーモンのプロキシの設定 ====
今後、デフォルトで Docker 0.9.0+ で管理されるコンテナで {{ic|lxc-attach}} を使用する必要がなくなります。Docker デーモンを実行するには引数として {{ic|-e lxc}} が必要です。
 
   
  +
以下の内容で[[ドロップインファイル]]を作成:
{{ic|/etc/systemd/system/docker.service.d/}} 下に {{ic|lxc.conf}} という名前のファイルを以下の内容で作成することができます:
 
  +
{{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}} は使わないでください。}}
[Service]
 
ExecStart=
 
ExecStart=/usr/bin/docker -d -e lxc
 
   
  +
変更を適用: {{ic|# systemctl daemon-reload}}。
== Skype ==
 
   
  +
設定がロードされたことを確認: {{hc|# systemctl show docker --property Environment|2=Environment=HTTP_PROXY=192.168.1.1}}
[[Skype#Docker]] を参照してください。
 
   
  +
Docker を再起動: {{ic|# systemctl restart docker}}。
== i686 イメージの作成 ==
 
i686 アーキテクチャでは、次のコマンドを使って取得した x86_64 のイメージを使用することは'''できません''':
 
   
  +
==== コンテナの設定 ====
# docker pull base/archlinux
 
   
  +
{{ic|docker.service}} ファイルの設定はコンテナには適用されません。{{ic|Dockerfile}} で {{ic|ENV}} 変数を設定する必要があります:
=== ArchLinux イメージ ===
 
代わりに、[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}} を同一のフォルダにダウンロードしてください。そして、スクリプトに実行可能属性を付与して実行してください:
 
   
  +
FROM base/archlinux
$ chmod +x mkimage-arch.sh
 
  +
ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>"
$ cp /etc/pacman.conf ./mkimage-arch-pacman.conf # or get a pacman.conf from somewhere else
 
  +
ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>"
$ LC_ALL=C ./mkimage-arch.sh # LC_ALL=C because the script parses the console output
 
# docker run -t -i --rm archlinux /bin/bash # try it
 
   
  +
[https://docs.docker.com/engine/reference/builder/#env Docker] は Dockerfile で {{ic|ENV}} を使って設定する方法について詳しい情報を提供しています。
ネットワーク接続や CPU が遅い場合は、ビルドのタイムアウト時間を伸ばすことができます:
 
$ sed -i 's/timeout 60/timeout 120/' mkimage-arch.sh
 
   
=== Debian イメージ ===
+
=== DNS の設定 ===
   
  +
デフォルトでは、docker はホストマシンにある {{ic|resolv.conf}} と同じ中身の {{ic|resolv.conf}} をコンテナに作成します。その際、ローカルアドレス (例: {{ic|127.0.0.1}}) は消されます。それによって {{ic|resolv.conf}} が空ファイルになった場合、Google の DNS サーバーが記述されます。[[Dnsmasq]] などのサービスを利用して名前を解決するようにしたい場合、設定が消されないように docker のネットワークインターフェイス用にエントリを {{ic|/etc/resolv.conf}} に追加する必要があります。
[[AUR]] の {{AUR|debootstrap}} で Debian イメージを作成:
 
   
  +
=== 手動で定義したネットワークで Docker を実行 ===
# mkdir wheezy-chroot
 
  +
# debootstrap wheezy ./wheezy-chroot http://http.debian.net/debian/
 
  +
バージョン 220 以上の [[systemd-networkd]] を使ってネットワークを手動設定している場合、Docker で起動したコンテナがネットワークにアクセスできない場合があります。バージョン 220 から、ネットワークの転送設定 ({{ic|net.ipv4.conf.<interface>.forwarding}}) はデフォルトで {{ic|off}} になっており IP フォワーディングが使えません。また、コンテナの中で Docker によって有効になる {{ic|net.ipv4.conf.all.forwarding}} の設定と衝突します。
# cd wheezy-chroot
 
  +
  +
インターネットにアクセスするには、Docker のホスト側で {{ic|/etc/systemd/network/}} にある {{ic|<interface>.network}} ファイルを編集して以下のブロックを追加してください:
  +
  +
{{hc|/etc/systemd/network/<interface>.network|2=
  +
[Network]
  +
...
  +
IPForward=kernel
  +
...}}
  +
  +
上記の設定でコンテナから IP フォワーディングが使えるようになります。
  +
  +
=== イメージの置き場所 ===
  +
  +
デフォルトでは、docker のイメージは {{ic|/var/lib/docker}} に保存されます。置き場所は別のパーティションに移動することが可能です。
  +
  +
まず、{{ic|docker.service}} を[[systemd#ユニットを使う|停止]]してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。
  +
  +
その後、{{ic|docker.service}} の[[systemd#ドロップインファイル|ドロップインファイル]]を作成して、{{ic|ExecStart}} に {{ic|--data-root}} パラメータを追加してください:
  +
  +
{{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://}}
  +
  +
最後に、設定をリロードして {{ic|docker.service}} を再度[[起動]]します。
  +
  +
== イメージ ==
  +
=== Arch Linux ===
  +
次のコマンドは [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 イメージを取得します:
  +
# docker pull archlinux/base
  +
  +
詳しくは [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md] を参照してください。
  +
  +
=== Debian ===
  +
以下のコマンドで [https://hub.docker.com/r/_/debian/ debian] x86_64 イメージが取得されます:
  +
# docker pull debian
  +
  +
==== 手動 ====
  +
  +
{{Pkg|debootstrap}} で Debian イメージを作成:
  +
  +
# mkdir jessie-chroot
  +
# debootstrap jessie ./jessie-chroot <nowiki>http://http.debian.net/debian/</nowiki>
  +
# 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
  +
  +
=== Skype ===
  +
  +
[[Skype#Docker]] を参照してください。
  +
  +
=== 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
  +
  +
もしくは [[Arch Linux Archive]] を使って {{ic|/etc/pacman.d/mirrorlist}} を凍らせる方法もあります:
  +
<nowiki>Server=https://archive.archlinux.org/repos/2020/01/02/$repo/os/$arch</nowiki>
  +
  +
== Docker とイメージの削除 ==
  +
  +
Docker を完全に削除したい場合は以下の手順に従ってください。
  +
  +
{{Note|コマンドを実行する前にどういう意味なのか考えてください。何も考えずにコピーアンドペーストしてはいけません。}}
  +
  +
実行中のコンテナをチェック:
  +
  +
# 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 アドレスを取得するには:
  +
  +
{{hc|<nowiki>$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-name OR id> </nowiki>|
  +
172.17.0.37}}
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
=== Docker infoエラー出力される ===
+
=== systemd 232コンテナ起動できない ===
  +
[[カーネルパラメータ]]として {{ic|1=systemd.legacy_systemd_cgroup_controller=yes}} を追加してください。詳しくは [https://github.com/opencontainers/runc/issues/1175 バグレポート] を参照。
  +
  +
=== Btrfs ファイルシステムで Docker イメージを消去 ===
  +
  +
[[btrfs]] ファイルシステムで docker イメージを削除すると {{ic|/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 の設定が上書きされてしまいます。以下の設定によって上書きされないようにできます (全てのインターフェイスで有効):
  +
  +
{{hc|/etc/systemd/network/ipforward.network|<nowiki>
  +
[Network]
  +
IPForward=kernel
  +
</nowiki>}}
  +
  +
{{hc|/etc/sysctl.d/99-docker.conf|<nowiki>
  +
net.ipv4.ip_forward = 1
  +
</nowiki>}}
  +
  +
# sysctl -w net.ipv4.ip_forward=1
  +
  +
{{Note|systemd バージョン 220 では、Docker によって使われるブリッジが IP アドレスを消失することが確認されています。手動で定義したネットワークでは問題なく動作します。}}
  +
  +
docker ブリッジが ip を消失する問題を回避するには、networkd でブリッジを ''Unmanaged'' に設定:
  +
  +
# cat > /etc/systemd/network/50-docker.network <<EOF
  +
[Match]
  +
Name=docker0
  +
  +
[Network]
  +
IPForward=kernel
  +
  +
[Link]
  +
Unmanaged=true
  +
EOF
  +
  +
最後に {{ic|systemd-networkd}} と {{ic|docker}} サービスを[[再起動]]してください。
  +
  +
=== デフォルトで使用できるプロセスやスレッドの数が少なすぎる ===
  +
  +
以下のようなエラーメッセージが表示される場合:
  +
  +
java.lang.OutOfMemoryError: unable to create new native thread
  +
  +
fork failed: Resource temporarily unavailable
  +
  +
systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップインファイルを作成してください:
  +
  +
{{hc|/etc/systemd/system/docker.service.d/tasks.conf|<nowiki>
  +
[Service]
  +
TasksMax=infinity
  +
</nowiki>}}
  +
  +
その後、systemd をリロードして {{ic|docker.service}} を再起動してください。
  +
  +
=== Error initializing graphdriver: devmapper ===
  +
  +
{{ic|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] を参照。
  +
  +
=== Failed to create some/path/to/file: No space left on device ===
  +
  +
Docker イメージの作成・実行時に以下のようにエラーメッセージが表示される場合:
   
  +
ERROR: Failed to create some/path/to/file: No space left on device
{{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?
 
   
  +
* [[Tmpfs]] が無効になっている、あるいは十分なメモリが割り当てられている。Docker が {{ic|/tmp}} にファイルを書き出そうとしていて、ディスク容量ではなくメモリ使用量が制限となっている可能性があります。
おそらく {{ic|bridge}} モジュールがロードされていません。{{ic|lsmod | grep bridge}} を実行することで確認できます。ロードされていない場合は、{{ic|modprobe}} を実行してロードするか、再起動してみてください (カーネルをアップグレードしたときに、bridge が最新のカーネル用にビルドされていた場合、再起動が必要になります)。
 
  +
* [[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 に渡す必要があります。その場合、{{ic|/etc/fstab}} でマウントオプションとして指定してはいけません。
   
  +
{{Note|XFS のクォータと Linux 標準の[[ディスククォータ]]には違いが存在します。詳しくは [http://inai.de/linux/adm_quota] を参照してください。}}
詳しくは [https://github.com/docker/docker/issues/6853 GitHub の issue] を見てください。
 
   
 
== 参照 ==
 
== 参照 ==
   
* [https://docs.docker.com/installation/archlinux/ Arch Linux on docs.docker.com]
+
* [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
  +
* [[Wikipedia:ja:Docker]]

2018年3月31日 (土) 21:10時点における版

関連記事

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

インストール

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

# docker info

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

警告: ユーザーを docker グループに追加することは root にするのと同義です。詳しくは [1][2] を参照。
ノート: linux 4.15.0-1 の時点で、特定のプログラム(apt-get など)で必要な vsyscalls は、カーネルの設定ではデフォルトで無効になっています。再度有効にするには、vsyscall=emulateカーネルパラメータに追加します。さらに詳しい情報は FS#57336 を参照。

設定

ストレージドライバー

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 を手動で開くには:

# /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 を編集して、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"
ノート: 上記ではプロクシサーバが 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 を実行

バージョン 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--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.service を再度起動します。

イメージ

Arch Linux

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

# docker pull archlinux/base

詳しくは README.md を参照してください。

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

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

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 '{{ .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 バージョン 220 では、Docker によって使われるブリッジが IP アドレスを消失することが確認されています。手動で定義したネットワークでは問題なく動作します。

docker ブリッジが ip を消失する問題を回避するには、networkd でブリッジを Unmanaged に設定:

# cat > /etc/systemd/network/50-docker.network <<EOF
[Match]
Name=docker0

[Network]
IPForward=kernel

[Link]
Unmanaged=true
EOF

最後に 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 を再起動してください。

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

Docker イメージの作成・実行時に以下のようにエラーメッセージが表示される場合:

ERROR: Failed to create some/path/to/file: No space left on device

ディスク容量が十分に存在するときは以下を確認してください:

  • Tmpfs が無効になっている、あるいは十分なメモリが割り当てられている。Docker が /tmp にファイルを書き出そうとしていて、ディスク容量ではなくメモリ使用量が制限となっている可能性があります。
  • XFS を使っている場合、/etc/fstab の (/tmp/var/lib/docker がある) エントリから noquota マウントオプションを削除すると良いかもしれません。詳しくはディスククォータを参照してください。Docker ストレージドライバーの overlay2 を使用するときは特に注意してください。
  • XFS クォータのマウントオプション (uquota, gquota, prjquota など) がファイルシステムの再マウント時に失敗している。ルートファイルシステムでクォータを使うには、マウントオプションを rootflags= カーネルパラメータで initramfs に渡す必要があります。その場合、/etc/fstab でマウントオプションとして指定してはいけません。
ノート: XFS のクォータと Linux 標準のディスククォータには違いが存在します。詳しくは [3] を参照してください。

参照