コンテナ入門 Kattyan @Aikoyori 1
自己紹介 Kattyan / 加藤 颯 • RICORA Programming Team 2024年度代表 • SecHack365にて低スペック端末で動くIDE基盤 「hakolate」を創作 • hakolateではコンテナ技術を活用しておりその知見を元に今回 の入門を担当 • Keyword: 認証/認可、コンテナランタイム、クラウド 2
前準備 3
仮想化とは • 仮想化とは、コンピュータの物理的なハードウェアをより効率的に 利用するためのプロセスで、クラウド・コンピューティングの基盤 となるものです。 • 仮想化はソフトウェアを使うことで、コンピューター・ハードウェ ア上に抽象化層を作成します。これにより、単一のコンピューター のハードウェアの要素(プロセッサー、メモリー、ストレージな ど)を、複数の仮想コンピューター(一般に仮想マシン(VM)と 呼ばれる)に分割することができます。 仮想マシンはそれぞれが、 各自のオペレーティング・システム(OS)を実行します。実際の基 礎となるコンピューター・ハードウェアの一部のみで稼働している にもかかわらず、独立したコンピューターのように動作します。 Ref: https://www.ibm.com/jp-ja/topics/virtualization 4
仮想化とは モチベーションとしては再現性を持たせようということ 少し前まではサーバ仮想化が主流だったが、現代の開発環境では コンテナ仮想化が主流に ただし、向き不向きはある どちらも複数OSが動作しているように振る舞っている 5
仮想化とは プロセス プロセス ゲストOS ゲストOS ハイパーバイザ コンテナ コンテナ プロセス ホストOS ホストOS ハードウエア ハードウエア サーバ仮想化(VM) コンテナ仮想化 サーバ仮想化とコンテナ仮想化の大きな違いはゲストOSを 含まないところ Firecrackerなどの軽量VMを用いたコンテナも存在している 6
コンテナとは UNIXのchrootが起源 その後、FreeBSD Jail, Linux-Vserver, Cgroup, Namespace と発展を遂げてきた 現在のDockerなどのコンテナはNamespaceの機能を用いて 動いている モチベーションとしてはサンドボックス機構を提供 7
コンテナの仕組み イメージや コンテナを管理 nerdctl docker kubelet イメージを作成 OCI CRI 高レベル ランタイム 低レベル ランタイム containerd CRI-O runc youki crun カーネル イメージができるまで commit commit commit Dockerfile を作成 Build イメージレイヤー を生成 Run イメージを生成 8
ハンズオン 9
コンテナ実行環境を作ってみよう • Dockerはこちら https://docs.docker.com/engine/install/ • nerdctlはこちら https://github.com/containerd/nerdctl/releases • Podmanはこちら https://podman.io/docs/installation 10
Rootlessとは 通常コンテナのデーモンおよびランタイムはrootユーザ上で動く が、Rootlessモードを使うことによってランタイムに脆弱性が あった場合でもroot権限を奪われることを防げる root Rootless 脆弱性 11
Rootlessの設定方法 • Docker https://docs.docker.com/engine/security/rootless/ • nerdctl https://github.com/containerd/nerdctl/blob/main/docs/ro otless.md • Podman https://github.com/containers/podman/blob/main/docs/tu torials/rootless̲tutorial.md 12
hello-worldを実行してみよう $ docker run hello-world 13
Dockerfileを書いてみよう 基本的には以下の形式で記述する # コメントアウト 命令 引数 # hello-world RUN echo 'hello-world’ 注意: 命令は引数との区別のため慣例的に大文字を使う 今回説明するコマンドは最小限なのでドキュメントをチェック また以降のスライドの説明はここから引用してます https://docs.docker.jp/engine/reference/builder.html 14
FROM FROM [--platform=<プラットフォーム>] <イメージ名> [AS <名前>] FROM ubuntu:22.04 ベースイメージを指定するコマンド タグが同じでもSHAを固定しないと同じベースイメージとは 保証できない→できる限りSHAを固定しよう 15
ベースイメージについて Docker Official Image, Verified Image, Sponsored Imageの 中から選ぶのが無難(右から左に信頼性が増します) 16
RUN RUN <コマンド> RUN [“実行ファイル”, “パラメータ1”, “パラメータ2”] RUN /bin/sh –c 現在のイメージよりも上にある新しいレイヤでコマンドを実行し、 その結果をコミットする commit commit commit Dockerfile を作成 Build イメージレイヤー を生成 Run イメージを生成 17
CMD CMD ["実行ファイル","パラメータ1","パラメータ2"] CMD の主な目的は、コンテナ実行時のデフォルト(初期設定) を指定するため Dockerfile内で一度しか使えない 18
COPY COPY [--chown=<ユーザ>:<グループ>] <コピー元>... <コピー先> 追加したいファイル、ディレクトリを <コピー元> で指定すると、 イメージのファイルシステム上のパス <コピー先> にコピーでき る 19
これらを合わせると 20
コマンド • search コンテナレジストリからイメージを探すオプション • pull コンテナレジストリからイメージを落とすコマンド • images ローカルのイメージ一覧を表示 • run イメージを実行 • ps ローカルのコンテナ一覧を表示 • attach 起動中のコンテナにアタッチする 21
練習問題 Ubuntuの24.04のイメージを選択して、Gitをインストールし てみよう 22
回答例 23
実行方法 $ docker build . ‒t tutorial $ docker run ‒it tutorial 24
もっと知りたい人 • 今回は触りの部分しかやってないので今後コンテナ応用をやり ます • NTT研究所の人がコンテナ周りのOSSにコミットしてかつ記事 をたくさん執筆されているのでそれを読むと面白いです 25
宣伝1 理科大公認サークルRICORA Programming Teamでは通年で部 員を募集してます コンテナなどのキーワードに興味を持った人は公式サイトを チェック! https://alg.tus-ricora.com/contact 26
宣伝2 SecHack365では現在2024年度のトレーニーの募集を行って います 5/1のオンライン説明会に私もいるので是非興味のある方は覗い てみてください https://sechack365.nict.go.jp/requirements/ 27