技術メモ

技術メモ

ラフなメモ

Dockerに入門したときのまとめ

Dockerことはじめ

今更ではありますが Docker に入門します。

Docker とは

  • Linux コンテナで稼働するアプロケーションの実行環境を構築/管理するツール
    • dockerd というデーモン
    • git が必須
    • アプリケーションの実行環境を、アプリケーションを構成するライブラリのように管理することができる
      • イメージのバージョン管理
    • アプリケーションごとにコンテナを分割して設定管理
  • コンテナイメージを作成する際は原則 Dockerfile から自動生成
    • コンテナを丸ごと入れ替える
  • プライベートな PaaS
  • CI/CD が実現しやすい

Docker の基礎技術

仮想化技術

  • Linux コンテナによるユーザー空間の分割

    • LXC(Linux Containers)
      • LXCはホストに依存
      • Docker はホストに依存しない実行環境(Docker Engineによる実行環境の標準化)
    • 仮想化ソフトウェアなしにOSのリソースを隔離に、仮想OS(=コンテナ)を提供する
    • ホストOS型の仮想化ではない
    • KVM ではない
    • コンテナではアプリケーションに必要なプロセスのみが起動する
      • 起動が早い
        • インフラを何度も構築することと相性がよい
  • コンテナに属さないユーザー空間を便宜上「ホストLinux」と呼ぶ

  • Docker サービスはホストLinux上で稼働する

Disk

  • コンテナごとに異なるディスク領域を割り当てることができる
  • chroot
  • ホストLinux上の特定のディレクトリがコンテナ内部にルートディレクトリとしてマウントされる
    • 実際にはホストLinuxの仮想ディスクにDockerのイメージをマウントする
    • Thin-Provisioning機能

ネットワーク

  • 異なるコンテナのプロセスは、ホストLinux上の仮想ブリッジ「docker0」を経由して通信する
  • 物理NICとvNICはポートフォワーディングされるイメージ

CPU/メモリ

  • それぞれのコンテナに割り当てるCPU、メモリを制御できる
  • cgroup
    • cgroup 自体はI/Oも制御できるけど、Dockerはそれをしていない

コンテナのライフサイクル

コンテナイメージ -> run -> (コンテナ起動時に)スナップショットを作成 -> stop ⇔ start ...

-> rm -> スナップショットを削除 -> commit -> ディスクイメージを複製して新しいイメージとして登録

Docker のメリット

  • 不変な実行環境による冪等性の確保
  • 実行環境構築とアプロケーション構成のコード化
  • 実行環境とアプリケーションの一体化によるポータビリティ性の向上
  • システムを構成するアプリケーションやミドルウェアの構成管理の容易さ

  • Infrastructure as Code

  • Immutable Infrastruscture

  • ステートレスな性質のもの(Webアプリケーション、APIサーバ)であれば有効

Docker コンテナと Docker イメージ

  • Docker イメージ

    • Docker コンテナを構成するためのファイルシステムや、実行するアプリケーションや設定をまとめたもの
    • コンテナを作成するために利用されるテンプレートのイメージ
  • Docker コンテナ

    • Docker イメージを基に作成され、具現化されたファイルシステムとアプリケーションが実行されている状態

基本操作

Dockerレジストリ

コンテナイメージの作成

  • Dockerfile

    • コンテナイメージを自動生成する際の手順をまとめたファイル
      • 命令を記述する
    • シェルと連携することも可能
  • Gitとの連携

    • あるディレクトリをGitのローカルリポジトリすることで特定のコンテナイメージ作成に関連するファイルをまとめてバージョン管理することができる
    • Gitのフック機能を利用するとDockerfileに変更があったタイミングでコンテナイメージをテストして、問題がなければコンテナイメージをコミットする...という運用が可能

複数コンテナの連携

同ホスト

別ホスト

公開イメージの活用

  • docker run ですぐに実行
  • Githubからコンテナイメージを作成

Docker コマンド

イメージの操作

イメージのビルド

$ docker image build -t ${イメージ名:タグ名} ${Dockerfile配置パス}
  • Dockerfileを任意を名称にする -f オプションで可能

  • --pull=true にすることで常にDockerレジストリからイメージをダウンロードする

    • 実際の運用では latest のイメージを使うのではなく、あるバージョンのイメージを使うことが多いので、 --pull オプションの出番は少ない

イメージの取得

docker image pull

イメージのタグづけ

docker image tag ${元イメージ名} ${新イメージ名}

イメージの公開

docker image push ${リポジトリ名:タグ}

イメージの一覧を取得

docker image ls

コンテナの停止

docker container stop ${コンテナID or コンテナ名}

コンテナの再起動

docker container restert ${コンテナID or コンテナ名}

コンテナの破棄

docker container rm ${コンテナID or コンテナ名}

標準出力の取得

docker container logs 

コンテナの操作

コンテナの実行

docker container run ${Dockerイメージ}
  • -d をつけることでデーモンとして動かすことができる
docker container run -d ${Dockerイメージ}
  • ポートフォワーディングは -p 9000:8080 で可能(この場合は9000 を 8080 にフォワーディング)
docker container run -d -p 9000:8080 ${Dockerイメージ}

コンテナ内でプログラムを実行

docker container exec -it ...

周辺ツール

Docker Compose

  • 複数コンテナを利用したアプリケーションの管理をしやすくするためのツール

Docker Swarm

  • コンテナオーケストレーションのツール
    • 複数ノードにまたいで多くのコンテナ群を管理する手法
  • Docker Compose を単一のサーバだけではなく、複数のサーバにまたいで複数のコンテナを管理できるようにしたツール
  • コンテナの増減
  • コンテナの最適配置
  • 負荷分散機能
  • デプロイのローリングアップデート

Kubernetes

参考

  • 「Docker実践入門」
  • 「Docker/Kubernetes実践コンテナ開発入門」

感想

プロダクト (MySQL,Nginx,...) を手軽に利用できるという意味では PaaS のように感じた - PaaS(パース)とは Platform as a Service の略で、アプリケーションを実行するためのプラットフォームをインターネットを介して提供するサービスのこと

Dockerfile に構築の手順を記載すれば Ansible すら不要か

ハマったポイント

Docker for Windows を利用して docker ps などのコマンドを実行した際に、connection refused... なるエラーが出ていた。原因は Docker Toolbox を前に install した際に設定されていた不要な環境変数が原因であった。以下の環境変数を削除したら問題なく使えた。

変数名
DOCKER_CERT_PATH C:\Users\Hoge.docker\machine\machines\default
DOCKER_HOST tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME default
DOCKER_TLS_VERIFY 1
DOCKER_TOOLBOX_INSTALL_PATH C:\Program Files\Docker Toolbox

本番環境のインフラを頻繁に変更するユースケースがあまり分かっていない