Web備忘録

雑多に書いています

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
  1. nginxをDockerHubから入手
  2. imageから新たなコンテナを起動
  3. port80をHostIPとして開く
  4. 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つのものがある。

  • Volumes  コンテナのユニークファイルシステムの外部に特別なロケーションを設定し、そこに保持する。
  • Bind Mounts ホストディレクトリをコンテナ内にマウントしておく。

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