Docker 入門
Dockerのユースケース、機能、使用方法をまとめました。
Docker 概要
Docker 向き・不向き
向き : 日々変化するようなシステム
不向き : 絶対に停止しては困るようなミッションクリティカルなシステムなど。構成を少しでも変更すると、業務に大きな影響がでることが考えられるようなもの
コンテナ管理ソフトウェア
Podman
Docker
LXC(Linuxコンテナ)
LXD
Virtuozzo
OpenVZ
プラットフォーム 比較
物理基盤
ハードウェア性能の教授
トランザクション処理向き
障害発生時の問題切り分けが比較的簡素
高可用性、無停止システムで採用
仮想化技術
ハイパーバイザーが介在
仮想的なハードウェアが存在
オーバーヘッドが存在
仮想マシンはファイルで管理
ゲストOSの起動、停止等の管理が必要
サーバー集約
リソースプール化に有用
コンテナ
ランタイムをパッケージ管理化したアプリ
オーバーヘッドがほぼゼロ
隔離空間でアプリを実行
ホストOSからプロセスとして見える
非常に軽量なアプリ環境を実現
ソフトウェア開発の工数削減
圧倒的な集約度
使用技術
名前空間
単一のOS環境で複数の分離された空間を実現するために使用
種類
ipc名前空間 : プロセス間通信の分離
mnt名前空間 : ファイルシステムのマウント情報の分離
net名前空間 : ネットワークインターフェイスを分離
pid名前空間 : プロセスの分離
user名前空間: ユーザーIDとグループIDを分離
uts名前空間 : UTS(Unix Time-Sharing System)名前空間。ホスト名やNISドメイン名などの分離
cgroups(Control Groups)
1つのホスト上で複数の分離空間として稼働するDockerコンテナが稼働する環境において、限られたハードウェア資源の利用制限は重要
CPU、メモリ、ブロックI/O等の制御
cgroupsのファイルシステムで管理される主な統計情報
blkio
cpuacct
cpuset
devices
freezer
hugetlb
memory
perf_event
ストレージドライバー
コンテナ・イメージ間の生成処理の際に使用
種類
overlay2, overlay
すべてのLinuxディストリビューションで推奨(overlayは古く非推奨)
ファイルシステム: xfs, ext4
aufs
Linuxカーネル3.13のUbuntuが稼働するDocker CEのバージョン18.06およびそれ以前のバージョンで推奨
ファイルシステム: xfs,ext4
devicemapper
シンプロビジョニング、スナップショット機能を使って管理
ブロックレベルでアクセス
ファイルシステム: direct-lvm
btrfs
Dockerエンジンが稼働するホストOS上にbtrfsファイルシステムが利用できる場合
ファイルシステム: btrfs
zfs
Dockerエンジンが稼働するホストOS上にzfsファイルシステムが利用できる場合
ファイルシステム: zfs
vfs
ファイルシステムの種類によらず利用できて安定した動作だが、性能が良くないため、テスト用途で使用
ファイルシステム: 任意
サーバーOS・コンテナ専用OS
サーバーOS
Docker以外の非コンテナ環境のサーバーoS環境と同様のOS管理が行える
新しい管理手法を習得する工数を削減できる
コンテナ専用OS
コンテナ専用OS自体の作法を学ぶ必要性
yumのようなパッケージ管理が利用できない場合があり、rpm-ostreeのようなOS環境全体の更新やローづバックなどの新しい仕組みを理解する必要がある。
例
Atomic Host
CoreOS
Snappy Ubuntu Core
RancherOS
ホストOSのディレクトリをDockerコンテナへマウント
bind mount : ホスト上のデバイスファイルやディレクトリ
volume : ホスト上のボリューム
tmpfs : ホストのメモリ
(参考) Docker実践ガイド 第2版
Dockerfile
以下の命令から構成されたイメージの元になるファイル。プロジェクトのルートに作製するが、別ディレクトリで別のファイル名としても作成でき、その場合はイメージのビルド時に-fオプションでファイル名を指定する。
命令
FROM
MAINTAINER
RUN
CMD
LABEL
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ARG
ONBUILD
STOPSIGNAL
HEALTHCHECK
SHELL
命令
RUN
可能であれば不要なレイヤーを使わないように以下のように1つのRUNにすることを推奨(その他の命令も同様)
LABEL
イメージにラベルを設定
ENV
環境変数の設定
EXPOSE
コンテナ実行時にポートをリッスンすることを指定。-p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートでホストからコンテナにアクセス可能になる。
ADDとCOPYの違いは、ADD命令は、圧縮ファイルの回答、展開が行われ、圧縮元のファイル自体はコピーされない。COPY命令は、元のファイルの状態でコピーされる。ADD命令はURLを指定することで、リモートサイトのファイルをダウンロードし、コピーもできる。 ADDの機能が必要ない場合はCOPYを使うことが推奨。
Dockerfile には少なくとも1つのCMDまたはENTRYPOINT命令を含むべき。
ENTRYPOINTもCMDもどちらもコマンドを実行できるが、CMD命令で指定した内容はdocker container runコマンド実行時にオプションで上書き可能。そのため、オプションで上書きすることがないベースのコマンドを記載しておき、上書きするようなオプション等をCMD命令に分けるなどの使い分けができる。
ARG 環境変数名[=default value]
docker image build時に--build-arg envname=envvalue のようにすることで動的な値をイメージに含めなくても良い
ONBUILD
ベースのイメージを作製して、派生版のイメージ作製するといった運用のときに使用。 ベースのDockerfileにおいて、派生版で実行させたいコマンドのベースをONBUILD命令に記述しておくことで、ベースのイメージをビルド時にはONBUILD命令の行を除いた内容でベースのDockerイメージが作製され、派生版のDockerイメージは、派生版のDockerfileのコマンドと、ベースのDockerfile内のONBUILD命令に指定したコマンドをあわせたもので構成される。派生版のDockerfileではFROMでベースのイメージ名を指定する。
STOPSIGNAL
コンテナを終了する時に送信するための、システムコール・シグナルを設定
HEALTHCHECK
オプション、および、命令を続けることで死活監視を行うことができる。docker container lsコマンドのSTATUS列にhealthyのように確認できる。
Dockerfileに記述しなくてもdocker container runコマンドのオプションで指定可能
形式
HEALTHCHECK [option] CMD commandコマンドコンテナ内でコマンドを実行して、コンテナの正常性を確認
HEALTHCHECK NONE
オプションの種類
--interval=--timeout=--retries=
例
SHELL
SHELL命令以降は、指定したシェルで実行。 Windowsで便利。ネイティブなシェルcmdとpowershellだけでなく、shも指定可能。
USER
利用するには Dockerfile でユーザとグループを RUN groupadd -r postgres && useradd -r -g postgres postgres のように作成
WORKDIR
移動にはRUN命令でcdコマンドを実行せずにWORKDIR命令を使用する 読みやすさ、トラブルシュートのしやすさ、維持のしやすさが増す。
Others
Dockerコンテナをすぐに終了させない方法として、
tail -f /dev/nullやプロセスをフォアグラウンドで実行(ENTRYPOINT ["usr/sbin/httpd", "-DFOREGROUND"])する方法などがある環境変数対応
以下のデフォルト値設定も可能
${val:-char}${val:+char}
パーサ・ディレクティブ
全てのパーサ・ディレクティブは Dockerfile の限りなく上に書くべき
Dockerfile 中では、次に続く行にも影響を与える
種類
escape : Windowsのディレクトリを扱うとき、
COPY testfile.txt c:\\のようにすると、2つめのバックスラッシュが新しい行のためのエスケープとして扱われるため、エスケープ文字をバッククォートに設定するような使い方をする# escape=\(default)# escape=```` `
References
Dockerfileの仕様は以下を参照
Dockerfileの書き方の例は以下を参照
Docker Networking
デフォルトで持つネットワークは、ホストOS上でdocker0というブリッジインターフェイス、docker network lsコマンドで確認すると、bridgeというネットワークが作製されている。
docker network createコマンドでサブネットのCIDRを指定して固定IPアドレスで起動することもできる。docker container runコマンド指定時に--networkオプションで指定したネットワークを指定し、--ipコマンドでIPアドレスを指定。
コンテナ間通信として、docker container runコマンド実行時に--link image:tagのようにlink機能。ただし、Docker社によると将来削除の可能性がある。
マルチホスト上でのコンテナ間通信
weave
etcd+flannel
Docker Swarm
ネットワーキングの実現方法
オーバーレイネットワーク(VXLAN) : Docker Swarmで利用
MACVLAN
DockerホストのNICに複数のMACアドレスとIPアドレスを割り当てることでVLANを形成
ホストOSと同じIP空間にコンテナを所属させたい場合に有用
Docker Swarm
Dockerエンジン搭載のクラスタリング機能
docker networkコマンドを併用マネージャノードとワーカーノードで構成
HAのため、マネージャノードを奇数台の複数台で構成することも可能
アプリケーションの実行単位をサービスとして管理(
docker serviceコマンドで操作可能)コンテナの配備はマネージャノードで行う
docker stackという複数のサービスをグループ化する機能
Docker Compose
Dockerコンテナを一括で構築、連携、管理することで管理負荷を低減
Docker Machine
パブリッククラウドのインスタンス上や仮想環境における仮想マシン上のDockerホストを管理するソフトウェア
Docker Private Repository(DPR)
組織内に閉じたDockerレジストリ
マイグレーション
CRIUというチェックポイントを作成し、そのチェックポイントを指定してコンテナを開始させる
リソース管理
CPU
--cpuset-cpus=0のようにホストOS側のCPUコア番号を指定--cpu-shares=1024のようにCPU割当時間--cpusオプションでCPUリソースの上限の割合
メモリ
-m 512mオプションのように制限
ディスクI/O帯域幅
--device-write-bps=/dev/sdb:1mbのようにホストOSのデバイス名に対して書き込みに対するディスクI/Oの帯域幅を制限
Get Started
Dockerコンテナ
Dockerでコンテナを動作させてみる。
test.shという名前で以下のファイルを作成。
Dockerfile
作製したイメージを確認
作製したイメージからコンテナを稼働
作製したコンテナを確認
コンテナ内で稼働するOSのシェルにアクセス。
コンテナのIPアドレスも確認可能
Docker Compose
ホストOS用のディレクトリ作製
Docker Composeのバージョン確認
Docker Composeによりコンテナを起動
ブラウザからhttp://localhost:8000でアクセスできるようになります。
開いた画面でWordpressの設定を行う。
Database Name: mysql
Usename: root
Password: password123
Database Host: 172.20.0.2
Table Prefix: wp_
Wordpressのアカウント情報の設定を行う。
Site Title: Sample Blog
Usename: hayashier
Password: Test1234
Confirm Password: Confirm use of weak passwordにチェック
Your Email: sample@hayashier.com
Search Engine Visibility: Discourage search engines from indexing this siteにチェック
Docker Composeにより起動したコンテナを片付ける。
Checking
イメージ一覧確認で、wordpressとmariadbのイメージが作製されていることを確認
Docker Composeによるプロセス一覧
Wordpressのコンテナに割り当てられたIPアドレスを確認
MariaDBのコンテナに割り当てられたIPアドレスを確認。また、データベース一覧を確認
Ctrl-CでDocker Composeから抜けるとコンテナも終了。-dでデーモンとして起動している場合は以下のように停止したりコンテナを削除することができる。
Commands
Dockerのシステム情報の表示。
Dockerのバージョン表示
統計情報表示
コンテナ一覧
コンテナの標準出力および標準エラーのストリームを表示。
イメージのファイルへの書き出しと読み込み
コンテナのエクスポート、インポート
docker image save, docker image loadとの違いは、docker container export,docker image importを使ったバックアップ、リストアでは、データボリュームとして定義されたディレクトリが除外される。
コンテナの詳細表示
-f '{{.NetworkSettings.IPAddress}}'のようにして取得項目をフィルタリングする。
環境変数の確認
システムのベインと表示
イメージ情報のキーと署名に関する情報確認
ボリューム一覧
Error
ERROR: Pool overlaps with other one on this address space
docker-compose実行前にも同じコマンドを実行しており、ネットワークが既に作られており重複していたことが原因
対象のネットワークを特定し、削除する
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
(参考) Macでdyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
Last updated