「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[Linuxを触ってみる。]]
--[[Linux]]
--[[言語等に依存しない汎用開発支援ツール]]

*目次 [#n5ee47e4]
#contents

*概要 [#b455eff1]
-[[Linuxコンテナ>#c0b2e7af]]を使った、主にソフトウェアの自動デプロイメント(展開)を支援するシステム
-dotCloud社(現Docker社)が開発し、2013年にオープンソースのプロジェクトとして公開
-[[Docker for Windows>Kubernetesの構築#w2a38c40]] は [[Linuxコンテナ>#c0b2e7af]]と[[WindowServerコンテナ>https://techinfoofmicrosofttech.osscons.jp/index.php?Windows%20Server%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A]]のフロント+αの機能を提供する。

*Linuxコンテナ [#c0b2e7af]
Linuxネイティブなコンテナ。
**LXC [#c0b2e7af]
LXC(Linuxコンテナ)とは、Linuxネイティブなコンテナの事。

**方式 [#p5c8e3f3]
-Linux OSの持つコンテナ機能やリソースの管理機能などをベースに作られた、コンテナ型の仮想化技術

-[[VSSでも使用しているCopy on Writeの仕組み>https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98#o8de7bcd]]をUnionFileSystemの機能で実現し、コンテナ型の仮想化を行っている。

-コンテナ自体は、Dockerが登場する以前から存在し、古くから商用製品にも採用されている技術。

-一般的に、Linux OS上での分離された空間を「Linuxコンテナ」と呼び、Linuxコンテナは、一般的に、LXCとも呼ばれる。

**特徴 [#kc543dbe]
***方式 [#p5c8e3f3]

-コンテナ・イメージは、

--LinuxのABI (Application Binary Interface)より上の~
「特定のディストリビューション上で再現されたファイルシステム」から。

--[[VSS>https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98#o8de7bcd]]でも使用しているCopy on Write(CoW)の~
スナップショット(差分)の仕組みをUnionFileSystemの機能で実現して、差分で作成する。

-これにより、コンテナ型の仮想化技術を実現している。~
(システム的にはカーネル共有の単なるプロセスの起動)

***特徴 [#kc543dbe]
-マシン全体を仮想化する仮想化技術と比べると、~
コンテナによる仮想化は軽量・高速で、実行に必要なリソースも少なくて済む。

-システムの構成変更や展開の容易さなどから、~
開発段階から実運用環境まで、幅広く利用されている。

-コンテナ上で動作するプログラムは、基本的にはLinuxのバイナリ。

**Dockerコンテナ [#u4d4949f]
***Dockerコンテナ [#u4d4949f]
-古いバージョンのDockerは、[[Linuxコンテナ>#c0b2e7af]]を使っていたため、~
[[Linuxコンテナ>#c0b2e7af]]もDockerコンテナも同一のものとして考えても差し支えなかった。

-現在のDockerは、libcontainerを利用するようになり、~
[[Linuxコンテナ>#c0b2e7af]]に依存する部分が無くなった。

-このため、[[Linuxコンテナ>#c0b2e7af]]とDockerコンテナは、同じものではないが、考え方という観点では、~
[[Linuxコンテナ>#c0b2e7af]]もDockerコンテナも、同様の分離された空間を提供することには違いがない。

-参考
--コンテナ技術の基礎知識 | Think IT(シンクイット)~
https://thinkit.co.jp/story/2015/08/11/6285

*機能 [#j9abf453]
**機能 [#j9abf453]

**Build [#t78af897]
***Build [#t78af897]
コンテナ・イメージ([[Dockerイメージ>#vee01503]])をビルドする機能
-コマンドを使用してBuildできる。
-基本的には、[[Dockerファイル>#ea5191dc]]を使用してBuildする。
-[[前述のCopy on Writeの仕組み>#c0b2e7af]]で[[Dockerイメージ>#vee01503]]を重ね合わせる事が出来る。
-[[前述のCopy on Writeのスナップショット(差分)の仕組み>#p5c8e3f3]]で~
[[Dockerイメージ>#vee01503]]を重ね合わせる事が出来る。

**Ship [#bde7ac36]
***Ship [#bde7ac36]
[[Dockerイメージ>#vee01503]]を共有する機能~
(コンテナを積む、輸送するイメージ)

-Buildした[[Dockerイメージ>#vee01503]] は [[Dockerレジストリ>#hff8c9d7]]で共有できる。
-改ざん検知や、脆弱性スキャン機能を持つ。

**Run [#j4bf1913]
***Run [#j4bf1913]
[[Dockerコンテナ>#u4d4949f]] で [[Dockerイメージ>#vee01503]]を実行させる機能

-プロダクション環境では複数のホストで動作させる。
-これには、オーケストレーション・ツールを利用する。

**エディション [#w6eba6bc]

***CE [#qa8ccb65]
-無償
-サポートが不要な環境で使用する。

***EE [#o8b0135f]
-有償

-種類

--Basic
---サポート
---認証済コンテナ
---認証済みプラグイン

--Standard
---Basicに加え
---LDAP、AD統合機能

--Advanced
---Standardに加え
---セキュリティ機能

*サブシステム [#n397cba0]

**イメージ [#sb48ec65]

***[[Dockerファイル]] [#ea5191dc]
[[Dockerイメージ>#vee01503]]を作成するファイル。
[[Dockerイメージ>#vee01503]]を作成するために、[[Docker Build>#t78af897]]コマンドに指定するファイル

***Docker multi stage build [#o9bb2f8b]
-Docker 17.05で導入された革新的な機能。
-[[Build>#t78af897]]を複数に分割して実行できる。
-今までも手動で複数の[[Dockerファイル>#ea5191dc]]を組み合わせればできたが、~
1ファイルで書けるようになり気軽に中間[[イメージ>#vee01503]]を色々使えるようになった。

-ユースケース

--依存関係の分離
---開発用ビルドの依存
---ランタイムの依存

--, etc.

***Dockerイメージ [#vee01503]
-ベースイメージに[[Copy on Write>#c0b2e7af]]した差分。
-ベースイメージに[[Copy on Write>#p5c8e3f3]]したスナップショット(差分)。
-[[Dockerイメージ>#vee01503]]を使用して[[Dockerコンテナ>#u4d4949f]]を起動する。
-イメージ・レイヤが上層に積み上げられる。

***Dockerレジストリ [#hff8c9d7]
***[[Dockerレジストリ]] [#hff8c9d7]
「Docker」向けに、作成した[[Dockerイメージ>#vee01503]]を公開するサービス

-Docker Hub~
https://hub.docker.com/
--Docker社が営利目的で開発・運営しているサービス。
--「[[Docker for Windows>https://techinfoofmicrosofttech.osscons.jp/index.php?Docker%20for%20Windows]]」向けの、Windowsコンテナも公開される。

**クライアント [#ea8eb7dc]

***[[Dockerコマンド]] [#jbff7b71]

***[[Kitematic]] [#pb50332d]

**サーバ [#p5449adb]

***Docker Engine (エンジン) [#w04476f3]
[[Dockerイメージ>#vee01503]]の作成と[[Dockerコンテナ>#u4d4949f]]の実行に必要なコア機能を提供。
-[[Dockerイメージ>#vee01503]]の作成と[[Dockerコンテナ>#u4d4949f]]の実行に必要なコア機能を提供。
-この機能に関しては、[[Dockerコマンド>#jbff7b71]]から確認できる。

***Docker Swarm (スウォーム) [#u512f6bd]
-ホストのクラスタリングと[[Dockerコンテナ>#u4d4949f]]のスケジューリングをする。
-クラスタは主に複数のマスター (master) とノード (node) から構成される。
-Docker Swarmは[[K8sも利用可能(K8sもmasterとnodeから構成される)>Kubernetes#xbc57197]]。

***Docker Compose (コンポーズ) [#n7abbd38]
***[[Docker Compose (コンポーズ)>Dockerコンポーズ]] [#n7abbd38]
複数の[[Dockerコンテナ>#u4d4949f]]を使うアプリケーションを定義する。

***Docker Machine (マシン) [#p8e6e858]
自分のネットワークやクラウド上に、自動的に[[Dockerコンテナ>#u4d4949f]]をデプロイする。

***Dockerデーモン [#be9eca12]
Dockerデーモンに[[Dockerイメージ>#vee01503]]の実行を要求すると、Dockerデーモンは、
-実行する[[Dockerイメージ>#vee01503]]の正しいバージョンを持っていることを確認する。
-持っていない場合、指定された[[Dockerレジストリ>#hff8c9d7]]から引き出す。
-Dockerデーモンに[[Dockerイメージ>#vee01503]]の実行を要求する。
-この実行では、構築・実行・[[Dockerコンテナ>#u4d4949f]]の配付を行う。

-この動作をカスタマイズするにはいくつかの方法がある。
--イメージを指定する際
--イメージ・プルポリシー

*仕組み [#h396aff2]

**名前空間 [#wffae207]
Linuxのnamespace機能は、~
オブジェクトに対する名前付けにより隔離機能を提供する。

***PID namespace [#dab38798]
-オブジェクト : LinuxのプロセスID
-コンテナ内で、同じPIDを使用できるなど。

***Network namespace [#g18c133f]
-オブジェクト
--ネットワークデバイス、IPアドレス、ポート番号
--ルーティング・テーブル、フィルタリング・テーブル

-コンテナ内で、同じポート番号を使用できるなど。

***UID namespace [#o1d2339a]
-オブジェクト : LinuxのユーザID
-ホスト、コンテナでの隔離する。~
(アカウントを異なる権限でマップする。)

***Mount namespace [#fafef6e4]
-オブジェクト : ファイルシステム
-ホスト、コンテナでの隔離する。

***UTS namespace [#fc68335f]
-オブジェクト : Unix Time-sharing System(現在は既にその意味は失われている)
-システム識別子(nodename 及び domainname)を隔離する。

***IPC namespace [#i3390c7a]
-オブジェクト : プロセス間通信(IPC)オブジェクト
--共有メモリ、メッセージキュー
--スレッド同期ツールキット

-コンテナ内で、IPCオブジェクトを隔離する。

**リソース管理 [#bde67ee9]
Linuxのcgroups機能は、リソース管理機能を提供する。

***リソース [#l5fc6f6f]
-CPU : cgroup 内のタスクによって使用されるCPUリソースの
--cpu : 使用量の制限
--cpuacct : 自動レポートを生成
--cpuset  : 配置をセット

-memory : cgroup 内のタスクによって使用されるメモリ・リソースの
--自動レポートを生成
--メモリ使用の上限設定

-device : cgroup 内のタスクによるデバイスへのアクセス許可・拒否
-freezer : cgroup 内のタスクを一時停止あるいは再開
-net_cls : ネットワークパケットをタグ付け 
-blkio : cgroup 内のタスクによる、ブロックデバイス上の I/O へのアクセスを制御・監視

***管理機能 [#ob942683]
プロセスをグループ化して管理可能

 ルート ┬-> ユーザ・アプリ ┬-> エディタ
        │                  └-> 自作アプリ
        │
        └-> デーモン・アプリ ┬-> WWWサーバ
                              ├-> APサーバ
                              └-> DBサーバ

**ネットワーク構成 [#h8242c15]

***ホスト毎 [#a9224dd3]
-物理NIC(eth0)
--ホストのNIC
--ホストがVMだったら仮想NICでは?

-[[NAPT>https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E5%99%A8%E4%B8%80%E8%A6%A7#a4d3188c]](ip tables)~
ホストの8080 → コンテナの80

-仮想ブリッジ(docker0)

***コンテナ毎 [#p90b20ec]
-仮想NIC(veth xxx)
--Veth pair (Virtual ethernet tunnel pair)
--Linux には、OpenVZ由来の Virtual Ethernet Tunnel (veth) というものがある。~
名前が示す通り、仮想的な Ethernet Interface の組を作成して、繋いでくれる。


-仮想NIC(eth0)
--コンテナのNIC
--veth xxxとペア。

**ストレージ・ドライバ [#m976ee3e]
-[[前述のCopy on Writeの仕組み>#c0b2e7af]]を提供する。
-[[前述のCopy on Writeのスナップショット(差分)の仕組み>#p5c8e3f3]]を提供する。
-コンテナ化されたアプリケーションの性能に影響を与える。

-参考
--Dockerのストレージドライバを理解する - Qiita~
https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7
--ストレージ・ドライバの選択 — Docker-docs-ja ドキュメント~
http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html

***AUFS [#k0a4dfe7]

***Btrfs [#ic6fd28f]

***Device Mapper [#kd7d6b89]

***OverlayFS [#z132b1a1]

***ZFS [#y4af509e]

*エディション [#w6eba6bc]
**[[Dockerのネットワーク設定]] [#h8242c15]

**CE [#qa8ccb65]
-無償
-サポートが不要な環境で使用する。
*インストールと利用 [#tc00ae67]

**EE [#o8b0135f]
-有償
**インストール [#scdc282d]

-種類
***[[Windowsから>https://techinfoofmicrosofttech.osscons.jp/index.php?Docker%20for%20Windows#iec1969c]] [#ff72b53b]

--Basic
---サポート
---認証済コンテナ
---認証済みプラグイン
***[[Ubuntuから>VM起動後の開発環境のセットアップ(Linux)#d2b98d57]] [#sb89f322]

--Standard
---Basicに加え
---LDAP、AD統合機能
***CentOSから [#sa932048]

--Advanced
---Standardに加え
---セキュリティ機能
**利用 [#c4bc3de4]

*インストール [#scdc282d]
***[[Windowsから>https://techinfoofmicrosofttech.osscons.jp/index.php?Docker%20for%20Windows#ba35dceb]] [#i9200678]

**CentOS [#sa932048]
***[[Ubuntuから>#i9200678]] [#xbfee1d5]
Windowsと同じでOK。
-ただしCMDではないが。
-WSL2なら、シェルも同じ。

**Ubuntu [#sb89f322]
***CentOSから [#m2d151b3]

**[[Windowsから>https://techinfoofmicrosofttech.osscons.jp/index.php?Visual%20Studio%20Tools%20for%20Docker]] [#ff72b53b]
**Docker対応 [#lcd1e031]
[[ミドルウェア>#b8f4ba04]]と[[ユーザ・プログラム>#r5d096ca]]で違いそう。

*利用 [#c4bc3de4]
※ Dockerがべスプラをどっかに書いているかもしれんけど。

**CentOS [#m2d151b3]
***ミドルウェア [#b8f4ba04]
-Confファイルの存在するフォルダをマウント出来るようにする。
-Confファイルが存在しない場合は、既定値でConfファイルを生成するとか。
-Dockerでは、単一のファイルをマウントすることも出来る~
(SRCが存在しない場合、DESTはフォルダとなるので要注意)。

**Ubuntu [#xbfee1d5]
***ユーザ・プログラム [#r5d096ca]
-Confファイルはdocker buildする際に同梱させれば良い。
-ただ、Confファイル同梱の場合、コンフィグが難しいので、~
環境変数で上書きできるような仕組みを実装したりすると良さそう。

**[[Windowsから>https://techinfoofmicrosofttech.osscons.jp/index.php?Visual%20Studio%20Tools%20for%20Docker]] [#i9200678]

*参考 [#j992b74c]

**内部リンク [#ifb499fa]
***[[Dockerコマンド]] [#mf85798b]
***[[Dockerレジストリ]] [#w9cc8f93]
***[[Dockerコンポーズ]] [#b309c915]
***[[Kubernetes]] [#he4d169a]

**Docker Documentation [#nef96f68]
-Docker ドキュメント日本語化プロジェクト~
Docker-docs-ja 17.06.Beta ドキュメント~
http://docs.docker.jp/index.html

***Compose file [#y7bdd83a]
-Compose file version 3 reference~
https://docs.docker.com/compose/compose-file/
***Docker Engine [#v46d601a]
http://docs.docker.jp/engine/index.html

***Docker Compose [#w82f48eb]
http://docs.docker.jp/compose/index.html

***Docker Hub [#jd102253]
http://docs.docker.jp/docker-hub/overview.html

***Docker Machine [#xbbab101]
http://docs.docker.jp/machine/overview.html

***Docker Registry [#xaaa4de3]
http://docs.docker.jp/registry/toc.html

***Docker Swarm [#ccc18c74]
http://docs.docker.jp/swarm/index.html

**@IT [#w0642cbd]
-Tech Basics/Keyword:Docker~
http://www.atmarkit.co.jp/ait/articles/1407/14/news122.html

***いまさら聞けないDocker入門 [#t6eefae5]
http://www.atmarkit.co.jp/ait/series/1511/

-(1):アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識~
http://www.atmarkit.co.jp/ait/articles/1405/16/news032.html
-(2):ついに1.0がリリース! Dockerのインストールと主なコマンドの使い方~
http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html
-(3):Dockerfileとdocker buildコマンドでDockerイメージの作成~
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
-(終):Docker Hubの使い方とGitHubからのDockerイメージ自動ビルド~
http://www.atmarkit.co.jp/ait/articles/1408/26/news038.html

***超入門Docker [#md43f3b7]
http://www.atmarkit.co.jp/ait/series/5086/index.html

-第1回 Dockerとは~
http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html
-第2回 Dockerを使ってみる~
http://www.atmarkit.co.jp/ait/articles/1701/31/news043.html
-第3回 Dockerコマンドの使い方~
http://www.atmarkit.co.jp/ait/articles/1702/01/news061.html
-最終回 Windowsプログラムを実行するWindowsコンテナ~
http://www.atmarkit.co.jp/ait/articles/1702/02/news039.html

※ この記事は、Windows寄りになっている。

***山市良のうぃんどうず日記 [#i9be6f03]
-(31:特別編)所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門~
http://www.atmarkit.co.jp/ait/articles/1504/13/news020.html

**see the elephant [#xde9471a]
-dockerを触ってみる~
http://namu-r21.hatenablog.com/entry/2016/10/15/124009
-dockerが使うUnionFileSystemを僕なりに解釈した~
http://namu-r21.hatenablog.com/entry/2016/10/27/013006
-dockerのファイルシステムについて知る~
http://namu-r21.hatenablog.com/entry/2016/10/25/160147

**さくらのナレッジ [#s3864708]
-Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる~
https://knowledge.sakura.ad.jp/2210/

--DockerとDocker Hubの操作と概念~
https://www.slideshare.net/zembutsu/docker-container-image-command-introduction-2017-03

**Qiita [#se48f3bb]
-Dockerの日本語ドキュメント~
https://qiita.com/maemori/items/dd162002fbdd53d5582a

-Dockerを体系的に学べる公式チュートリアル和訳~
https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c

-Dockerコンテナとイメージを簡易的に理解する~
https://qiita.com/horikeso/items/b9456a529444ff1ed547

-なぜDockerではホストOSと違うOSベースのコンテナイメージが動くのか~
https://qiita.com/kirikunix/items/33414240b4cacee362da

***docker-compose コマンド [#feeada98]
-docker-compose コマンドまとめ~
https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f
-Docker Compose - docker-compose.yml リファレンス~
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

***コンテナ内で操作 [#p3013626]
-Dockerコンテナ内で操作 attachとexecの違い~
https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560
-Docker | docker コンテナの中で vim が使えない場合~
https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e

-ツール類のインストール
--apt-get~
「are you root?」となる場合は、先頭にsodoを付与。
 apt-get update
 apt-get install XXX
--yum
 yum install XXX

***Docker multi stage build [#gc400d8a]
-Docker multi stage buildで変わるDockerfileの常識~
https://qiita.com/minamijoyo/items/711704e85b45ff5d6405

**see the elephant [#xde9471a]
-dockerを触ってみる~
http://namu-r21.hatenablog.com/entry/2016/10/15/124009
-dockerが使うUnionFileSystemを僕なりに解釈した~
http://namu-r21.hatenablog.com/entry/2016/10/27/013006
-dockerのファイルシステムについて知る~
http://namu-r21.hatenablog.com/entry/2016/10/25/160147

**さくらのナレッジ [#s3864708]
-連載:Docker入門
--(第一回)~Dockerとは何か、何が良いのか~~
https://knowledge.sakura.ad.jp/13265/
--(第二回)~Dockerセットアップ、コンテナ起動~~
https://knowledge.sakura.ad.jp/13795/
--(第三回)~各種dockerコマンドとDockerイメージ作成について~~
https://knowledge.sakura.ad.jp/14427/
--(第四回)~Dockerfileについて~~
https://knowledge.sakura.ad.jp/15253/
--(第五回)~コンテナ間通信~~
https://knowledge.sakura.ad.jp/16082/
--(第六回)~Docker Compose~~
https://knowledge.sakura.ad.jp/16862/

-Dockerコンテナをクラウドサービス上で~
共有できる「Docker Hub」を使ってみる~
https://knowledge.sakura.ad.jp/2210/

--DockerとDocker Hubの操作と概念~
https://www.slideshare.net/zembutsu/docker-container-image-command-introduction-2017-03

-[[連載:Docker Compose入門>Dockerコンポーズ#bf428c8f]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS