Dockerに入門したときのまとめ
Dockerことはじめ
今更ではありますが Docker に入門します。
Docker とは
- Linux コンテナで稼働するアプロケーションの実行環境を構築/管理するツール
- dockerd というデーモン
- git が必須
- アプリケーションの実行環境を、アプリケーションを構成するライブラリのように管理することができる
- イメージのバージョン管理
- アプリケーションごとにコンテナを分割して設定管理
- コンテナイメージを作成する際は原則 Dockerfile から自動生成
- コンテナを丸ごと入れ替える
- プライベートな PaaS
- CI/CD が実現しやすい
Docker の基礎技術
仮想化技術
Disk
- コンテナごとに異なるディスク領域を割り当てることができる
- chroot
- ホストLinux上の特定のディレクトリがコンテナ内部にルートディレクトリとしてマウントされる
- 実際にはホストLinuxの仮想ディスクにDockerのイメージをマウントする
- Thin-Provisioning機能
ネットワーク
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との連携
複数コンテナの連携
同ホスト
別ホスト
公開イメージの活用
- docker run ですぐに実行
- Githubからコンテナイメージを作成
Docker コマンド
イメージの操作
イメージのビルド
$ docker image build -t ${イメージ名:タグ名} ${Dockerfile配置パス}
Dockerfileを任意を名称にする
-f
オプションで可能--pull=true
にすることで常にDockerレジストリからイメージをダウンロードする- 実際の運用では latest のイメージを使うのではなく、あるバージョンのイメージを使うことが多いので、
--pull
オプションの出番は少ない
- 実際の運用では latest のイメージを使うのではなく、あるバージョンのイメージを使うことが多いので、
イメージの取得
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イメージ}
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 |
本番環境のインフラを頻繁に変更するユースケースがあまり分かっていない