Dockerの基礎
自分用です。
コマンド:
// dockerバージョンのチェック docker version // dockerの情報を詳しく知る docker info // dockerコマンドの一覧表示 docker // imageをインストール docker pull <任意のimage> // インストールしているimageの詳細情報を確認する docker image inspect <image名>
imageは動かしたいアプリケーションの設定。コンテナはそれに従って動く。
同じimageを共有し、複数のコンテナを動かせる。
以下はnginxイメージに則ったコンテナを起動する例。
docker container run --publish 80:80 nginx
- nginxをDockerHubから入手
- imageから新たなコンテナを起動
- port80をHostIPとして開く
- 80へのアクセスをcontainerのポートである80へとつなぐ。(8080:80 なら 8080をコンテナの80につなぐ)
--detachオプションをつければ、バックグラウンドで起動できる。
docker container run --publish 80:80 --detach nginx
止めたいときは、ユニークIDを指定しながら、stopすればいい。
//起動しているコンテナの確認 docker container ls // ユニークIDは最初の数文字で大丈夫 docker container stop f60
runは新たなコンテナの起動。startは一度止めたコンテナの再起動。
// コンテナのログの確認(detach等でバックグランド起動したときはこれでログを確認できる) docker container logs <container's name>
dockerコンテナに関するコマンドを見たいときは、以下。
docker container --help
例えばtopコマンドは、コンテナのpidを確認できる。
邪魔なコンテナは以下で削除。
docker container rm <UID>
コンテナはただのプロセスである
仮想マシンとの違いはそこ。
//起動しているすべてのコンテナのパフォーマンスを調べられる(消費しているリソース量など) docker container stats //起動しているコンテナを指定すると、設定詳細が確認できる(JSON形式) docker container inspect //イメージに基づき、インタラクティブにコンテナを起動できる(exitで脱出) docker container run -it <Container's name> bash //脱出したあと、また潜るためには以下。 docker container start -ai <Container's name> //すでに起動しているコンテナについて、bashで潜れる docker container exec -it <Container's name> bash
ネットワークについて。
// Dockerが保持しているnetworkの参照 docker network ls // networkの深掘り docker network inspect <network's name> //ネットワーク同士の接続 docker network connect <network1> <network2>
静的なIPを設定したり、IPを使ってコンテナに接続しにかかるのはアンチパターン。コンテナの名前を使おう。
イメージについて
アプリケーションバイナリと、依存関係のこと。OSやカーネルやカーネルモジュールは準備しない。
イメージはdocker.hubで確認できる。公式のものはドキュメントが詳細に書かれている。ただ、公式より人気のものがあったりするので、その理由を確認するものよい。
イメージレイヤとは
イメージはファイルシステムとメタデータ。イメージのそれぞれのレイヤーはホストに一度だけ保存され、それは流用される。コンテナはイメージレイヤの最上部に位置される読み書き可能な単一のレイヤーである。historyコマンドやinspectコマンドで、イメージの詳細について調べられる。
Dockerfileの作り方
FROMから始まり、Dockerhubにあるイメージを選択する。
ENVで環境変数を設定する。
RUNはシェルコマンド。パッケージレポジトリを利用してファイルをインストールすることができる。
EXPOSEは仮想ネットワークに公開するポート番号。
CMDはイメージから新しいコンテナを起動するさいや、コンテナの再起動の際に実行される最後のコマンド。
DockerFileはキャッシュを使いビルドを高速化しているので、Dockerfile内のコード変更は出来る限り下部のものを多く変更するようにしたほうが、処理が高速化する。(上部を変更すると、下部はキャッシュを使えず、新たにビルドする)
コンテナについて
コンテナは不変だが、長く保持されるものではない。
データベースやユニークデータを保持するためには、永続データとして保持する必要があり、そのための方法として以下の2つのものがある。
Volumeについて:Dockerfileにて、VOLUMEコマンドを使えば、Volumes先を指定できるが、コンテナが削除されても保持されているため、削除したい場合は手動で削除する必要がある。
コンテナ起動の際に、docker container run -v :mysql/var/libといった形で指定すれば、docker volume ls コマンドでVolumeNameを確認した際、ほかのボリュームと判別しやすい。(また、同じドライバ(Mysql)だが異なるコンテナを起動したさい、このように指定しておかないと、ドライバがそれぞれ別のボリュームを作成する。)
Bind Mountsについて:ホストのファイルやディレクトリをコンテナ内にマッピングする。基本的にそれらは同じ場所を指している。マッピングしたさい、ホストファイリルがコンテナ内のファイルを上書きする(同場所にあった場合)。Dockerfile内で使用することができず、「docker container run -v $(pwd):/usr/share/nginx/html」といった形で指定する。このコマンドを使うと、ホストの現在のワーキングディレクトリ内の内容を、コンテナ内の/usr/share/nginx/htmlにマッピングされ続ける。(確認したい場合は、「docker container exec -it nginx bash」を使い、bashを使って内部に潜り込んでみよう。)
Docker compose について
compose.ymlに基づいてコンテナ同士の関係を作る。
公式ドキュメントを見ると詳細が載っているので、困ったときは参照しよう。 Compose file version 3 reference | Docker Documentation
docker-compose CLIは、本番環境上よりも、「開発環境とテスト環境」において力を発揮する。
もっとも基本的なコマンドは以下。
//volumesとnetworksをセットアップし、すべてのコンテナを起動する。 docker-compose up //すべてのコンテナを止め、コンテナとボリュームとネットワークを削除する。 docker-compose down docker-compose ps docker-compose logs // 現在起動しているコンテナのPIDやUserを表示する docker-compose top