Docker の基礎

最終更新: 2022-01-28 15:44:22 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Docker は、ホストのカーネル、CPU ISA、x86-64 の syscall に依存するコンテナシステムです。 Docker コンテナ内で動作するアプリケーションは、コンテナ化されているといいます。

コンポーネントの概要 #

Docker Engine:dockerd #

dockerd は、ローカルシステムにインストールされたコンテナを管理する CLI デーモンプログラムです。 Docker Engine または Docker CE(Community Edition)という名称で提供されており、オープンソースかつ無料です。

dockerd デーモンは、クライアントからの接続を UNIX ドメインソケット /var/run/docker.sock で待ち受けます。 ソケット接続を確立して HTTP リクエストを送信するには、Docker クライアントを実行するユーザーがこのソケットファイルを読み取れる必要があります。 Linux ディストリビューションのパッケージマネージャーから Docker Engine をインストールした場合、このソケットファイルを読み取れるのは root または docker など Docker 専用のユーザーグループだけである可能性があります。 自身をそのユーザーグループに追加するか、docker クライアントを使用するたびに root になる方法を選択できます。 dockerd が実行中で、クライアントに権限があるかどうかは docker info で確認します。

dockerd デーモンは、任意のプログラムから利用できるコンテナ管理用 HTTP API を公開します。 公式クライアントプログラムは docker CLI です。

Docker Desktop #

Docker Desktop は dockerd と通信し、コンテナを管理するプロプライエタリな GUI クライアントプログラムです。 Docker Desktop アプリケーションの使用は必須ではありません。

Docker Compose #

https://docs.docker.com/compose/

Docker Compose は、dockerd と通信する別の CLI クライアントです。実行ファイルは docker-compose です。 毎回多数の docker run オプションを入力する代わりに、docker-compose.yml ファイルでコンテナのプロパティを指定します。 頻繁に使用するサービスや、複雑な設定を持つサービスを繰り返し構築する場合に役立ちます。

イメージ #

Docker イメージはファイルシステム内容のレイヤーで構成され、各レイヤーが前のレイヤーにファイルを追加します。 あるイメージの最初のレイヤーが別のイメージの全レイヤーに依存する場合、そのイメージは別のイメージをベースにしているといいます。

イメージには、人間が読める名前 REPOSITORY と、人間が読める TAG(一般にはバージョン番号ですが必須ではありません)があります。 IMAGE ID と呼ばれる SHA256 ハッシュがイメージを一意に識別します。

独自のイメージをビルドするには、イメージ作成に必要な手順を単純な構文で定義した Dockerfile を作成します。 Dockerfile の各命令は、イメージ内にレイヤーを作成します。 Dockerfile を変更してイメージを再ビルドする場合、変更されたレイヤーだけが再ビルドされます。

たとえば、esolang/vim:latest イメージには 10 個のレイヤーが含まれます。

sh
# $ Docker Pull Esolang/vim
Using default tag: latest
latest: Pulling from esolang/vim
4abcf2066143: Downloading  2.951MB/3.409MB
e7609a7fad9e: Download complete
a891a2921638: Download complete
6ea6322cdcb0: Download complete
729f825b6ae6: Download complete
e6cb43f5f474: Downloading  2.618MB/31.24MB
c12ed1c2e19b: Download complete
6928286dd6f6: Download complete
05de04103836: Download complete
b5a8264627eb: Download complete

Docker はビルド済みイメージ内に Dockerfile を保存しないため、イメージのビルド方法を確認するのはやや困難です。

コンテナを実行し、変更を加え、その結果をコミットすることでもイメージを作成できるためです。 実際、Dockerfile は、この実行、変更、コミットのプロセスを自動化するスクリプトと考えられます。

最小イメージ #

ベースイメージもファイルシステム内容も持たない、最小限の Hello World 実行ファイルだけを含む Docker イメージをビルドします。

asm
; linux_syscall call_no, arg0, arg1, arg2, arg3, arg4, arg5
%macro linux_syscall 1-7 0,0,0,0,0,0

    mov rax, %1
    mov rdi, %2
    mov rsi, %3
    mov rdx, %4
    mov r10, %5
    mov r8, %6
    mov r9, %7
    syscall

%endmacro



SECTION .data
msg:    db `hello world\n`
msglen: equ $-msg

GLOBAL main

SECTION .text
main:
    ; write to stdout a string
    linux_syscall 1,1,msg,msglen

    ; exit the process with code 42
    linux_syscall 0x3c, 42

make で実行ファイルをビルドします。

Makefile
main: main.o
	# -N: don't align data segment on a new memory page, thus makes the executable as small as possible
	ld -N -e manbaout -omain main.o

main.o: main.asm
	nasm -f elf64 -o main.o main.asm

clean:
	rm *.o main

次の Dockerfile でイメージをビルドします。

Dockerfile
FROM    scratch
ADD     main    /
sh
docker build -t foo .

筆者の環境では、これにより 904 バイト(docker image ls の表示値)の Docker イメージが作成されます。 そのイメージからコンテナを実行します。

sh
docker run foo ./main

コンテナ #

コンテナは、実行中のイメージインスタンスです。コンテナのライフサイクルは docker container create <image> コマンドで始まり、その後 docker start <container> を実行します。docker run <image> はこの両方を実行するショートカットであり、<image> がローカルに存在しない場合は、設定済みレジストリ(デフォルトは Docker Hub)からのイメージダウンロードも行います。docker run は、指定されたイメージから常に新しいコンテナを作成して起動します。

既存の非アクティブなコンテナ(終了済みまたは一時停止中)を使用するには、再度 docker start を使用します。

任意の時点で、Docker コンテナは次の 6 状態のいずれかにあります。

  1. created:コンテナは作成後一度も起動されておらず、そのままの状態
  2. running:ENTRYPOINT プロセスが実行中(厳密には、そのプロセスに対する wait(2) がブロックする状態)
  3. Restarting:
  4. Exited(num):ENTRYPOINT プロセスが num で終了した状態
  5. Paused:
  6. Dead:

Dockerfile #

Dockerfile には 17 個の命令だけが定義されています。

名前
ADDローカルまたはリモートのファイルとディレクトリを追加する。
ARGビルド時変数を使用する。
CMDデフォルトコマンドを指定する。
COPYファイルとディレクトリをコピーする。
ENTRYPOINTデフォルトの実行ファイルを指定する。
ENV環境変数を設定する。
EXPOSEアプリケーションが待ち受けるポートを記述する。
FROMベースイメージから新しいビルドステージを作成する。
HEALTHCHECK起動時にコンテナの正常性を確認する。
LABELイメージにメタデータを追加する。
MAINTAINERイメージの作成者を指定する。
ONBUILDイメージがビルドに使用されるときの命令を指定する。
RUNビルドコマンドを実行する。
SHELLイメージのデフォルトシェルを設定する。
STOPSIGNALコンテナ終了時のシステムコールシグナルを指定する。
USERユーザー ID とグループ ID を設定する。
VOLUMEボリュームマウントを作成する。
WORKDIR作業ディレクトリを変更する。

結果のイメージに永続化されるレイヤーを作成する命令は、RUN、COPY、ADD だけです。

大半の命令は、docker image build コマンドが静的なイメージに新しいレイヤーを追加する方法を指定します。

  • 例外は RUN コマンドで、ビルド時に外部コマンドを直ちに実行します。

docker image build の実行時に即座に実行される命令と、作成したイメージからコンテナを インスタンス化した後の Docker の動作を指定する命令を区別することが重要です。

CLI チートシート #

sh
# Show Active Container
docker container ls
# Show All Container Includes Dead One
docker container ls -a
# Stop Certain Containers
docker stop <cid1> <cid2> ...
# Stop All Active Containers
docker stop $(docker container ls –aq)

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)