「プログラマのためのDocker教科書」を読みました(2)
勉強記録
今日は昨日に引き続き「プログラマのためのDocker教科書」を読みました。
<第1章>については昨日のブログでまとめたので、<第2章>から<第6章>までの重要そうなところを中心にまとめました。
programming-kanamama.hatenablog.com
<第2章> コンテナ仮想化技術とDocker
仮想環境
物理的なハードウェアを持たず、仮想的にOSを動かし、その上でアプリケーションを動作させる。(例えば、Windowsマシンの中で、仮想的にLinuxサーバを動かすことも。PC上に擬似のPCを作るイメージ)
物理的なサーバを持たないのでメンテナンスの負荷も下がる。
開発環境と本番環境で違う!というのを解消するために仮想化技術が生まれた。
ライブラリもパッケージマネージャー(ex:PHPならComposer)で管理できるがアプリケーションレベルなので、サーバ本体までは管理できない。でも仮想化技術のおかげでそれが可能に。
現在使われている仮想化技術は3つ
ホスト型仮想化
ハードウェアの上にホストOSをインストールし、ホストOSに仮想化ソフトウェアをインストールする。仮想化ソフトウェアの上でゲストOSを動作させる。Oracle VM VirtualBoxやVMWare Player。
手軽に導入できるけど、スペックが低いPCだと遅くなってしまう。
ハイパーバイザー型仮想化
ハードウェア上に仮想化を専門に行う「ハイパーバイザー」というソフトウェアを配置し、ハードウェアと仮想環境を制御する。Hyper-VやXenServer。
クラウドの仮想サーバ機能でも使われている方法。
コンテナ型仮想化
ホストOS上にコンテナを作り、アプリケーションを動作させるのに必要なライブラリやアプリケーションなどをコンテナ内に閉じ込めて、あたかも個別のサーバのように使えるようにしたもの。Dockerはコンテナ型仮想化技術を使っている。
Dockerの基本機能
Dockerには大きくわけて3つの機能がある
Dockerイメージを作る(重要)
アプリケーションの実行に必要になるプログラム本体、ライブラリ、ミドルウェアや、OSやネットワークの設定などを1つにまとめたDockerイメージを作る。
Dockerイメージはコンテナのひな形となる。
Dockerイメージはコマンドを使って手動でも作れるが、Dockerfileというプログラムを作って自動でイメージを作る。Dcokerイメージは積み重ねて使うことができる。
Dockerコンテナを動かす(重要)
DockerはLinux上でコンテナ単位でサーバ機能を動かす。このコンテナのもとになるのがDockerイメージ。
Dockerイメージがあれば、Dockerがインストールされている環境でどこでもコンテナを動かすことができる。
Dockerイメージから複数のコンテナを起動することもできる。
Dockerイメージを公開/共有
Docker Hubで個人が作成したイメージを自由に公開して共有することができる。
<第3章>Dockerのインストールと基本コマンド
docker pull (イメージのダウンロード)
docker pull (オプション) イメージ名(: タグ名)
タグ名を省略すると最新バージョンが取得される
docker images (イメージの一覧表示)
docker images (オプション)(リポジトリ名)
取得したイメージの一覧表示。
docker rmi (イメージの削除)
docker rmi (オプション)イメージ名 (イメージ名)
作成したイメージを削除。複数削除したい場合は、イメージ名をスペースで区切って指定。
docker run (コンテナ生成/起動)
イメージからコンテナを生成し、コンテナ上でプロセスを起動する。
docker start(コンテナ起動)
停止中のコンテナを起動するときに使う。コンテナに割り当てられたコンテナ識別子を指定して起動する。
docker stop(コンテナの停止)
起動しているコンテナを停止する。コンテナを削除するときは、起動中のコンテナを停止しておく必要がある。
docker rm (コンテナ削除)
停止しているコンテナを削除する。
docker ps -a(稼働コンテナの一覧)
稼働コンテナの一覧を見ることができる。
この他にもコマンドはあるが、必要なときに覚えればOK
<第4章> Dockerfileを使ったコードによるサーバ構築
DockerfileはDockerイメージを作るもので、イメージを作成する手順がコードで書かれている。
Dockerfileさえあれば、Dockerエンジンが動作している環境であればどこでもDockerイメージを生成できる。
DockerfileからDockerイメージを作成
docker buildコマンドでDockerfileからイメージを作成することができる。
docker build -t (生成するイメージ名): (タグ名)(Dockerfileの場所)
つまり、イメージを作るには
dockerfileを作って、ビルドする!
ローカル環境にイメージがあれば新たにダウンロードしない。
Dockerイメージのレイヤー構造
Dockerfileをビルドしてイメージを作成すると、Dockerfileの命令ごとにイメージを作成する。
作成された複数のイメージはレイヤー構造になっている。(複数のイメージを積み重ねている)
<第5章> Dockerイメージの共有 -Docker Registry-
Docker Hubはイメージを共有できるけど、パブリックなレジストリである。
イメージを不特定多数に公開できない場合もあるので、そういうときにはプライベートレジストリの構築、管理が必要。
<第6章> 複数コンテナの一元管理 -Docker Compose-
サーバは1つではない。複数のサーバに機能や役割を分割してインフラの全体構成を決める
フロントサーバー(Webサーバ)、アプリケーションサーバ、データベースサーバ
Webシステムのサーバ群を役割ごとにこの3つに分ける設計思想を、Web3層アーキテクチャと呼ぶ。
Docker Compose
複数のコンテナをまとめて管理するためのツール。(全てのサーバを一気に立ち上げる)
まとめて管理することで複数のコンテナを同時に1コマンドで起動・停止することができる。
開発環境を作るとき楽にするために使う(本番環境では使わない)
dockerfileでイメージを生成して、docker runしてもOKだけど、複数行うのは大変だし手順もあるから失敗する可能性もある。
Docker Composeでまとめて管理すれば、1コマンドで行うことができる。
docker-compose.ymlの構文
Docker Composeはdocker-compose.ymlという設定ファイルに複数のサーバ群の構成をまとめて定義する。(YAML形式で書かれている)
ベースイメージの指定(image/build)
Dockerコンテナのもとになるベースイメージの指定にimageを使う。
イメージの構成をDockerfileに記述して、それを自動でビルドしてベースイメージに指定することもできる。
コンテナ内で動かすコマンド指定(command)
ベースイメージで指定されているときは、そのコマンドを上書きする
コンテナ間リンク連携(links/external_links)
別のコンテナへリンク機能を使って連携したいときは、linksに連携先のコンテナ名を設定する。
コンテナ間の通信(ports/expose)
コンテナが公開するポートはportsで指定する。
ホストマシンへポートを公開せず、リンク機能を使って連携するコンテナにのみポートを公開するときはexposeを指定する
コンテナのデータ管理(volumes/volumes_from)
コンテナにボリュームをマウントするときはvolumesを指定する。
別のコンテナからすべてのボリュームをマウントするときは、/volumes_fromにコンテナ名を指定する。
コンテナの環境変数指定(environment)
コンテナ内の環境変数を指定するときは、environmentを指定する。
コンテナの情報設定(container_name/labels)
Docker Composeで生成されるコンテナに名前をつけるときはcontainer_nameを指定する。
コンテナにラベルをつけるときはlabelsを指定する。
Docker Composeコマンド
複数コンテナの生成(up)
作成したdocker-compose.ymlをもとに、複数のコンテナの生成/起動を行うとき
生成するコンテナ数の指定(scale)
コンテナを生成する数を指定するとき
複数コンテナの確認(ps/logs)
複数コンテナの一覧表示を行うとき
コンテナでのコマンド実行(run)
Docker Composeで起動したコンテナで、新たにコマンドを実行したいとき
複数コンテナの起動/停止/再起動(start/stop/restart)
Docker Composeを使うと、複数のコンテナを一括で起動・削除・再起動することができる。
複数コンテナの強制停止/削除(kill/rm)
実行中のコンテナを強制終了するときには、docker-compose killコマンドを実行する。
生成した複数のコンテナを削除するときは、docker-compose rm コマンドを実行する。
コンテナの起動とデータの確認
Docker Composeの設定ファイルの用意ができたら、コンテナをバックグラウンドで起動する。
docker-compose up -d でバックグラウンドで起動。