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