Closed Haramaki0326 closed 2 years ago
コンテナは特定のコマンドを実行するために作られる ホストマシン上の隔離された領域 です。
Docker に不慣れな間はコンテナをホストマシン上で動いている仮想 OS のように感じるかもしれませんが、コンテナの実体は Linux の Namespace という機能によりほかと分離されたただの1プロセスでしかありません。 Linux の Namespace 自体はもう 20 年近く存在する技術であり、それをコンテナやイメージというものを用いて扱いやすくした技術が Docker ということになります。
ホストマシンにも各コンテナにも Process ID 1 のプロセスや /etc/hosts などのファイルがあり重複していますが、Namespace により隔離された領域をマッピングすることで衝突を回避しています。
この Namespace をイメージから作り出すことで異なる OS に見えるようにしてくれたり、Namespace を簡単に作ったり消したりできるようなコマンドを提供してくれたりするものが Docker と言えます。
そう考えると【 1部: 仮想化とは 】で説明した「コンテナ型仮想化には OS は含まれておらず、ホストマシンのカーネルを使っている」ということが理解しやすいはずです。 コンテナはあくまでホストマシンの1プロセスであり、仮想サーバではないのです。
コンテナには次のような特徴があります。
イメージはコンテナの実行に必要なパッケージで、ファイルやメタ情報を集めたもの です。
イメージは複数のレイヤーというものからなる情報のことであり、ホストマシンのどこかに .img のような具体的な単一のファイルが存在するわけではありません。
イメージにはレイヤーによって次のような情報が含まれています。
イメージは Docker Hub で公開されています。
( Docker Hub に公開されているのは Dockerfile ではありません。)
そのおかげで、たとえばチームで「php8.1 のイメージを使う」と決めておけば、同じ開発環境を構築することが容易にできます。
Dockerfile の必要性と有用性 ここまでで次のことを理解しました。
しかし Docker Hub にある公式イメージなどは軽量にするためにレイヤーが最低限しか積み上がっておらず、あまり多機能ではありません。 たとえば Ubuntu コンテナには vi も curl も入っていませんでした。
そこで「公式イメージでは十分なセットアップが得られない」場合に「あらかじめ必要なセットアップを済ませたイメージを自分で作成しておく」というアプローチを取ることになります。
Dockerfile は既存のイメージ ( = レイヤーたち ) に追加でレイヤーを乗せることができるので、OS 設定などの労力を払わずに簡単にイメージを作成することができます。
Compose ファイルは YAML ファイルであり、 サービス(services) 、 ネットワーク(networks) 、 ボリューム(volumes) を定義します。Compose ファイルのデフォルトのパスは ./docker-compose.yml です。
\ | やりたいこと | Docker コマンド | Yaml ファイル |
---|---|---|---|
App | コンテナの定義 | - | app: |
App | コンテナ名の指定 | container run --name |
container_name: |
App | イメージのビルド | image build |
build: |
App | バインドマウント | container run --mount |
volumes: |
App | ポートを公開 | container run --publish |
ports |
App | ネットワークに接続 | container run --network |
- |
App | デフォルト命令の指定 | container run <command> |
command: |
DB | コンテナの定義 | - | db: |
DB | コンテナ名の指定 | container run --name |
container_name: |
DB | 環境変数を指定 | container run --env |
environment: |
DB | イメージのビルド | image build |
build: |
DB | ボリュームをマウント | container run --mount |
volumes: |
DB | バインドマウント | container run --mount |
volumes: |
DB | ネットワークに接続 | container run --network |
- |
DB | エイリアスを設定 | container run --network-alias |
- |
コンテナの起動 | container run |
mail: |
|
イメージの指定 | - | image: |
|
プラットフォームの指定 | container run --platform |
platform: |
|
ポートを公開 | container run --publish |
- | |
エイリアスを設定 | container run --network-alias |
- | |
ほか | ボリュームの作成 | volume create |
|
ほか | ネットワークの作成 | network create |
- |
Dockerの基本
参考:Zenn
基本の要素
基本のコマンド
コマンドの形
Docker の周辺知識
dockerコマンドは体系化されている
docker container run
docker container ls
docker container stop
docker container exec
docker container run <イメージ名> <コンテナで実行するコマンド>
-it
-i
:--interactive
-t
:--tty
--rm
docker exec <コンテナ名> bash -c "実行したいコマンド"
オプションリダイレクトやパイプが必要な場合に利用する
# 停止と起動
イメージ
ネットワーク、ストレージ
Dockerfile
Compose