第4回Docker実践編、ネットワークとファイルシステム

第4回 Docker解説 コラム
この連載コラムでは、仮想化技術のDockerとは?について、数回に分けてわかりやすくお伝えします。
今回は、実践編2回目として、実際のコマンドの動かし方を引き続き紹介します。
入門編は、次のような想定・目的で記述しています。
想定する読者 |
|
想定する読者の 知識レベル |
|
本連載を読んだ後に得られる期待値 |
|
目次
1. Dockerネットワーク
ネットワーク構成
Dockerのネットワークについては、公式サイトの「Networking overview」以下のページで説明されています。ここでは概要図を使って解説していきたいと思います。

これが標準で用意されるネットワークです。外枠がDockerホスト(「host」)で、下部の「eth0: 192.168.1.2」がDockerホストに付いているネットワークインターフェイスです。
「web」と「db」はDockerコンテナを表していて、それぞれがネットワークインターフェイスを持っています(「eth0: 172.17.0.2」、「eth0: 10.0.0.2」、「eth0: 10.0.0.254」)。ネットワークインターフェイスに対して仮想ネットワークインターフェイスが存在していて、デフォルトではdocker0というブリッジ(このDockerホストのブリッジドライバを使って用意されているもの)に接続されます。
ネットワークを分離したい場合のために、 接続するブリッジを選択できるようになっています。この図で言うと、「eth0: 10.0.0.2」と「eth0: 10.0.0.254」は「my_bridge」というブリッジに接続しています。
これだけではイメージをつかみにくいかと思うので、物理ネットワークの場合に置き換えてみましょう。

https://member.eureka-box.com/products/10/categories/2150049210/posts/2162335857
左上の「Host」が物理マシンです。この物理マシンがLANとつながるブリッジ「docker0」があります。サービスを提供する「web」や「db」といったサーバーは、「my_bridge」 を経由して「docker0」に接続されています。
つまり、Dockerネットワークというのは、このような接続をDockerの世界の中で実現する仕組みだというわけです。
Dockerネットワークの種類
Dockerでは、コンテナごとに目的に合わせてネットワークドライバを選択します。
dockerを起動すると、以下の3種類のネットワークが自動的に生成されます。
bridge
- デフォルトのネットワークドライバ
- ネットワークを指定しない場合、デフォルトで「bridge」という名称のブリッジ ネットワークに参加
- ブリッジ 毎に隔離されているため、仮想的に複数のネットワークを構築可能。通信が必要なコンテナ毎に bridgeブリッジ ネットワークを作成
- 参考:https://docs.docker.com/network/network-tutorial-standalone/
host
- Dockerホストのネットワークを使用。そのため、host ネットワークに参加するコンテナは全てネットワーク的に接続された状態になる
- コンテナはホストのネットワークを直接使用する 複雑なイントラネットで、コンテナから外部への接続が困難な場合に限定的に使用することがある
※限定的:docker build時に外部サイトからインストールするなど - 参考:https://docs.docker.com/network/host/
none
- ネットワークインターフェイスを使用しない場合に使用
Tips
実際に動かしてみたときに陥りがちなポイントを1つご紹介します。
docker0でデフォルトで起動するネットワークがあると説明しましたが、それがイントラネットで使用されているアドレスとぶつかることがあります。その場合、dockerを起動した瞬間に、特定のホストにつながらなくなるという現象が起きます。
具体的に言うと、このデフォルトのネットワークには「172.17.0.0/16」が割り当てられます。それと同じアドレスを持つホストがイントラネットに存在すると、問題が生じるわけです。
そういったときのために、デフォルトのネットワークアドレスを変更する設定ができます。
/etc/docker/daemon.jsonというファイルに、次のように記述します。
“default-address-pools”:[
{“base”:“192.168.0.0/16”,“size”:24}
]
}
ぶつからないアドレスを探してここに指定すると、docker0のネットワークアドレスを変えることができます。
Eureka Boxは厚生労働省が実施している助成金、人材開発支援助成金の適用対象となります。
2. Dockerのファイルシステム
Dockerコンテナは環境の隔離を目的としているため、ストレージは、基本的に、コンテナ内に閉じられています。通常は、必要なファイルを内包した状態でコンテナイメージを作成し、それをもとにコンテナを実行します。そのコンテナ内のストレージは、コンテナの消去時に失われます。
ただし、コンテナの生存期間を超えてストレージの内容を保存したい場合には、何らかの手段で取り出す必要があります。たとえば、CIのビルド生成物やログ、あるいは開発段階のプログラムが、コンテナと一緒に消えてしまうと困ることがあるでしょう。
そういった、コンテナと分離されたファイルシステムが必要な場合のために、Dockerボリュームが用意されています。

全体がDockerホスト(「Host」)で、その上でコンテナ(「Container」)が実行されています。「Filesystem」はホスト上のファイルシステムで、そこにDocker専用のエリア(「Docker area」)が設けられています。これにアクセスするのに、ボリュームおよびバインドマウントという方法を利用します。
ボリューム(「volume」)
Docker専用のエリア「Docker area」をマウントします。コンテナ間で入出力情報をやり取りする目的で使われることが多く、コンテナ間でディレクトリツリーを共有することが可能です。
バインドマウント(「bind mount」)
Dockerホストのファイルシステムに対してマウントを行います。NFSマウントをイメージするとわかりやすいでしょう。ホストから見える同じファイルが、コンテナからも見えることになり、たとえばホスト上でファイルを変更すると、それがコンテナにも即座に反映されます。そのため、ホスト側でプログラムを編集し、コンテナでそれを実行する、といった場合には、このバインドマウントが使われます。
仮想化技術Dockerでの開発に求められる技術を知るには
Dockerの技術を実際に学んでみたいという方に、まずは無料でお試しいただけるオンライン学習プラットフォームを準備しています。
業務が多忙なエンジニアでも、スキマ時間で効率的に実践的な学習が出来るEureka Boxは、エンジニアの現場の声から生まれたツールです。
エンジニアの独学・スキルアップに! 他では学べない技術が充実
上流工程ソフトウェア開発技術を学ぶ!
Eureka Box(ユーリカボックス)
Dockerを正しく理解した上で、最大限の効果を得られるようスキルアップしたい方にもEureka Boxでの学習はお勧めで、無料会員登録だけでも以下の特典が受けられます。
- 各連載コラムの全容、未公開コラムも一気にまとめて読める(一部動画解説付!)
- USDM(要求記述)、MBD(モデルベース開発)、システムズエンジニアリング、AWS Greengrass(新世代エッジエンジニアのための技術講座)など、ソフトウェア開発に関わる知識がギュッと凝縮、困った時のお助けアイテムとしても長期で活用出来る
- ソフトウェア開発に関わる無料お試しコンテンツも充実

執筆者プロフィール
株式会社エクスモーション シニアエキスパート
専門分野:
DevOps(CI/CD)、クラウドコンピューティング、Quick Hack(Quick Fix), Agile、ロボティクス、ネットワーク、防衛システム
トップ企業をサポートしてきた技術と知見を1冊に「ソリューションガイドブック」
私達エクスモーションが行った、日本を代表する企業へのコンサルティングやトレーニングとは?
オンライン学習 Eureka Box誕生のベースとなった技術や知見が満載!
実際に支援を行ったお客様からのメッセージも掲載し、読み応えある1冊に仕上げています。