Linuxチョットワカル人向けのDocker入門です。
Dockerの基盤部分には大きく分けて次の3つの機能があります:
- コンテナの起動
- コンテナの構築
- コンテナの配布
コンテナの起動(リソースの管理)
-
chroot
とよく似ている- ルートが変更されるのでそれより外のファイルシステムにはアクセスできない
- OSの管理している他のリソース(CPU、メモリ、ブロックI/O、ネットワークなど)の制御はできない
- これらを管理する機構を提供してくれるLinuxカーネルの機能がcgroup
- dockerはこれらLinuxの仮想化機能を簡単に使えるようにするためのラッパー
- ルートを変更するディレクトリはdockerがファイルシステムをまとめてダウンロードする
-
/var/lib/docker
以下のどこかに用意してくれる - aufs/overlayfs/btrfsでそれぞれ微妙に異なる
-
コンテナの起動(起動オプション)
docker run --interactive --tty ubuntu /bin/bash
として起動すると
-
ubuntu
イメージを取得し(どうやって取得するかは次の節で説明します) - TTYを割り付け
- 対話的にイメージ内の
/bin/bash
を起動します。
コンテナの起動(権限)
- コンテナプロセスはコンテナデーモンの権限(通常Root)で実行される
- ファイルシステムに書き込むと当然Rootとして書き込む
- セキュリティ的に危険が危ない
- 起動時にプロセスのUID/GIDが指定できる
docker run -it --user $(id -u):$(id -g) ubuntu /bin/bash
- UID=1000とかでコンテナ内で
/usr/bin
にインストールしようとして権限が無くて死ぬ - ホスト側の
UID=1000
とコンテナ内のUID=0
を対応させたい = subuid/subgid
コンテナの配布(レジストリ)
- Dockerにはコンテナのファイルシステムをまとめて配布する機能がある
- コンテナを配布するサーバーの事をコンテナレジストリと呼ぶ
- docker本家
docker.io
の他にquay.io
も有名 - GitLabにも付属してるし、AzureやGCPはアカウント毎に作れる
- dockerで簡単に構築できる
- docker本家
- 個々のコンテナは
[registry name]:[port]/[container name]:[tag]
の形式で一意に指定される
docker pull myregistrydomain:port/foo/bar:latest
コンテナの配布(命名規則)
-
慣習として
user_name/container_name
のようにアカウント名・グループ名と個別のコンテナ名でつける- あるいはもっと深く
group_name/team_name/task1
のようにつける
- あるいはもっと深く
-
省略することも出来て以下のデフォルト値になる
- レジストリ:
docker.io
- ポート: HTTPSで通信するので443
- タグ:
latest
- レジストリ:
-
主要なOSや各言語のイメージは特別に
library
という名前空間がある
docker pull ubuntu
docker pull docker.io/library/ubuntu:latest
コンテナの配布(認証)
- ダウンロードは主にHTTPSで行われ、認証は
docker login
で行う(これも省略するとdocker.io
になる)- HTTPはデフォルトで許可されていないので、どうしても必要な場合はSSLを無効化する設定をする
docker login myregistry
コンテナの構築
-
Dockerfile
という独自の形式にコンテナ構築のためのレシピをシェルスクリプトで記述する - 典型的には各ディストリビューションや各言語のコンテナの上に必要なライブラリや実行ファイルを追加していく
今回扱わなかった内容
- ネットワーク構成周り
- 私があまり詳しくないので省きました(勉強したら追記します)
- docker-machine
- Dockerの環境自体を構築するためのツールです。HyperVとかKVM上に仮想マシン作ってDocker環境を用意するとかの機能があります
- コンテナオーケストレーション、Kubernetes
- コンテナをたくさん使てもっと複雑な事を行うためのレイヤーです
- podman/buildah/skopeo
- RedHat Enterprise Linuxにも標準搭載されてるコンテナ環境です
- 上で説明した3つの機能、コンテナ実行・コンテナ構築・コンテナ配布がそれぞれ別プログラムとして提供されています