Movatterモバイル変換


[0]ホーム

URL:


36,853 views

コンテナの作り方「Dockerは裏方で何をしているのか?」

Dockerやコンテナについての理解を目指す入門テキストです。CloudNative Days Kansai 2019 - #CNDK2019 における発表資料です。https://cloudnativedays.jp/cndk2019/

コンテナの作り方「Dockerは裏方で何をしているのか?」を理解する入門テキストSakura internet, Inc.Masahito Zembutsu @zembutsuCloudNative Days Kansai 2019#CNDK20192019, Nov 28
2この資料は、「Dockerコンテナ」の初学者を対象とした発表資料を、公開用として再編集し、解説を加えたものです。オリジナルは2019年11月28日開催の「CloudNative Days KANSAI2019」です。ご来場の皆さま、登壇者の皆さま、スタッフの皆さん、大変ありがとうございました。本資料以外にも、SlideShare で関連するスライドを公開していますので、ご興味ありましたらご覧ください → https://www.slideshare.net/zembutsu/ちなみに #CNDK2019 の来場者属性(アンケートより)初心者が迷いがちな部分にマーク
@zembutsu前佛 雅人zembutsu@zembutsuさくらインターネット株式会社 技術本部Technology Evangelist / Developer Advocate⚫ 石狩市への小学校プログラミング教育支援プロジェクト → さくらの学校支援プロジェクト (2019~)⚫ 仮想化基盤チーム(クラウドチーム・VPSチーム)⚫ エバンジェリストチーム⚫ 略歴• 1986年 はじめてパソコンに触る• BASIC挫折• 1993年 富山高専(電気工学科)で学び始めるパソコン通信・インターネットとの遭遇• 2000年 富山のIT企業に就職• とあるホスティング&ISPで勤務NOC対応・運用・サポート業務に携わる• 2007年 東京へ• システム運用とか監視をいろいろ、企画• 自動化ツール• 2019年 大阪在住何をしたいの?:普通の人が当たり前に計算資源を活用して、豊かな生活を実現できるように支援する本発表は「コンテナとは何なのか?」「Dockerは何をしているのか?」の2点に絞り、初学者が混乱しがちな部分を整理します
コンテナを作る4#とはコンテナ?
5Nginxのコンテナを作っておいたよ~おそらく、皆さんのプロジェクトや研究室などで、こんな会話を耳にしたことはありませんか?
6Nginxのコンテナを作っておいたよ~「コンテナ」を「作る」とは、一体どのような意味があるのでしょうか
7docker-compose.ymlDockerfileご存じの方は、技術的には 「Dockerfileなりdocker-compose.ymlでDockerイメージを準備すること」 ですが、ドッカーファイルドッカーコンポーズ・ヤムルドッカーファイル ドッカーコンポーズ・ヤムル
8コンテナの「気持ち」を理解しよう初学者の方へのアドバイスコンテナは友達さ!まずは、コンテナの「気持ち」を理解しようと努めることが、理解の促進につながります。コンテナの気持ちとは、
9コンテナの「気持ち」を理解しよう例えると、こんな状態。布団の中で横たわっているのが動いていないプロセスであり、、
10コンテナの「気持ち」を理解しよう布団から出られない人のいらすとhttps://www.irasutoya.com/2014/04/blog-post_2419.htmlCopyright寒い冬は、布団でぬくぬくしていたいですよね、「布団から出たくない人」の気持ちこそが、「コンテナ状態」として動くプロセスの気持ちです。デフォルトで、外とつながっていない。隔離されている状態。
Docker とコンテナの違いWhy Docker?11Docker
Dockerとは何であるかの定義12“Docker allows you to package an applicationwith all of its dependencies into a standardizedunit for software development.”www.docker.com全ての依存関係をパッケージ化して、コンテナとして動かすまずは、Dockerの「定義」からみていきましょう。これは Docker のマスコットキャラクターで名前は Moby です。モビードッカードッカー
Dockerとは何であるかの定義13“Docker allows you to package an applicationwith all of its dependencies into a standardizedunit for software development.”www.docker.com全ての依存関係をパッケージ化して、コンテナとして動かすDockerはプログラム実行に必要な「すべての依存関係」をパッケージにします。バイナリやライブラリ、設定ファイル等。
Dockerとは何であるかの定義14“Docker allows you to package an applicationwith all of its dependencies into a standardizedunit for software development.”www.docker.com全ての依存関係をパッケージ化して、コンテナとして動かすパッケージするのは、/ (ルート) ディレクトリ以下、 /bin や /etc や /var などの「Linuxファイルシステム」。それと、「メタ情報」と呼ぶ、どのプロセスを自動実行するか、ポートを公開するなどの汎用情報も入ります。Linuxファイルシステムを
Dockerとは何であるかの定義15“Docker allows you to package an applicationwith all of its dependencies into a standardizedunit for software development.”www.docker.com全ての依存関係をパッケージ化して、コンテナとして動かすDockerイメージとしてLinuxファイルシステムをDockerは「Dockerイメージ」にパッケージ化。これは、仮想マシンの(ディスク)イメージとは全く異なる概念。Dockerイメージとは、正確には「Dockerコンテナの実行に必要な、命令の入ったテンプレート」なのです。
Dockerとは何であるかの定義16“Docker allows you to package an applicationwith all of its dependencies into a standardizedunit for software development.”www.docker.com全ての依存関係をパッケージ化して、コンテナとして動かすDockerイメージとしてLinuxファイルシステムをそして、イメージの中にあるファイルを、「コンテナ」として「動かす」のが新しい概念です。コンテナとして動かすとは・・・?
17Nginxのコンテナを作っておいたよ~先ほどの「Nginx」の例では、「Nginx」のバイナリ、設定ファイル、関連ファイルを Docker イメージにパッケージ化しそれを、「NginxのDockerコンテナ」として実行します。コンテナの実行とは・・・・・?バイナリ設定ファイルデータNginxを実行するために依存関係があるファイルすべてをパッケージ化(この中身は、 Linux ファイルシステム)「Nginx が入っている Docker イメージ」を使って、「Nginx の Docker コンテナ」を「実行」するNginx Docker イメージDocker の仕事とはDocker イメージ ≠ Docker コンテナ
18(物理または仮想)コンピュータ一旦、コンテナではない、通常の Linux のプロセスを動かす(走らせる)状態を見てみましょう。
19(物理または仮想)コンピュータCPUメモリ記憶装置コンピュータ上に、ハードウェアとしてのCPUやメモリ、記憶装置が存在し、
20(物理または仮想)Linux カーネル + システム・ライブラリ(libc)等コンピュータCPUメモリ記憶装置オペレーティングシステム (OS)の領域OSの領域が記憶装置内のファイルシステム内にあり、メモリ空間への読み込みや CPU で命令を実行します。
21(物理または仮想)ユーザ空間システム空間Linux カーネル + システム・ライブラリ(libc)等コンピュータCPUメモリ記憶装置オペレーティングシステム (OS)の領域バイナリ 設定ファイル ソースコード データ一般的なプロセス実行一般的なプロセスは、何らかのバイナリのプログラムをもとに、カーネルのユーザ空間で
22(物理または仮想)ユーザ空間システム空間Linux カーネル + システム・ライブラリ(libc)等コンピュータCPUメモリ記憶装置オペレーティングシステム (OS)の領域プロセスバイナリ 設定ファイル ソースコード データプロセス一般的なプロセス実行プログラムを実行します。この実行状態のプログラムをプロセスと呼び、OS上の様々なリソースにアクセスします。
23(物理または仮想)ユーザ空間システム空間Linux カーネル + システム・ライブラリ(libc)等コンピュータCPUメモリ記憶装置オペレーティングシステム (OS)の領域バイナリ 設定ファイル ソースコード データコンテナは特別な状態のプロセスのことisolate(隔離)プロセスisolate(隔離)プロセス「コンテナ」としてのプロセスも、プログラムの実行という意味では同じですが、Dockerの介在で、Linuxカーネルなど諸機能によって “isolate” (隔離)したプロセスです。アイソレートアイソレート アイソレート
24isolate(分離)するア イ ソ レ ー ト“名前空間”技術を使ってnamespaceネームスペース
25isolate(分離)するア イ ソ レ ー ト“名前空間”技術を使ってnamespace大事なのは、Dockerで何かのプロセスを実行時、Linuxカーネルにある複数の名前空間技術を使い、特別な状態のプロセス、つまり、様々な名前空間等をisolate(分離)して実行する点です。分離して実行。日本語ではisolateを「隔離」と翻訳することもありますが、意味としては「地理的に異なる場所に引き離す」のではなく、壁や襖のように「分割」「区分けする」や「分離」するという意味合いのほうが、適切と思います。DockerはLinuxプロセスに対して、様々な名前空間やリソース等、「プロセスの実行環境」をネームスペースアイソレート
26isolate(アイソレート)の語源は、アイランド(island)とかアイル(isle)のように、断崖絶壁の「孤島」のようなイメージ。プロセスはOS上で動いているのに、自分だけが孤島に一人いるかのような状態。
27つまりDockerコンテナはこんな状態。部屋がOS全体とすると、布団によってプロセス(人間)が分けられている状態。人間に例えると、布団をかぶっていますので、外の様子は見えません。
コンテナは特別なプロセスの状態28…/etc /bin(/httpdPID NプロセスA プロセスBrubyPID Mchris.rbPID OコンテナB通常、Linux上で、プログラムをプロセスとして動かし続けるには、/ (ルート)ディレクトリ以下のファイルシステム上にあるバイナリを、プロセスとして起動します。ホスト上
コンテナは特別なプロセスの状態29コンテナAのファイルシステム… …コンテナBのファイルシステム/etc(/data/ubuntu/etc)/bin(/data/ubuntu/bin)/etc(/data/centos/etc)/bin(/data/centos/bin)/ /httpdPID 1プロセスA プロセスBrubyPID 1chris.rbPID 2コンテナA コンテナB改めて「コンテナは特別な状態=isolateしているプロセス」で、お互いのプロセス空間だったりファイルシステムやネットワークなどがisolateしています。
コンテナは特別なプロセスの状態30コンテナAのファイルシステム… …コンテナBのファイルシステム/etc(/data/ubuntu/etc)/bin(/data/ubuntu/bin)/etc(/data/centos/etc)/bin(/data/centos/bin)/ /httpdPID 1プロセスA プロセスBrubyPID 1chris.rbPID 2コンテナA コンテナB名前空間の isolate・プロセス・ファイルシステム・ネットワーク・ホスト名・UID・GID・プロセス間通信、等cgroupでリソース制限・CPU・メモリ・I/O・ディスク・クォータ、等そして、ここで使われる技術が名前空間(namespace)や、cgroupであり、コンテナ内のプロセスは、お互いの状態を知ることができません。
31デフォルトで isolateあらためて、こんな感じの布団をかぶったような状態が、コンテナです。
32デフォルトでisolateあらためて、こんな感じの布団をかぶったような状態が、コンテナです。布団空間内では、自分のプロセスしか見えない。デフォルト(初期状態)からお互いにisolate(隔離・分離)しているプロセスの状態。isolate中にプロセス 中にプロセス
PID名前空間33httpdPID 1プロセスhttpd名前空間プロセスruby名前空間rubyPID 1chris.rbPID 2名前空間の代表的なものがPID名前空間。「httpd」「ruby」これらの2つのプロセスは、それぞれの名前空間内では、それぞれが PID1 として独立しています。
PID名前空間34httpdPID 1プロセスhttpd名前空間プロセスruby名前空間rubyPID 1chris.rbPID 2/sbin/initPID 1containerdPID 5httpdPID 6rubyPID 7chris.rbPID 8alicePID 2bobPID 3PPID 1 PPID 1PPID 4PPID 5 PPID 5PPID 7PPID 1dockerdPID 4ホスト上には存在ただし、あくまでisolateな状態のなのは「同じ名前空間内」のみ。ホスト上で実際のプロセスは、通常のPIDを持ちます。isolateされているので、名前空間内ではPIDが変換されます。
PID名前空間35httpdPID 1プロセスhttpd名前空間プロセスruby名前空間rubyPID 1chris.rbPID 2/sbin/initPID 1containerdPID 5httpdPID 6rubyPID 7chris.rbPID 8alicePID 2bobPID 3PPID 1 PPID 1PPID 4PPID 5 PPID 5PPID 7PPID 1dockerdPID 4ホスト上には存在また、各PID名前空間内で、PID 1は一番上の特別なプロセス。自分以外のPID名前空間内やホスト側は見えません。
ファイルシステムを分ける (chroot)36ubuntuのファイルシステム… …centosのファイルシステム/etc /bin /etc /bin/ /Dockerイメージはファイルシステムを、マウント名前空間(mount namespace)で分離します。chrootと似た概念。マウント ネームスペース
ファイルシステムを分ける (chroot)37ubuntuのファイルシステム… …centosのファイルシステム/etc /bin /etc /bin/ //data/ubuntu /data/centos//etc /data/bin ホスト上には存在コンテナが見えている自分のファイルシステムとは、chrootのようにホスト上をマウントしているため、別のコンテナ用ファイルシステムや、ホスト上の上位ディレクトリにある場所はアクセスできません。
コンテナは特別なプロセスの状態38httpd の専用ファイルシステム(Dockerイメージ)… …ruby の専用ファイルシステム(Dockerイメージ)/etc(/data/ubuntu/etc)/bin(/data/ubuntu/bin)/etc(/data/centos/etc)/bin(/data/centos/bin)/ /httpdPID 1httpdプロセス専用のPID名前空間ruby プロセス専用のPID名前空間rubyPID 1chris.rbPID 2httpd コンテナの名前空間 ruby コンテナの名前空間名前空間の isolate・プロセス・ファイルシステム・ネットワーク・ホスト名・UID・GID・プロセス間通信、等cgroupでリソース制限・CPU・メモリ・I/O・ディスク・クォータ、等PID名前空間、マウント名前空間以外にも、ネットワークなども分離しています。さらに、それぞれのコンテナにcgroupでリソースの制限も可。ただし、コンテナは仮想マシンではありません。ハードウェアの仮想化は行わず、あくまでも、プロセスを特別な状態にしているだけです。mount名前区間mount名前区間
39では、Dockerはコンテナをどうやって作ってるの?以上が一般的に「コンテナ」と呼ばれるものの正体。それでは次に、「Docker」は何をしているのでしょうか?コンテナ
40技術と仕様Technology Specificationコンテナ Dockerまず、コンテナは複数の「技術」総称であり、Docker は、いわば「Docker仕様のコンテナ」を動かすためのプラットフォーム総称であり、プログラムの実装です。
41ユーザ空間システム空間Linux カーネル + システム・ライブラリ(libc)等オペレーティングシステム (OS)の領域プログラム 設定ファイルソースコード データDocker イメージビルドpullDockerイメージ Dockerイメージ※異なるシステム、バージョン、ソースコードDockerイメージを使ってDockerコンテナ(隔離状態)のプロセスを起動Dockerは先ほどのコンテナ状態でプロセスを動かす時、Linuxカーネルと通信したり、Dockerイメージをとってきたりする役割があり、Linux サーバ上では dockerd という名前のデーモンが動きます。これを「Docker エンジンと」呼びます。
42ユーザ空間システム空間Linux カーネル + システム・ライブラリ(libc)等オペレーティングシステム (OS)の領域プログラム 設定ファイルソースコード データDockerコンテナプロセスDockerコンテナプロセスDocker イメージビルドpullDockerイメージ Dockerイメージ※異なるシステム、バージョン、ソースコードDockerイメージを使ってDockerコンテナ(隔離状態)のプロセスを起動「実装としての」Dockerイメージを用い、Dockerコンテナとしてisolateされたプロセスを動かすのが Docker(エンジン)。実はDocker以外にもコンテナと呼ばれる実装は、LXCなり各種自作なりを含めて複数のものがあります。
Dockerはサーバ・クライアント型モデル43OS ( Linux )物理/仮想サーバDocker エンジン( dockerd デーモン )Linux kernelコンテナ コンテナ コンテナリモートAPIdockerクライアント TCP あるいはUnix ソケットドメインcontainerdRuntime: runC (OCI規格準拠)・docker コマンドLinux, Mac OS X, Windows・Kitematic (GUI)Mac OS X, Windows・Docker Compose・Docker SwarmDockerコンテナを管理するDockerエンジン(dockerd)はAPIで制御でき、通常は「docker」という名称のコマンドラインで、「docker run hello-world」のように実行します。
【参考】 Docker Engine のアーキテクチャ44※ Docker Engine v1.11 以降ユーザ(docker CLI等)Docker Container Enginedockerdcontainerd(docker-containerd)shim(docker-containerd-shim)shim(docker-containerd-shim)shim(docker-containerd-shim)runC(runtime-runc)コンテナDocker ImageコンテナDocker ImageコンテナDocker ImageJSON/REST APICNCF/OCI業界標準規格に準拠runC(runtime-runc)runC(runtime-runc)gRPC エンドポイントDocker Engine トップレベルのデーモン(Moby プロジェクトの成果物)Docker イメージに含むファイルを、パラメータに従い、コンテナとして実行コンテナを実際に作成・起動するランタイムのバイナリ・プログラムコンテナやイメージをはじめとし、ネットワーク、ストレージを管理する必要最小限のデーモンランタイムが実行したコンテナを管理厳密には、1つ1つのコンテナはrunCというランタイムが管理し、これらを containerd というデーモンで管理し、docker コマンドの受付や全体の処理を dockerd が行います。ランシー
45DockerイメージとはここからはDockerの内部事情について。まずは、コンテナの元になる「Dockerイメージ」について理解します。Docker イメージの構造は Docker コンテナを形作る実装と深い関係があります。
docker image pull (docker pull)46$ docker image pull hello-worldUsing default tag: latestlatest: Pulling from library/hello-worldd1725b59e92d: Pull completeDigest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788Status: Downloaded newer image for hello-world:latestDocker Hubまず、Dockerイメージは、Docker Hubと呼ばれるイメージを共有・共同作業・自動構築するための公開リポジトリ上を通して配布されており、ここからダウンロードしたり、アップロードしたりできます。ドッカーハブドッカー イメージ プル ドッカー プル※Dockerイメージを、ローカルにダウンロードするコマンドDockerイメージを準備するには、自分で構築(ビルド)する方法とダウンロードする方法があります。
47$ docker pull hello-worldUsing default tag: latestlatest: Pulling from library/hello-worldd1725b59e92d: Pull completeDigest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788Status: Downloaded newer image for hello-world:latest「docker pull イメージ名」コマンドの実行は、ユーザ名に相当する名前空間(スラッシュより前)が無ければ、自動的に公式イメージ用の「library」というリポジトリからダウンロードします。docker image pull (docker pull)Docker Hubドッカー イメージ プル ドッカー プル※Dockerイメージを、ローカルにダウンロードするコマンド「pull」コマンドは「引っ張ってくる」という意味です。Docker Hub からイメージを引っ張ってきます。ライブラリ
Dockerイメージはイメージ・レイヤの積み重ね48プログラムやライブラリとメタ情報(実行するプログラムやポートなど)Dockerイメージは、仮想マシンイメージのように、1つのファイルが存在するのではありませえん。実際には複数のイメージ・レイヤ(層)の重なりで構成され、これを1つのファイルシステムとして使えます。複数のイメージ・レイヤ(層)が重なり(実体としては、ホスト上の複数のファイルやディレクトリを、1つのファイルシステムに見せる技術UFSを使用)、あたかも1つのファイルシステムとして、 Docker イメージが存在しているように見えます。
Dockerイメージはイメージ・レイヤの積み重ね49基本となるのは、ベース・イメージと呼ばれる、様々な Linux ディストリビューションのファイルシステムです。...etcDocker Hub 上ある公式イメージ例
Dockerイメージはイメージ・レイヤの積み重ね50この上に、複数のイメージ・レイヤ(層)が積み重なり、
Dockerイメージはイメージ・レイヤの積み重ね51プログラムやライブラリとメタ情報(実行するプログラムやポートなど)コンテナを動かすために必要な依存関係をパッケージ化したものが、Docker イメージです(読み込み専用)。
Dockerイメージはイメージ・レイヤの積み重ね52利用時には1つに見える親子関係重要なのは、イメージ・レイヤは親子関係(親・イメージの情報)を持つのと、利用時には複数のイメージ・レイヤ(実体として、ホスト上に複数のファイルやディレクトリ)が1つに見えます。
Dockerイメージはイメージ・レイヤの積み重ね53利用時には1つに見える親子関係派生は親子関係レイヤを共有可利用時には1つに見えるプログラムやライブラリとメタ情報(実行するプログラムやポートなど)だから高速に移動できる・開発を高速化できるリソースを有効に使える “lightweight” な性質gitでfork(分岐)するように、共通の親イメージを持つイメージ・レイヤも存在でき、ホスト上に余分な容量を必要としません
54利用者からは1つに見えるdocker image build -t <IMAGE:TAG> .(docker build)そして、Dockerflie の各行が、(抽象概念としての)イメージ・レイヤを構成しています。これは Alpine Linux です。Dockerfile で Docker イメージを自動構築するコマンド:ドッカー イメージ ビルド 疑似tty イメージ・コロン・タグ最後のドットがコンテクスト(Dockerfileのある場所)を指定ドッカーファイル
55利用者からは1つに見えるhello:v1FROM alpineENTRYPOINT ["/bin/echo"]CMD ["こんにちは!こんにちは!"]docker image build -t hello:v1 .(docker build)たとえば、このような Dockerfile を「バージョン1」として、
56hello:v1FROM alpineENTRYPOINT ["/bin/echo"]CMD [“おはよう!おはよう!"]docker image build -t hello:v2 .hello:v23行目の「CMD」行だけ書き換えたものを「バージョン2」のイメージとしても、増えるのは「CMD」用のレイヤのみ。また、ビルド済みイメージ・レイヤは「キャッシュ」として利用できるので、高速な構築が可能になります。
Dockerfileで中間コンテナ実行・イメージ作成を自動化❶ まず Dockerfile を書きます。あるいは、GitHub等から取得❷ “docker build” でDocker はイメージを自動構築開始❸完成したイメージでコンテナを起動したりDockerHubに送信を命令1命令2命令3$ mkdir myproject$ cd myproject$ vim Dockerfile$ docker build -t myproj .読み込みイメージレイヤ群を自動構築Dockerfile$ docker run -d myproj$ docker pushDockerがDockerfileを読み込み中間コンテナを起動して命令を実行→docker commitでイメージ化(((commitcommitcommit通常、Docker コンテナを作って実行するまでは、このような流れ
DockerfileDockerfile にイメージ構築に必要な全ての命令を書く• Dockerイメージは読み込み専用のイメージレイヤ群で構成• 各イメージ・レイヤが Dockerfile の命令に相当する• 記述例58FROM ubuntu:18.04 ← “ubuntu:18.04”のイメージから、レイヤを作成もう少し Dockerfile について掘り下げます。Dockerfile は自分でもテキスト・エディタ等で自由に書けます。
DockerfileDockerfile にイメージ構築に必要な全ての命令を書く• Dockerイメージは読み込み専用のイメージレイヤ群で構成• 各イメージ・レイヤが Dockerfile の命令に相当する• 記述例59FROM ubuntu:18.04COPY . /app← “ubuntu:18.04”のイメージから、レイヤを作成← “.” ディレクトリを、コンテナの “/app” にコピーレイヤは親子関係を持ち、依存・参照Dockerfile は上の行から順番に処理が進みます。
DockerfileDockerfile にイメージ構築に必要な全ての命令を書く• Dockerイメージは読み込み専用のイメージレイヤ群で構成• 各イメージ・レイヤが Dockerfile の命令に相当する• 記述例60FROM ubuntu:18.04COPY . /appRUN make /app← “ubuntu:18.04”のイメージから、レイヤを作成← “.” ディレクトリを、コンテナの “/app” にコピー← コンテナ内で “meke /app” を実行レイヤは親子関係を持ち、依存・参照Dockerfileがなくても、「docker history」コマンドでイメージの内容を調べられます。
DockerfileDockerfile にイメージ構築に必要な全ての命令を書く• Dockerイメージは読み込み専用のイメージレイヤ群で構成• 各イメージ・レイヤが Dockerfile の命令に相当する• 記述例61← “ubuntu:18.04”のイメージから、レイヤを作成← “.” ディレクトリを、コンテナの “/app” にコピー← コンテナ内で “meke /app” を実行← コンテナ実行時、デフォルトで実行するコマンドとして”python /app/app.py” を指定FROM ubuntu:18.04COPY . /appRUN make /appCMD python /app/app.py
Docker BuildKit を使う方法• クライアントの環境変数• Docker デーモン設定ファイル /etc/docker/daemon.json62{ "features": { "buildkit": true }}export DOCKER_BUILDKIT=1現在の Docker 18.03 以降では、 BuildKit を有効にすると、並列ビルドなどによって高速にイメージを構築できます。
63DockerイメージとDockerコンテナの関係Docker イメージは、複数のイメージ・レイヤによって構成される Linux ファイルシステムでこれを使って「Dockerコンテナ」を「作成」した後、「Dockerコンテナ」としてのプロセスを「実行」します。
Dockerコンテナ作成とはコンテナ用のレイヤを追加64元のレイヤに対する変更情報を記録Copy on Write の性質Dockerコンテナの作成とは、元となる Docker イメージのレイヤ上に、読み書き可能なイメージ・レイヤを追加します。そのため、イメージ・レイヤ内のファイルやディレクトリに対する操作は、すべて新しいレイヤ上に記録されます。コンテナ作成時、新しい「読み書き可能」なイメージ・レイヤを追加
Dockerコンテナ作成とはコンテナ用のレイヤを追加65利用者からは1つに見える元のレイヤに対する変更情報を記録Copy on Write の性質コンテナ用のレイヤは、Docker イメージのレイヤと同様、1つのファイルシステムとして利用できる特性があるため、Dockerイメージがローカルにある場合、Dockerコンテナの作成は高速になります。
Dockerコンテナ作成とはコンテナ用のレイヤを追加66利用者からは1つに見える利用者からは1つに見えるだから高速に移動できる・開発を高速化できるリソースを有効に使える “lightweight” な性質元のレイヤに対する変更情報を記録Copy on Write の性質また、複数のコンテナを作成しても、都度コンテナ用のレイヤを追加するだけです。そのため、仮想マシンの作成に比べると、アプリケーションの実行環境を格段に早く準備できます。
Dockerコンテナ実行とは?67つまり、Dockerコンテナの実行とは、「Dockerイメージ」に「読み書き可能なイメージ・レイヤ」を追加し、ファイルシステム内にあるバイナリを、名前空間を分離した特別な状態のプロセスとして実行することです。バイナリ 設定ファイルソースコード データDockerコンテナプロセスisolateした特別な名前空間でプロセスを実行Docker コンテナの「作成」 Docker コンテナの「実行」docker container create docker container start+docker container run
68Nginxのコンテナを作っておいたよ~さて、改めて「Nginxのコンテナを作っておいたよ~」の意図を振り返ってみましょう。
69Nginxのコンテナを作っておいたよ~「Nginx」の Docker イメージには、バイナリ、設定ファイル、関連ファイルをパッケージ化し、名前空間でisolate(分離)した特別な状態としてのプロセスを「NginxのDockerコンテナ」として実行します。バイナリ設定ファイルデータNginxを実行するために依存関係があるファイルすべてをパッケージ化(この中身は、 Linux ファイルシステム)「Nginx が入っている Docker イメージ」を使って、「Nginx の Docker コンテナ」を「実行」するNginx Docker イメージDocker の仕事とはDocker イメージ ≠ Docker コンテナ
Docker ネットワーク概要Docker network70
デフォルトはコンテナ外から通信不可71コンテナ(分離された名前空間)ホスト上port80ethXコンテナのプロセスが名前空間によって分離されているのと同様、ネットワークもデフォルトで分離されています。コンテナ実行時、コンテナから外部への通信は可能です(インターネットに疎通しています)。しかし、コンテナ内でポートを開いていたとしても(例:ポート80をリッスン)、ホスト上・ホスト外を問わず、コンテナ内のポートにはアクセスできません。
723つの Docker 標準ネットワークモデルbridge(bridge)host(host)none(null)ブリッジ(bridge0 …)vetheth0ethXDockerでコンテナを実行すると、プロセスの「ネットワーク」や「ホスト名」もisolate(分離)した状態で起動。docker network lsコマンドの実行ではじめから3つのネットワークが表示。
733つの Docker 標準ネットワークモデルbridge(bridge)ブリッジ(bridge0 …)vetheth0ethXnone(null)host(host)複数のブリッジ(ネットワーク)を定義できるデフォルトのbridge0ブリッジは、旧仕様のネットワークで、挙動が異なるデフォルトは「ブリッジ」ドライバを使う「bridge」という名称のネットワークを通して、ホスト側にポートをマッピングport8080port80docker run -p 80:8080
743つの Docker 標準ネットワークモデルbridge(bridge)host(host)none(null)ブリッジ(bridge0 …)vetheth0ethXホスト側のネットワークに直接接続ブリッジのオーバーヘッドがない一方で、セキュリティに対する考慮が必要ホスト側のインタフェースを直接使いたい場合、docker run のオプションで --network=host を指定port8080port8080コンテナでポートを開くと、自動的にホスト側の公開ポートを直接利用する
753つの Docker 標準ネットワークモデルbridge(bridge)host(host)ブリッジ(bridge0 …)vetheth0ethXネットワークを追加しない限り疎通できないnone(null)コンテナ内からインターフェースが見えず、他のコンテナや外部のネットワークに対して疎通させない
763つの Docker 標準ネットワークモデルbridge(bridge)host(host)none(null)ブリッジ(bridge0 …)vetheth0ethXNAT(iptables)+docker-proxyホストとネットワーク共通疎通しないコンテナはパブリックなIPアドレスを持ないホスト側のポート番号を重複して、コンテナのポート利用(マッピング)はできない動的なネットワークの追加・変更・削除
77コンテナは複数のネットワーク(ブリッジ)に接続できるブリッジ1(bridge)vetheth0ethX各ネットワーク内部では、動的なコンテナ名(サービス)の名前解決機能(サービス・ディスカバリ)を標準提供しているeth0 eth1 eth0ブリッジ2(bridge)veth192.168.0.1172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3172.19.0.1172.19.0.0/16172.18.0.0/16サービス・ディスカバリ連携の負荷分散この画面では、2つのネットワークが存在しています。コンテナは動的にネットワークへ接続・切断できます。
78デフォルトで isolateネットワークもDockerコンテナは
【参考】 swarm mode のネットワーク機能79Multi Host NetworkingWorkernodeWorkernodeWorkernodeoverlaynetworkIngressnetworkコンテナPublishPortRoutingMesh80 443 80 443 80 443負荷分散swarm mode でクラスタを組む場合、複数のサーバ間で共通の ingress ネットワークを利用できます。クラスタのどのノードにアクセスしても、内部ネットワークを通して、コンテナが存在するノードにルーティングし、複数台のコンテナがある場合は負荷分散も行います(コンテナのサービス名で名前解決します)。サービス・ディスカバリ(動的な名前解決)スウォーム・モード公開ポートイングレス・ネットワークオーバレイ・ネットワークワーカーノードルーティング・メッシュ
Docker ボリューム概要Docker volume80
81データの扱いコンテナA専用ファイル階層File System…//bin/etc/varコンテナB専用ファイル階層File System…//bin/etc/varhello.txtHOST RootFile System/var/lib/docker/overlay/hello.txt実際のホスト上におけるディレクトリ名やファイル名はストレージドライバの実装によって異なるABUFS( Union File System )この2つのコンテナ(のプロセス)は、別々に独立した(isolateした)ファイル階層を持っています。
82データの扱いコンテナA専用ファイル階層File System…//bin/etc/varコンテナB専用ファイル階層File System…//bin/etc/varhello.txt×HOST RootFile System/var/lib/docker/overlay/hello.txtABUFS( Union File System )別の名前空間(Mount namespace)上にあるファイルは、原則として参照できません。実際のホスト上におけるディレクトリ名やファイル名はストレージドライバの実装によって異なる
83データの扱いコンテナA専用ファイル階層File System…//bin/etc/varコンテナB専用ファイル階層File System…//bin/etc/varhello.txt×HOST RootFile System/var/lib/docker/overlay/hello.txtABUFS( Union File System )プロセスだけでなく、(名前空間がマウントしている)ファイルシステムもisolate(独立)状態実際のホスト上におけるディレクトリ名やファイル名はストレージドライバの実装によって異なる
84ボリュームコンテナA専用ファイル階層File System…//bin/etc/varコンテナからはUFSを通して(マウントして)データ領域が見えるストレージ・ドライバのオーバヘッドを受けない複数のコンテナでボリュームを共有できるvolume/data/ボリュームVolume/var/lib/docker/volumes/HOST RootFile System例外として、「ボリューム」という抽象的な概念を持つ場所を、コンテナのファイルシステムにマウントできます。これはイメージのレイヤ構造と分かれているため、docker build や docker commit をしても、内容をイメージ化しません。
85コンテナファイル階層File System/UFS ( Union File System)…//bin/varDockerイメージDocker Image/var/lib/docker/image/volume/ボリュームVolume/dataコンテナ用イメージ層Container’sImage Layer//var/lib/docker/volumes//var/lib/docker/containers/ReadOnlyこのように、コンテナ上で見えるファイルシステムは、複数のディレクトリを1つに統合して操作可能にしています。
86ボリュームは3分類ホストをマウント 名前付きホスト上のディレクトリ/docker/data/data名前無しvolumeボリュームの実体は、ホスト上のディレクトリ/var/lib/docker/volumes/ 以下ボリュームはコンテナ間でデータを共有できるvolume/data /data /etcdocker run –v [ホスト上のパス]:[コンテナ上のパス]で、コンテナ上からホスト上に直接接続(マウント)する方法と、抽象概念としてのボリューム領域を指定する方法があります。docker run –v /docker/data/:/datadocker run –v data:/dataDockerでコンテナ間で動的なデータ領域を共有するには、
コンテナを作るまとめとふり返り87#とはコンテナ
Dockerコンテナ実行とは?88バイナリ 設定ファイルソースコード データDockerコンテナプロセスisolateした特別な名前空間でプロセスを実行Docker コンテナの「作成」 Docker コンテナの「実行」docker container create docker container start+docker container run改めて Docker の仕事は、アプリケーション実行に最低限必要なファイルを Docker イメージにパッケージ化し、その中に含まれているバイナリを、(isolate=分離した)特別な状態のプロセスとして実行することです。
89Nginxのコンテナを作っておいたよ~一般的に、コンテナを作って動かした場合は、
90Nginxのコンテナを作っておいたよ~バイナリ設定ファイルデータNginxを実行するために依存関係があるファイルすべてをパッケージ化(この中身は、 Linux ファイルシステム)「Nginx が入っている Docker イメージ」を使って、「Nginx の Docker コンテナ」を「実行」するNginx Docker イメージDocker の仕事とはDocker イメージ ≠ Docker コンテナNginxであれば、このような利用シーンです。Docker イメージで、Docker コンテナを実行。そして、各イメージ・レイヤは親子関係を持ち、移動や再構築をスムーズに行う仕組みが整っています。
91コンテナの「気持ち」を理解しよう
92コンテナの「気持ち」を理解しよう
93コンテナの「気持ち」を理解しよう布団から出られない人のいらすとhttps://www.irasutoya.com/2014/04/blog-post_2419.htmlCopyrightデフォルトでisolate寒い冬は、布団でぬくぬくしていたいですよね、「布団から出たくない人」の気持ちこそが、コンテナの気持ち!(半分冗談ですが)
Dockerとは?94Why Docker?1Dockerコンテナは実行に必要な全てをパッケージして、簡単に動かせる2Dockerイメージは複数イメージ・レイヤとメタ情報の積み重なり 3コンテナのプロセスはデフォルトでisolate(隔離・分離)された状態⚫ イメージ・レイヤ(image layer)は読み込み専用⚫ 親子関係がある⚫ イメージに対する変更はCopy onWrite(CoW)処理が走る⚫ コンテナ実行にはイメージが必要で、Docker Hubから得られる⚫ コンテナ実行時のみ、読み書きが可能なレイヤを追加⚫ namespace(名前空間)でプロセス空間やファイルシステムやネットワーク等を分ける技術と、cgroups(コントロール・グループ)でリソースの利用上限を指定⚫ コンテナはポートをデフォルトで開かない⚫ ネットワークはブリッジ、ホスト、noneの3種類⚫ ボリュームはコンテナ間でファイルシステムを共有できる。名前付き(named)とホスト・ボリューム⚫ アプリケーションを簡単に開発し、移動し、実行するためのプログラムとプラットフォームを提供するのがDocker⚫ クライアント・サーバ型https://docker.comプロセスを簡単にコンテナ化(isolate)し、簡単かつ素早く開発・移動・実行できるプラットフォームが DockerContainerization「プロセス・ファイルシステム・ネットワーク・等々」に対してNamespace・CgroupBuild Ship Runコンテナ化 名前空間 シーグループ
次のステップは?95チュートリアルを試して、実際にコンテナを操作しましょうDocker Meetup Kansai 19.06 ハンズオン手順 - Qiitahttps://qiita.com/zembutsu/items/322987181616a54c359a
私からは以上です。ありがとうございました。【参考資料】• https://slideshare.net/zembutsu• Dockerドキュメント日本語訳http://docs.docker.jp• Docker Composeドキュメント日本語訳http://docs.docker.jp/compose/• 公式ドキュメントhttps://docs.docker.com96

Recommended

PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
Dockerからcontainerdへの移行
PDF
Docker Compose 徹底解説
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PPTX
Dockerからcontainerdへの移行
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
DockerとPodmanの比較
PDF
例外設計における大罪
PDF
Dockerfileを改善するためのBest Practice 2019年版
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PPTX
世界一わかりやすいClean Architecture
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
マイクロにしすぎた結果がこれだよ!
PDF
Serverless時代のJavaについて
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
PDF
超実践 Cloud Spanner 設計講座
PPTX
分散システムについて語らせてくれ
PPTX
BuildKitによる高速でセキュアなイメージビルド
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
Where狙いのキー、order by狙いのキー
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
Akkaとは。アクターモデル とは。
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
イミュータブルデータモデルの極意
PDF
BuildKitの概要と最近の機能
PDF
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
PPTX
いまさら聞けないDockerコンテナ超入門

More Related Content

PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
Dockerからcontainerdへの移行
PDF
Docker Compose 徹底解説
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PPTX
Dockerからcontainerdへの移行
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
DockerとPodmanの比較
Dockerfile を書くためのベストプラクティス解説編
コンテナ未経験新人が学ぶコンテナ技術入門
Dockerからcontainerdへの移行
Docker Compose 徹底解説
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Dockerからcontainerdへの移行
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
DockerとPodmanの比較

What's hot

PDF
例外設計における大罪
PDF
Dockerfileを改善するためのBest Practice 2019年版
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PPTX
世界一わかりやすいClean Architecture
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
マイクロにしすぎた結果がこれだよ!
PDF
Serverless時代のJavaについて
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
PDF
超実践 Cloud Spanner 設計講座
PPTX
分散システムについて語らせてくれ
PPTX
BuildKitによる高速でセキュアなイメージビルド
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
Where狙いのキー、order by狙いのキー
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
Akkaとは。アクターモデル とは。
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
イミュータブルデータモデルの極意
PDF
BuildKitの概要と最近の機能
例外設計における大罪
Dockerfileを改善するためのBest Practice 2019年版
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
ドメイン駆動設計のための Spring の上手な使い方
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
世界一わかりやすいClean Architecture
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
マイクロにしすぎた結果がこれだよ!
Serverless時代のJavaについて
Docker道場オンライン#1 Docker基礎概念と用語の理解
超実践 Cloud Spanner 設計講座
分散システムについて語らせてくれ
BuildKitによる高速でセキュアなイメージビルド
マルチテナント化で知っておきたいデータベースのこと
Where狙いのキー、order by狙いのキー
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
Akkaとは。アクターモデル とは。
ブルックスのいう銀の弾丸とは何か?
イミュータブルデータモデルの極意
BuildKitの概要と最近の機能

Similar to コンテナの作り方「Dockerは裏方で何をしているのか?」

PDF
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
PPTX
いまさら聞けないDockerコンテナ超入門
PPTX
Dockerの基本的な話
PDF
Dockerの基本と応用~快適コンテナライフを実現するArukas~
PDF
捕鯨!詳解docker
PDF
LinuxClub勉強会 - 基礎とハンズオンから始めるDockerを使用したコンテナ技術
PPTX
Docker & Kubernetes基礎
PDF
オトナのDocker入門
PDF
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
PDF
Docker入門: コンテナ型仮想化技術の仕組みと使い方
PDF
Dockerの仕組みとIIJ社内での利用例
PPTX
Docker v14
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
PPTX
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
PDF
Docker handson
 
PDF
Docker 基本のおさらい
PDF
8a1#19[はじめてのdocker] 公開版
PDF
Docker入門
PDF
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
PDF
Dockerでらくらく開発・運用を体感しよう
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
いまさら聞けないDockerコンテナ超入門
Dockerの基本的な話
Dockerの基本と応用~快適コンテナライフを実現するArukas~
捕鯨!詳解docker
LinuxClub勉強会 - 基礎とハンズオンから始めるDockerを使用したコンテナ技術
Docker & Kubernetes基礎
オトナのDocker入門
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Dockerの仕組みとIIJ社内での利用例
Docker v14
Docker入門 - 基礎編 いまから始めるDocker管理
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Docker handson
 
Docker 基本のおさらい
8a1#19[はじめてのdocker] 公開版
Docker入門
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Dockerでらくらく開発・運用を体感しよう

More from Masahito Zembutsu

PDF
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
PDF
自由検証環境提供宣言+Docker Compose V2 GA
PDF
CentOS Linux 8 の EOL と対応策の検討
PDF
さくらインターネットのコミュニティ with COVID-19
PDF
Docker Chronicle 2021.09
PDF
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
PDF
インターネットでウェブサイトを表示している裏側の話
PDF
3分で分かる「プログラミング教育・情報教育」
PDF
ようこそオンラインの展示会場へ
PDF
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
PDF
オンライン発表で気を付けているポイント~姿勢編
PDF
Jitsi Meetとは?
PDF
Docker 9 tips~意外と知られていない日常で役立つ便利技
PDF
クリスマスに工場(Factorio)を作るゲームをしよう
PDF
2020年から始まる小学校プログラミング教育の話 #osc19os
PDF
CNCF Updates 2019 Winter version and Knative
PDF
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
PDF
CNCFアップデート情報~2018年のCNCFを振り返る
PDF
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
PDF
コンテナ導入概要資料2018
忙しい人のための Rocky Linux 入門〜Rocky LinuxはCentOSの後継者たり得るか?〜
自由検証環境提供宣言+Docker Compose V2 GA
CentOS Linux 8 の EOL と対応策の検討
さくらインターネットのコミュニティ with COVID-19
Docker Chronicle 2021.09
ブックトーク@CROSS ~SF編~ 発表資料「攻殻機動隊」「導きの星」
インターネットでウェブサイトを表示している裏側の話
3分で分かる「プログラミング教育・情報教育」
ようこそオンラインの展示会場へ
小学校プログラミング教育に対する企業の取り組みと課題 #KOF2020
オンライン発表で気を付けているポイント~姿勢編
Jitsi Meetとは?
Docker 9 tips~意外と知られていない日常で役立つ便利技
クリスマスに工場(Factorio)を作るゲームをしよう
2020年から始まる小学校プログラミング教育の話 #osc19os
CNCF Updates 2019 Winter version and Knative
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
CNCFアップデート情報~2018年のCNCFを振り返る
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
コンテナ導入概要資料2018

コンテナの作り方「Dockerは裏方で何をしているのか?」


[8]ページ先頭

©2009-2025 Movatter.jp