Dockerについての基礎

DockerイメージはDockerコンテナを作成するためのテンプレート。
テンプレートとなるDockerイメージを構築することを「Dockerイメージをビルドする」と言う。
Dockerイメージを構成するために、DockerfileでDocker独自のDSL(ドメイン固有言語)を使う。
構築されたイメージはDockerコンテナの実行時に利用される。

Dockerfileでのインストラクション

FROM

  • 作成するDockerイメージのベースとなるイメージを指定する。
  • イメージをビルドする際、まず最初にこのFROMで指定したイメージをDLして実行される。
  • FROMで取得するのはDocker Hubのレジストリのイメージ。

RUN

  • イメージをビルドする際に、Dockerコンテナ内で実行するコマンドを指定する。
  • アプリケーションの更新や配置を行うことが多い。

COPY

  • ホストマシンからコンテナ内へコピーするためのインストラクション。

CMD

  • コンテナ内で実行するプロセスを指定することができる。(ENTRYPOINTが存在する場合は別)
  • コンテナ起動時に1度実行される。
  • アプリケーションを動作させるコマンドが多い。
  • 例えば次のコマンドはCMD [“go”, “run”, “/echo/main.go”]次のコマンドのイメージ$ go run /echo/main.go
  • 角括弧で囲まない記法もある。

ENTRYPOINT

  • ENTRYPOINTを指定すると、CMDの引数はENTRYPOINTで実行するファイルへの引数となる。
  • 次のコマンドで実行時に上書きも可能。
    docker container run –entrypoint ~~

LABEL

  • イメージの作者名記入等に使う。

ENV

  • Dockerfileをもとに生成したDockerコンテナ内で使える環境変数を設定する。

ARG

  • ビルド時に情報を埋め込むために使う。
  • イメージビルドの時だけ使用できる一時的な環境変数。

Dockerイメージ

イメージをビルド

docker image build -t イメージ名[:タグ名] Dockerfile配置ディレクトリのパス

タグ名を省略すると「latest」となる。
-tオプションを加えなければ、ハッシュ値で管理することになり手間がかかる。
イメージ名にユーザ名前空間を含めることができ、スラッシュ(/)で区切る。

作成されたイメージを確認

docker image ls

イメージの一括削除

docker image prune

実行中コンテナのイメージ等は削除されない。
Dockerが自動で判別するが、削除されない場合は必ず理由がある。

Dockerコンテナ

コンテナの状態

Dockerコンテナは次の3つの状態を持つ。

実行中

CMDやENTRYPOINTで定義されたアプリケーションの実行を開始し、
そのアプリケーションが実行中ならDockerコンテナは実行中ということになる。
1度実行して即終了するアプリケーションなら、即停止となるが、
例えばWebサーバなどであれば異常終了しない限り実行中の状態となる。

停止

コンテナで実行されるアプリケーションが終了した場合に自動的にコンテナは停止状態となる。
明示的に破棄しない限りコンテナはディスクに残り続ける。

破棄

1度破棄されたコンテナは2度と開始することはできない。

Dockerのポートフォワーディング

  • コンテナ内のアプリケーションがポート80番を公開している場合、同じコンテナ内からであればポートフォワーディングを設定せずにポート80番へアクセス可能。
  • コンテナ外からアクセスするにはDockerのポートフォワーディングが必要。(ホストマシンのポートとコンテナポートを紐付け、コンテナの外から来た通信をコンテナポートに転送させる)
  • ポートフォワーディングはdocker container runコマンドに-pオプションで指定可能。-pオプションは
    「{ホスト側ポート}:{コンテナポート}」
    の書式で記述する。
    ホスト側のポートとコロンを省略することも可能だが、省略するとエフェメラルポートが割り当てられて確認する手間が発生する。

コマンド

Dockerコンテナの作成と実行

docker container run イメージ名[:タグ名]

バックグラウンドで実行するには、-dオプションを使う。
–nameオプションを付与するとコンテナに任意の名前(イメージ名とは別)をつけることができる。
同じ名前のコンテナを実行することはできない。

実行中のコンテナの一覧表示

docker container ls

停止中のコンテナを含めて一覧表示

docker container ls -a

実行中のコンテナを停止

docker container stop コンテナIDまたはコンテナ名

コンテナの再起動

1度停止したコンテナは破棄しない限り、再起動可能。

docker container restart コンテナIDまたはコンテナ名

コンテナの破棄

docker container rm コンテナIDまたはコンテナ名

即終了してしまうコンテナのシェルへ入る

docker container run -t -i イメージ名[:タグ名] /bin/bash

実行中コンテナでのコマンド実行

コマンドを実行して終了するなら次のコマンド。

docker container exec コンテナIDまたはコンテナ名 コンテナ内で実行するコマンド

コンテナ内のシェルに入るなら次のコマンド。

docker container exec -it コンテナIDまたはコンテナ名

コンテナ間、またはコンテナとホスト間でファイルをコピー

docker container cp コンテナIDまたはコンテナ名:コンテナ内のコピー元 ホストのコピー先
docker container cp ホストのコピー先 コンテナIDまたはコンテナ名:コンテナ内のコピー元

実行中でないコンテナを一括削除

docker container prune

システムリソースの利用状況の取得

docker container stats

マルチコンテナ

Docker Composeはyaml形式の設定ファイルで、複数のコンテナ実行を一括で管理可能。

例えば次のコマンドをdocker composeを使って一括で操作する場合、

docker container run -d -p 9000:9000 コンテナ名A:タグ名A
docker container run -d -p 9000:9000 コンテナ名B:タグ名B

任意の場所に次のdocker-compose.ymlを作成し、次のように記述する。
(※ docker-compose.ymlファイル内にTAB文字が存在してはいけない)

version: "3"
services:
  temp:
    image: コンテナ名A:タグ名A
    ports:
      - 9000:9000
  temp2:
    image: コンテナ名B:タグ名B
    ports:
      - 9000:9000

それから作成したdocker-compose.ymlが配置されたフォルダで次のコマンドを実行すると一括で実行可能。

docker compose up -d

一括で停止するには次のコマンド。

docker compose down

上記例ではimageを利用しているが、作成済みのDockerfileを指定することも可能で、
その場合はimageの代わりに次の行を記述すれば良い。

build: 相対パス

コンテナが実行中であることを確認するには次のコマンド。

docker compose ps

データの永続化(20230929要動作確認)

Data Volume の利用 (ホストとコンテナ間での共有)

Data Volumeというものがある。
これはコンテナ内のディレクトリをディスクに永続化するための仕組みで、ホスト・コンテナ間でのディレクトリの共有・再利用が可能になる。
また、イメージを更新してコンテナを新規作成しても同じData Volumeを利用することができる。

Data Volumeの作成は次のコマンドで可能。

docker container run -v ホスト側ディレクトリ:コンテナ側ディレクトリ イメージ名:タグ名

Windows(PowerShellなら)でもLinuxでもホスト側ディレクトリにカレントディレクトリを指定したければ、${pwd}と指定すれば良い。

Data Volume コンテナ (コンテナ間での共有)

複数のコンテナがあり、それぞれでホストとコンテナ間での共有があると大変な場面がある。
その大変さを軽減するために、1つのコンテナ(Data Volumeコンテナ)がホストと共有し、
他のコンテナはData Volumeコンテナと共有する、という形。

Tips

  • 公式リポジトリの名前空間には一律でlibraryという名前空間がつく。
  • 一般的にDockerコンテナのログとは、コンテナに標準出力として出されたものを指す。
  • コンテナは公式によると、コンテナは1つの関心事だけに集中すべき。(1プロセス = 1コンテナではない)

コメント

タイトルとURLをコピーしました