
「dockerから逃げるな!」
前回dockerの食わず嫌いを無事克服!
次なる学びはコンテナイメージの作成と定めた次第。。。
コンテナイメージには”Dockerfile”が肝であるようなので、
ざっくり試した内容を基に後々振り替えられるように記録を残していきます。
目次
インストラクション
Dockerfileのインストラクションを理解する!
コンテナイメージの設計図的ポジションがDockerfileです。
この内容が理解できれば、コンテナの中身がどんなふうにセットアップされているかが分かります。
下記は特に重要だと思うインストラクション(構築指示)を列挙していきます。
FROM | ベースイメージの指定(最初に必須) |
RUN | コンテナ内のOSコマンドを実行 |
ADD | COPYと同じ、圧縮ファイルを指定すると展開する |
COPY | ファイルやディレクトリのコピー |
WORKDIR | カレントディレクトリの移動 |
CMD | コンテナ起動時のデフォルトコマンド |
ENTRYPOINT | CMDと類似、違いは上書き不可 |
ENV | 環境変数を設定 |
VOLUME | 永続化ディレクトリを宣言 |
※コンテナ内を操作するコマンドは基本rootで実行される
FROM
FROM [コンテナ名]:[タグ名]
新しくコンテナを作成する際の、ベースとなるイメージを指定します。
例えばPostgreSQLを取り扱うpostgresイメージの場合、下記のようにFROMはdebianイメージを指しています。

「じゃあdebianは何をFROMに指定してるの?」
という疑問が出てきそうですが、これは下記の通り”scratch”(空のベースイメージ)が指定されています。

この場合コンテナを構築するための実際作業は、ADDで行われます。
RUN
RUN [OSコマンド]
コンテナ内のコマンド実行に使用します。
ADD
ADD [ホストPCのパス] [コンテナ内のパス]
FROMの項で軽く触れましたが、指定したファイルをコピーし、展開します。

debianの場合、GitHubの相対パス上にあるtar.gzが指定されています。
これがルートディレクトリに展開されることで、debianとしてコンテナが動作します。
念のためWindowsでtar.gzを展開してみたところ、
確かにLinuxのルートディレクトリに存在しそうな内容が確認できました。

COPY
COPY [ホストPCのパス] [コンテナ内のパス]
ファイルやディレクトリのコピーをします。※ADDと構文は同じ
※左側のパスがホストPCになるため、コンテナ内のファイルをコピーすることはできない
WORKDIR
WORKDIR [コンテナ内のパス]
カレントディレクトリの移動に使用します。
※PowerShellやLinuxのcdコマンドと同じ
CMD
CMD [コンテナ起動時のデフォルトコマンド]
コンテナ起動時のデフォルトコマンドを指定します。 ※上書き可能
個人的にはlinuxにsshでログインしたときのログインシェルのようなイメージでした。
ENTRYPOINT
ENTRYPOINT [コンテナ起動時のデフォルトコマンド]
コンテナ起動時のデフォルトコマンドを指定します。 ※上書き不可
「CMD」はコンテナ起動時のコマンドを引数指定で変更できる一方、
「ENTRYPOINT」は”必ずそのまま”実行されます。
ENV
ENV [環境変数名]=[値]
#または
ENV [環境変数名] [値]
環境変数を設定します。
ここでいう環境変数は、Dockerfile内の以降の処理、コンテナ内にも継承されます。
VOLUME
#単一の指定
VOLUME [コンテナ内のディレクトリ]
#複数の指定
VOLUME ["[ディレクトリ1]","[ディレクトリ2]","[ディレクトリ3]"]
データの永続化対象(コンテナを削除しても残したいディレクトリ)を指定します。
コンテナ間でも共有というけど、どう
コンテナイメージを自作する!
ここまででDockerfileの内容を理解した(はず、、)なので、コンテナイメージを自作していきます。
自分のオリジナルのコンテナイメージを作るには最低限DockerfileがあればOKです。
Lv1(最小構成でコンテナを作る!)
とりあえず0に近い状態から作り出し、徐々にカスタマイズを加えることで理解を深めるスタイルが自分に合っているため、まずは超シンプルな最小構成(とりあえずコンテナが起動する)で構築します。
ディレクトリ構成
[ディレクトリ]/
└── Dockerfile
Dockerfileだけを準備します。
Dockerfileの中身
FROM almalinux:latest
CMD ["sh"]
※FROMは良く使っているAlmaLinuxにしました。
イメージの作成
cd [Dockerfileを作成したディレクトリ]
#docker build -t [イメージ名] [ディレクトリ]
docker build -t lv1-image .
PowerShellでイメージを作成します。
※今回の構成であれば10秒程度で完了します。
コンテナの起動
#docker run -dit --name [コンテナ名] [イメージ名]
docker run -dit --name lv1-container lv1-image
※コンテナを起動し、使えることを確認します。
Lv2(コピーとコマンド実行を追加!!)
ディレクトリ構成
[ディレクトリ]/
└── Dockerfile
└── components.tar.gz
###以下components.tar.gzについて。。。
-----------------------------------------
#components.tar.gzの中身
-----------------------------------------
home/
└── hello.txt
-----------------------------------------
#Windows側で圧縮(PowerShell)
-----------------------------------------
#PowerSehllからWSLに切り替え
wsl
#圧縮の実行
tar -czf compornents.tar.gz home/
ファイルをADDでコピーするために、「components.tar.gz」という圧縮ファイルを用意します。
コピーする内容はhomeディレクトリ以下にファイルを一つ置くだけです。
圧縮はWindows標準機能では難しそうなのでWSLで実行します。
※Docker Desktopがあれば使える状態になってると思います
Dockerfileの中身
FROM almalinux:latest
#カスタマイズしたファイルを展開
ADD components.tar.gz /
#パッケージの更新
RUN dnf update -y
CMD ["sh"]
Lv1から追加したのは「ADD」、「RUN」の2つです。
ADDは先ほどのファイルを展開します。
RUNはパッケージの更新を行います。 ※latestなのであまり重要じゃないですが検証のため
イメージの作成
cd [Dockerfileを作成したディレクトリ]
#docker build -t [イメージ名] [ディレクトリ]
docker build -t lv2-image .
イメージの作成はLv1と同じです。
コンテナの起動
#docker run -dit --name [コンテナ名] [イメージ名]
docker run -dit --name lv2-container lv2-image
コンテナの起動もLv1と同じです。
Lv3(Composeによる複数コンテナ制御!!!)
ここまではコンテナを一つずつ制御していましたが、「docker-compose.yml」によって、
複数のコンテナを一括制御することが可能です。
ディレクトリ構成
[ディレクトリ]/
└── docker-compose.yml
docker-compose.ymlだけを使う最低限の構成にします。
docker-compose.ymlの中身
services:
web:
image: nginx:latest
db:
image: postgres:latest
内部的に「web」、「db」と命名し、それぞれのコンテナを制御します。
※Lv2より記述が少ないのでLv3扱いして良いのか? 良しとしてください。。。
イメージの作成
cd [docker-compose.ymlを作成したディレクトリ]
docker compose up -d
イメージの作成はLv1と同じです。
"up"は"run"と同じようにコンテナの作成と起動をし、"-d"でバックグラウンド実行にします。
※ちなみにさ削除するときは「docker compose down」
トラブルシューティング
docker buildでエラーする
PS C:\Users\xxxxx> docker build -t lv2_1 .
ERROR: error during connect: Head "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/_ping": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
Docker Desktopが起動してないと思うので、起動してから実行すれば解決するはず。
docker compose buildでエラーする
PS C:\Users\xxxxx> docker compose build
~~~docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
「docker-compose.yml」にversion表記があるために発生。
versionは使われなくなったパラメータのため、削除した方が良いというメッセージ。
まとめ
dockerは知れば知るほど便利なものが揃ってるなぁ、、、という印象。
VirtualBoxしか仮想ゲストを使えなかった身としては、
「もっとVirtualBoxだって手厚くしてもらってもいいのにな」という気持ちになってきますね。
複数のコンテナを管理できる「docker-compose.yml」を使うことで、
さらに利便性に磨きがかかるだろうって期待が高まります。
ここまではWindows環境でやってきたんですが、、、そろそろLinux上で動かす時が来たか!?