読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Docker

学習記録 Docker

第3章 Dockerコマンドリファレンス

dockerデーモンの管理

CentOS7環境では,systemctlコマンドでdockerサービスを起動する。

// dockerサービスの起動/停止/再起動
# systemctl start docker.service
# systemctl stop docker.service
# systemctl restart docker.service
// 稼動状態の確認
# systemctl status docker.service
// dockerサービスのログを全て表示する
# journalctl -u docker.service -l --no-pager

dockerデーモンの起動オプションは設定ファイルを/etc/sysconfig/dockerのOPTIONSに指定する。

オプション 説明
-D デバッグモード。journalctlで表示されるログに詳細なデバッグログが記載される。
--bip=<サブネット> 仮想ブリッジdocker0に割り当てるサブネット
--dns= コンテナに設定するDNSサーバ
-mtu= コンテナの仮想NICに設定するMTU(送信パケットの最大サイズ)
--ip= ポートフォワーディングを設定する際にホストがListenするIPアドレス(デフォは0.0.0.0)

-Dオプション以外はネットワークに関する設定になっている。
--dnsオプションで指定したDNSサーバのIPアドレスは,コンテナの起動時にコンテナの/etc/resolv.confに設定される。(--dnsを指定しなかった場合,ホストの/etc/resolv.confと同じDNSサーバを使用する)
--ipオプションはポートフォワーディングの設定に関連する。外部ネットワークからコンテナに接続する場合はホストLinuxIPアドレスを使用することになるが,ホストが複数IPアドレスを持っている環境で,特定のIPアドレスのみで接続を受け付けたいような場合に--ipオプションで接続を受け付けるIPアドレスを指定することになる。

※docker環境を初期化するには,/var/lib/docker以下のディレクトリを作りなおすようにすると良い。

# docker rm -f `docker ps -aq`
# systemctl stop docker.service
# rm -rf /var/ilb/docker/*
# systemctl start docker.service

コンテナの操作

コンテナへのリソース配分を制御するオプション
オプション 説明
-c, --cpu-shares コンテナに対するCPU時間の割当て比率(デフォは1024)
--cpuset-cpus コンテナが使用するCPUコアを指定
-m, --memory コンテナが使用するメモリの上限
--memory-swap スワップ領域を含めたメモリの上限

-cオプションは,同一のCPUコアで複数のプロセスが実行される場合に,各プロセスに対するCPU時間の配分を相対値で指定する。
デフォルトは1024で,「-c 2048」のようにするとこのコンテナ内のプロセスには2倍のCPU時間が配分される。
--cpuset-cpusオプションはコンテナ内のプロセスが実行されるCPUコアを制限する。
8コアの環境であれば0〜7の値でそれぞれのコアを指定し,「--cpuset-cpus 0,1,2,3(0-3)」のようにカンマ区切りかハイフンによって範囲指定を行う。デフォルトでは全てのCPUコアが利用できる。
-mオプションはコンテナ内のプロセスが使用するメモリの合計の上限値を設定する。
「-m 512m」とした場合,このコンテナは物理メモリとスワップ領域についてそれぞれ512Mバイトまで使用できることになる。この上限に達してコンテナ内のプロセスがメモリを確保できなくなった場合,通常はLinuxカーネルのOOM Killerによってコンテナ内のプロセスが強制停止される。
物理メモリ+スワップ領域の上限を変更したい場合は--memory-swapオプションを追加で指定する。
例えば「-m 512m --memory-swap 2048m」とした場合,物理メモリの使用量が512Mバイトを超えるとスワップアウトが開始され,スワップ領域の使用量が2048-512=1536Mバイトになるとプロセスが強制停止させられることになる。

ネットワーク接続の設定を行うオプション
オプション 説明
-p, --publish ポートフォワーディングを明示的に設定
--link 指定のコンテナ内のポートに接続するための環境変数を設定
--expose --linkオプションでほかのコンテナからの接続を許可するポートを指定
-P, --publish-all Expose指定されたポートについて,ポートフォワーディングを自動設定

-pオプションはポートフォワーディングの指定を明示的に行う。
例えば「-p 8000:80」は,ホストLinuxの8000番ポートで受けたパケットをコンテナ内の80番ポートに転送する。ホストLinux複数のIPを持っている場合,「-p 192.168.200.70:8000:80」のように特定のIPアドレスに対するパケットだけを転送することもできる。
--linkオプションは,同じホストLinuxで起動中のコンテナについて,ホストLinux上の仮想ブリッジ経由で直接接続できるようにする。例えば,「mysql01」という名前のコンテナが既に起動しており,TCP3306番ポートがExpose指定されている(DockerfileでEXPOSE指定されているか,コンテナ起動時に--exposeオプションで指定されているかのどちらか)としたとき,「--link mysql01:db」というオプションで新しいコンテナを起動すると,このコンテナの内部では環境変数「DB_PORT_3306_TCP_ADDR」と「DB_PORT_3306_TCP_PORT」に対してIPアドレスとポート番号が自動設定される。コンテナ内部からは,このIPアドレスとポート番号に接続すると,コンテナmysql01の3306番ポートに接続することができる。
(DockerfileのEXPOSEは,-pオプションでポートフォワーディングを行うポート番号とは関係なく,--linkオプションで接続するための設定であることに注意)
なお,コンテナを再起動した場合,コンテナ内部の仮想NICIPアドレスは新しく割当てられるため,接続元のコンテナも再起動して接続先のIPアドレスを示す環境ヘンスを再設定する必要があることに注意。
-Pオプションは,Expose指定された全てのポートに対してポートフォワーディングを自動設定する。転送元のポート番号は,ホストLinuxで未使用のポートからランダムに選択される。

コンテナにホストLinuxのディレクトリを割り当てるオプション
オプション 説明
-v, --volume ホストLinuxのディレクトリをコンテナ内に割り当てる
--volumes-from ほかのコンテナに割り当てたディレクトリを共有する

例えば,「-v /root/hostdir/:/tmp/cntrdir」とすると,コンテナ内のディレクトリ/tmp/cntrdirに対してホストLinuxの/root/hostdirがマウントされた状態になる。
(この際,SELinuxを使用している場合はホスト側のディレクトリにsvirt_sandbox_file_tというセキュリティコンテクストを設定しておく必要がある)

# chcon -Rt svirt_sandbox_file_t /root/work

また,「-v <コンテナ内のディレクトリ>」という形式で指定すると,ホストLinux上に専用のディレクトリが用意されたうえでコンテナ内のディレクトリに割当てられる。この場合,このコンテナを削除する際には,-vオプションを指定することでホストLinuxに用意されたディレクトリを削除できる。
なお,既存のコンテナイメージに対してVOLUMEの指定を確認するには,次のコマンドを使用できる。

# docker inspect -f '{{range $vol,$dir := .Config.Volumes}}{{println $vol}}{{end}}' <コンテナ名>