<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hidenba</id>
	<title>ArchWiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hidenba"/>
	<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Hidenba"/>
	<updated>2026-04-18T11:37:25Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.44.3</generator>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=Docker&amp;diff=12642</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=Docker&amp;diff=12642"/>
		<updated>2018-03-14T07:30:29Z</updated>

		<summary type="html">&lt;p&gt;Hidenba: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:仮想化]]&lt;br /&gt;
[[en:Docker]]&lt;br /&gt;
[[ru:Docker]]&lt;br /&gt;
[[zh-hant:Docker]]&lt;br /&gt;
{{Related articles start}}&lt;br /&gt;
{{Related|systemd-nspawn}}&lt;br /&gt;
{{Related|Linux Containers}}&lt;br /&gt;
{{Related|Vagrant}}&lt;br /&gt;
{{Related articles end}}&lt;br /&gt;
&lt;br /&gt;
[https://www.docker.com Docker] は軽量コンテナとしてあらゆるアプリケーションを詰めて運んで実行できるユーティリティです。&lt;br /&gt;
&lt;br /&gt;
== インストール ==&lt;br /&gt;
&lt;br /&gt;
{{Pkg|docker}} パッケージを[[pacman|インストール]]して {{ic|docker.service}} を[[systemd#ユニットを使う|起動]]してください。開発版を使いたい場合、{{AUR|docker-git}} をインストールしてください。動作検証するために、次を実行:&lt;br /&gt;
&lt;br /&gt;
 # docker info&lt;br /&gt;
&lt;br /&gt;
docker を通常ユーザーで実行できるようにしたい場合は、ユーザーを docker [[グループ]]に追加してからログインしなおしてください。&lt;br /&gt;
&lt;br /&gt;
{{Warning|ユーザーを {{ic|docker}} グループに追加することは root にするのと同義です。詳しくは [https://github.com/docker/docker/issues/9976] や [https://docs.docker.com/engine/security/security/] を参照。}}&lt;br /&gt;
&lt;br /&gt;
{{Note|{{Pkg|linux}} 4.15.0-1の時点で、特定のプログラム（&#039;&#039;apt-get&#039;&#039;など）で必要な&#039;&#039;vsyscalls&#039;&#039;は、カーネルの設定ではデフォルトで無効になっています。再度有効にするには、{{ic|1=vsyscall=emulate}}を[[カーネルパラメータ]]に追加します。さらに詳しい情報は{{bug|57336}}を参照。}}&lt;br /&gt;
&lt;br /&gt;
== 設定 ==&lt;br /&gt;
&lt;br /&gt;
=== ストレージドライバー ===&lt;br /&gt;
&lt;br /&gt;
docker のストレージドライバー (グラフドライバー) は性能に大きな影響を与えます。ストレージドライバーはコンテナのイメージレイヤーを効率的に保存し、複数のイメージでレイヤーを共有している場合、ディスク容量を使用するレイヤーはひとつだけになります。デフォルトのストレージドライバーである {{ic|devicemapper}} は次善的な性能しか発揮できず、ハードディスクでは問題外です。したがって、プロダクション環境で {{ic|devicemappper}} を使用することは推奨されません。&lt;br /&gt;
&lt;br /&gt;
Arch Linux のカーネルは新しいため、古いドライバーを使用する意味はありません。{{ic|overlay2}} が新しいドライバーです。&lt;br /&gt;
&lt;br /&gt;
現在のストレージドライバーを確認するには {{ic|# docker info {{!}} head}} を実行してください。最近の docker 環境では {{ic|overlay2}} がデフォルトで使われます。&lt;br /&gt;
&lt;br /&gt;
ストレージドライバーを設定するには、[[ドロップインファイル]]を作成して {{ic|dockerd}} に {{ic|-s}} オプションを指定してください:&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=&lt;br /&gt;
ExecStart=/usr/bin/dockerd -H fd:// -s overlay2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ic|ExecStart}} を置き換えるには {{ic|1=ExecStart=}} を上記のように設定する必要があります。&lt;br /&gt;
&lt;br /&gt;
オプションに関する詳細は [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ ユーザーガイド] を見てください。&lt;br /&gt;
&lt;br /&gt;
=== Remote API を開く ===&lt;br /&gt;
&lt;br /&gt;
ポート {{ic|4243}} で Remote API を手動で開くには:&lt;br /&gt;
&lt;br /&gt;
 # /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock&lt;br /&gt;
&lt;br /&gt;
{{ic|-H tcp://0.0.0.0:4243}} で Remote API が開かれます。&lt;br /&gt;
&lt;br /&gt;
{{ic|-H unix:///var/run/docker.sock}} はターミナルからホストマシンにアクセスできるようにします。&lt;br /&gt;
&lt;br /&gt;
==== Remote API と systemd ====&lt;br /&gt;
&lt;br /&gt;
docker デーモンで Remote API を起動するには、以下の内容で[[ドロップインファイル]]を作成してください:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=&lt;br /&gt;
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== デーモンのソケットの設定 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;docker&#039;&#039; デーモンはデフォルトで [[Wikipedia:ja:UNIXドメインソケット|Unix ソケット]]を使います。特定のポートを listen させるには、{{ic|/etc/systemd/system/docker.socket}} を編集して、{{ic|ListenStream}} を使用したいポートに置き換えてください:&lt;br /&gt;
&lt;br /&gt;
 [Socket]&lt;br /&gt;
 ListenStream=0.0.0.0:2375&lt;br /&gt;
&lt;br /&gt;
=== プロキシ ===&lt;br /&gt;
&lt;br /&gt;
プロキシの設定は2つに分けられます。ひとつは Docker デーモンのホストの設定で、もうひとつはコンテナからプロキシにアクセスできるようにするための設定です。 &lt;br /&gt;
&lt;br /&gt;
==== デーモンのプロキシの設定 ====&lt;br /&gt;
&lt;br /&gt;
以下の内容で[[ドロップインファイル]]を作成:&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2=&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;HTTP_PROXY=192.168.1.1:8080&amp;quot;&lt;br /&gt;
Environment=&amp;quot;HTTPS_PROXY=192.168.1.1:8080&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Note|上記ではプロクシサーバが {{ic|192.168.1.1}} になっています、{{ic|127.0.0.1}} は使わないでください。}}&lt;br /&gt;
&lt;br /&gt;
変更を適用: {{ic|# systemctl daemon-reload}}。&lt;br /&gt;
&lt;br /&gt;
設定がロードされたことを確認: {{hc|# systemctl show docker --property Environment|2=Environment=HTTP_PROXY=192.168.1.1}}&lt;br /&gt;
&lt;br /&gt;
Docker を再起動: {{ic|# systemctl restart docker}}。&lt;br /&gt;
&lt;br /&gt;
==== コンテナの設定 ====&lt;br /&gt;
&lt;br /&gt;
{{ic|docker.service}} ファイルの設定はコンテナには適用されません。{{ic|Dockerfile}} で {{ic|ENV}} 変数を設定する必要があります:&lt;br /&gt;
&lt;br /&gt;
 FROM base/archlinux&lt;br /&gt;
 ENV http_proxy=&amp;quot;&amp;lt;nowiki&amp;gt;http://192.168.1.1:3128&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
 ENV https_proxy=&amp;quot;&amp;lt;nowiki&amp;gt;https://192.168.1.1:3128&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[https://docs.docker.com/engine/reference/builder/#env Docker] は Dockerfile で {{ic|ENV}} を使って設定する方法について詳しい情報を提供しています。&lt;br /&gt;
&lt;br /&gt;
=== DNS の設定 ===&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、docker はホストマシンにある {{ic|resolv.conf}} と同じ中身の {{ic|resolv.conf}} をコンテナに作成します。その際、ローカルアドレス (例: {{ic|127.0.0.1}}) は消されます。それによって {{ic|resolv.conf}} が空ファイルになった場合、Google の DNS サーバーが記述されます。[[Dnsmasq]] などのサービスを利用して名前を解決するようにしたい場合、設定が消されないように docker のネットワークインターフェイス用にエントリを {{ic|/etc/resolv.conf}} に追加する必要があります。&lt;br /&gt;
&lt;br /&gt;
=== 手動で定義したネットワークで Docker を実行 ===&lt;br /&gt;
&lt;br /&gt;
バージョン 220 以上の [[systemd-networkd]] を使ってネットワークを手動設定している場合、Docker で起動したコンテナがネットワークにアクセスできない場合があります。バージョン 220 から、ネットワークの転送設定 ({{ic|net.ipv4.conf.&amp;lt;interface&amp;gt;.forwarding}}) はデフォルトで {{ic|off}} になっており IP フォワーディングが使えません。また、コンテナの中で Docker によって有効になる {{ic|net.ipv4.conf.all.forwarding}} の設定と衝突します。&lt;br /&gt;
&lt;br /&gt;
インターネットにアクセスするには、Docker のホスト側で {{ic|/etc/systemd/network/}} にある {{ic|&amp;lt;interface&amp;gt;.network}} ファイルを編集して以下のブロックを追加してください:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/network/&amp;lt;interface&amp;gt;.network|2=&lt;br /&gt;
[Network]&lt;br /&gt;
...&lt;br /&gt;
IPForward=kernel&lt;br /&gt;
...}}&lt;br /&gt;
&lt;br /&gt;
上記の設定でコンテナから IP フォワーディングが使えるようになります。&lt;br /&gt;
&lt;br /&gt;
=== イメージの置き場所 ===&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、docker のイメージは {{ic|/var/lib/docker}} に保存されます。置き場所は別のパーティションに移動することが可能です。&lt;br /&gt;
&lt;br /&gt;
まず、{{ic|docker.service}} を[[systemd#ユニットを使う|停止]]してください。docker イメージを起動したことがある場合、イメージが完全にアンマウントされていることを確認します。そうしたら、イメージを {{ic|/var/lib/docker}} から好きな場所に移動してください。&lt;br /&gt;
&lt;br /&gt;
その後、{{ic|docker.service}} の[[systemd#ドロップインファイル|ドロップインファイル]]を作成して、{{ic|ExecStart}} に {{ic|--data-root}} パラメータを追加してください:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2=&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart= &lt;br /&gt;
ExecStart=/usr/bin/dockerd --data-root=&#039;&#039;/path/to/new/location/docker&#039;&#039; -H fd://}}&lt;br /&gt;
&lt;br /&gt;
最後に、設定をリロードして {{ic|docker.service}} を再度[[起動]]します。&lt;br /&gt;
&lt;br /&gt;
== イメージ ==&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
次のコマンドは [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 イメージを取得します:&lt;br /&gt;
 # docker pull archlinux/base&lt;br /&gt;
&lt;br /&gt;
詳しくは [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md] を参照してください。&lt;br /&gt;
&lt;br /&gt;
=== Debian ===&lt;br /&gt;
以下のコマンドで [https://hub.docker.com/r/_/debian/ debian] x86_64 イメージが取得されます:&lt;br /&gt;
 # docker pull debian&lt;br /&gt;
&lt;br /&gt;
==== 手動 ====&lt;br /&gt;
&lt;br /&gt;
{{Pkg|debootstrap}} で Debian イメージを作成:&lt;br /&gt;
&lt;br /&gt;
 # mkdir jessie-chroot&lt;br /&gt;
 # debootstrap jessie ./jessie-chroot &amp;lt;nowiki&amp;gt;http://http.debian.net/debian/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # cd jessie-chroot&lt;br /&gt;
 # tar cpf - . | docker import - debian&lt;br /&gt;
 # docker run -t -i --rm debian /bin/bash&lt;br /&gt;
&lt;br /&gt;
=== Skype ===&lt;br /&gt;
&lt;br /&gt;
[[Skype#Docker]] を参照してください。&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux イメージとスナップショットリポジトリ ===&lt;br /&gt;
複数のイメージを作成した場合、アップデートによってパッケージのバージョンが食い違ってしまい問題が起こりやすくなります。Docker コンテナのパッケージのバージョンを統一するために、[https://registry.hub.docker.com/u/pritunl/archlinux/ Docker イメージとスナップショットリポジトリ] を利用することができます。スナップショットが作成された日に基づいて公式リポジトリから新しいパッケージをインストールすることができるようになります。&lt;br /&gt;
&lt;br /&gt;
 $ docker pull pritunl/archlinux:latest&lt;br /&gt;
 $ docker run --rm -t -i pritunl/archlinux:latest /bin/bash&lt;br /&gt;
&lt;br /&gt;
もしくは [[Arch Linux Archive]] を使って {{ic|/etc/pacman.d/mirrorlist}} を凍らせる方法もあります:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Server=https://archive.archlinux.org/repos/2020/01/02/$repo/os/$arch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker とイメージの削除 ==&lt;br /&gt;
&lt;br /&gt;
Docker を完全に削除したい場合は以下の手順に従ってください。&lt;br /&gt;
&lt;br /&gt;
{{Note|コマンドを実行する前にどういう意味なのか考えてください。何も考えずにコピーアンドペーストしてはいけません。}}&lt;br /&gt;
&lt;br /&gt;
実行中のコンテナをチェック:&lt;br /&gt;
&lt;br /&gt;
 # docker ps&lt;br /&gt;
&lt;br /&gt;
削除するホストで実行中の全てのコンテナを確認:&lt;br /&gt;
&lt;br /&gt;
 # docker ps -a&lt;br /&gt;
&lt;br /&gt;
実行中のコンテナを停止:&lt;br /&gt;
&lt;br /&gt;
 # docker stop &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
停止しないコンテナを終了:&lt;br /&gt;
&lt;br /&gt;
 # docker kill &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ID で指定して全てのコンテナを削除:&lt;br /&gt;
&lt;br /&gt;
 # docker rm &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
全ての Docker イメージを確認:&lt;br /&gt;
&lt;br /&gt;
 # docker images&lt;br /&gt;
&lt;br /&gt;
ID で指定して全てのイメージを削除:&lt;br /&gt;
&lt;br /&gt;
 # docker rmi &amp;lt;IMAGE ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
全ての Docker データを削除:&lt;br /&gt;
&lt;br /&gt;
 # rm -R /var/lib/docker&lt;br /&gt;
&lt;br /&gt;
== 便利なヒント ==&lt;br /&gt;
&lt;br /&gt;
実行中のコンテナの IP アドレスを取得するには:&lt;br /&gt;
&lt;br /&gt;
{{hc|&amp;lt;nowiki&amp;gt;$ docker inspect --format &#039;{{ .NetworkSettings.IPAddress }}&#039; &amp;lt;container-name OR id&amp;gt; &amp;lt;/nowiki&amp;gt;|&lt;br /&gt;
172.17.0.37}}&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
&lt;br /&gt;
=== systemd 232 でコンテナが起動できない ===&lt;br /&gt;
[[カーネルパラメータ]]として {{ic|1=systemd.legacy_systemd_cgroup_controller=yes}} を追加してください。詳しくは [https://github.com/opencontainers/runc/issues/1175 バグレポート] を参照。&lt;br /&gt;
&lt;br /&gt;
=== Btrfs ファイルシステムで Docker イメージを消去 ===&lt;br /&gt;
&lt;br /&gt;
[[btrfs]] ファイルシステムで docker イメージを削除すると {{ic|/var/lib/docker/btrfs/subvolumes/}} にサイズが0のイメージが残されてしまいます。これを削除しようとするとパーミッションエラーが表示されます:&lt;br /&gt;
 # docker rm bab4ff309870&lt;br /&gt;
 # rm -Rf /var/lib/docker/btrfs/subvolumes/*&lt;br /&gt;
 rm: cannot remove &#039;/var/lib/docker/btrfs/subvolumes/85122f1472a76b7519ed0095637d8501f1d456787be1a87f2e9e02792c4200ab&#039;: Operation not permitted&lt;br /&gt;
&lt;br /&gt;
このエラーは btrfs が docker イメージのためにサブボリュームを作成したのが原因です。したがって削除するときの正しいコマンドは次のようになります:&lt;br /&gt;
 # btrfs subvolume delete /var/lib/docker/btrfs/subvolumes/85122f1472a76b7519ed0095637d8501f1d456787be1a87f2e9e02792c4200ab&lt;br /&gt;
&lt;br /&gt;
=== docker0 ブリッジが IP を取得できない / コンテナからインターネットにアクセスできない ===&lt;br /&gt;
&lt;br /&gt;
Docker は自分で IP フォワーディングを有効にしますが、デフォルトでは systemd によって sysctl の設定が上書きされてしまいます。以下の設定によって上書きされないようにできます (全てのインターフェイスで有効):&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/network/ipforward.network|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Network]&lt;br /&gt;
IPForward=kernel&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/sysctl.d/99-docker.conf|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
&lt;br /&gt;
{{Note|systemd バージョン 220 では、Docker によって使われるブリッジが IP アドレスを消失することが確認されています。手動で定義したネットワークでは問題なく動作します。}}&lt;br /&gt;
&lt;br /&gt;
docker ブリッジが ip を消失する問題を回避するには、networkd でブリッジを &#039;&#039;Unmanaged&#039;&#039; に設定:&lt;br /&gt;
&lt;br /&gt;
 # cat &amp;gt; /etc/systemd/network/50-docker.network &amp;lt;&amp;lt;EOF&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=docker0&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 IPForward=kernel&lt;br /&gt;
 &lt;br /&gt;
 [Link]&lt;br /&gt;
 Unmanaged=true&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
最後に {{ic|systemd-networkd}} と {{ic|docker}} サービスを[[再起動]]してください。&lt;br /&gt;
&lt;br /&gt;
=== デフォルトで使用できるプロセスやスレッドの数が少なすぎる ===&lt;br /&gt;
&lt;br /&gt;
以下のようなエラーメッセージが表示される場合:&lt;br /&gt;
&lt;br /&gt;
 java.lang.OutOfMemoryError: unable to create new native thread&lt;br /&gt;
&lt;br /&gt;
 fork failed: Resource temporarily unavailable&lt;br /&gt;
&lt;br /&gt;
systemd によって許可されるプロセスの数を調整する必要があります。デフォルトは 500 ですが ({{ic|system.conf}} を参照)、複数の docker コンテナを動作させるには少なすぎます。以下のようなドロップインファイルを作成してください:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/tasks.conf|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
TasksMax=infinity&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
その後、systemd をリロードして {{ic|docker.service}} を再起動してください。&lt;br /&gt;
&lt;br /&gt;
=== Error initializing graphdriver: devmapper ===&lt;br /&gt;
&lt;br /&gt;
{{ic|systemctl}} で docker の起動に失敗して以下のエラーが表示される場合:&lt;br /&gt;
&lt;br /&gt;
 Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool&lt;br /&gt;
&lt;br /&gt;
サービスを停止して、{{ic|/var/lib/docker/}} をバックアップし、{{ic|/var/lib/docker/}} の中身を消してから、サービスを起動してみてください。詳しくは [https://github.com/docker/docker/issues/21304 GitHub issue] を参照。&lt;br /&gt;
&lt;br /&gt;
== 参照 ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux on docs.docker.com]&lt;br /&gt;
* [http://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com&lt;br /&gt;
* [[Wikipedia:ja:Docker]]&lt;/div&gt;</summary>
		<author><name>Hidenba</name></author>
	</entry>
</feed>