こんにちは。最近Docker勉強中のmacco(まっこ)です。
さて今回は、コンテナ型仮想化ツールであるDockerのコンテナを試しに動かしてみたいと思います。
対象の読者は以下を想定しています。
- Linux環境にDockerをインストールしている、動作確認済みである
- コンテナ型仮想化ツールと今までの仮想化ツールとの違いが分からない
この記事を読めば、従来の仮想化ツールとDockerの違い、Dockerのコンテナはどのような仕組みで動いているのかを理解することができます。
※本記事はDockerが動作する環境構築まで済んでいる人向けになります。
VirtualBox、Docker導入~動作確認までを知りたい人は、以下の記事をご参照ください。
Dockerの実行環境
ホストOS:Windows 10 Home edithion
仮想化ツール:VirtualBox 6.1.10
ゲストOS:CentOS 7
仮想化ツール:Docker CE 19.03.12
図で示すと以下のとおりです。
Dockerのコンテナとは
Dockerのコンテナとは、実行環境を個別に切り出して、リソース空間やアプリケーションをまとめた入れ物(コンテナ)のことを指します。
大まかな特徴は以下のとおりです。
- コンテナごとにファイルシステム、ネットワークインターフェース、名前空間などが独立している
- 通常は1つのOSに1つのリソース空間があるが、Dockerの場合は1つのOSに対して複数のリソース空間を持つことができる(1つのOSに対して複数のコンテナが動作する)
また従来の仮想化ツールとDockerとの違いが分かるように、簡単な図を載せておきます。
Dockerのイメージからコンテナをつくる流れを説明
Dockerのコンテナをつくるためには、Dockerのイメージが必要になります。
Dockerのイメージとは、OSやアプリを含むテンプレートになります。
DockerHubは、ベースとなるイメージを公式リポジトリとして提供しているレジストリになります。
分かりにくいので少しでも雰囲気を掴めるように、以下の図をご参照ください。
Dockerイメージの取得からコンテナが動作するまでの流れは、以下のとおりです。
①Dockerクライアントからコマンドを実行して、API経由でDocker Engineに指示をだします。
②Docker Engineがインターネット経由で、DockerHubからイメージを入手します。
③そのイメージを基にDockerコンテナを生成し、起動します。
実際にDockerイメージを取得する
では実際にDockerイメージを取得してみましょう。
VirtualBoxを起動し、仮想マシンであるCentOS 7にSSH接続します。
インストール済みのイメージを確認します。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB
試しに今回はApacheのイメージを取得してみます。
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
bf5952930446: Pull complete
3d3fecf6569b: Pull complete
b5fc3125d912: Pull complete
679d69c01e90: Pull complete
76291586768e: Pull complete
Digest: sha256:3cbdff4bc16681541885ccf1524a532afa28d2a6578ab7c2d5154a7abc182379
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:lates
Apacheのイメージが取得されているか確認してみます。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest a6ea92c35c43 4 days ago 166MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
httpd(Apache)が追加されていることを確認できました。
Dockerコンテナを動かしてみる
以下のコマンドでApacheイメージ(httpd)のコンテナを起動してみます。
[root@localhost ~]# docker run -d -p 8080:80 httpd
b5d1e81b43960e846f06ee35d19e733666c7c512e73fe8337e7123243aa9483a
-d オプションはデタッチモードといい、コンテナ内に入らず、バックグラウンドで実行するオプションになります。
-p オプションは「ホスト側のポート番号:コンテナ側のポート番号」を指定することで、ポートフォワードの設定ができます。
この場合8080番ポートでホスト側からアクセスした場合、80番ポートにポートフォワーディングすることになります。
最後のhttpdは、動作させたいコンテナのREPOSITORYを指定しています。
コマンド実行後に表示されるIDはコンテナIDといいます。
「b5d1e81b43960e846f06ee35d19e733666c7c512e73fe8337e7123243aa9483a」
無事にhttpd(Apache)が起動されたら、実際にブラウザでアクセスしてみましょう。
http://SSHで接続するIPアドレス:8080
ブラウザに「It works!」が表示されたら、httpdコンテナにアクセスできています。
VirtualBoxのネットワーク設定を見直す
※すでに設定済みであれば読み飛ばしてください。
ブラウザからhttpアクセスできない場合、考えられる原因の1つとして、VirtualBoxのネットワーク設定が未設定の可能性がありますので、以下の設定を試してみてください。
いくつか設定方法がありますが、今回は「NAT+ポートフォワーディング」を設定して、ブラウザからアクセスできるようにします。
まずVirtualBoxの設定画面を開きます。
※仮想マシンは停止してから設定してください。
「ネットワーク」を選択して、「アダプター1」をクリックします。
「高度」のなかにある「ポートフォワーディング」をクリックします。
右上のアイコンからポートフォワーディングルールを追加します。
名前:HTTP
プロトコル:TCP
ホストポート:8080
ゲストポート:8080
「OK」をクリックします。
以上で設定完了になります。
あとは仮想マシンを起動してSSHアクセスし、Dockerのコンテナを動作させて、ブラウザでアクセスしてみてください。
最後に
今回は、コンテナ型仮想化ツールDockerと従来の仮想化ツールとの違いや、実際にイメージを取得してコンテナを動作するところまで解説しましたが、いかがでしたでしょうか。
本記事は、とりあえず動かして確認してみることを優先した内容になります。
他にもDockerfileを使って自分でイメージを用意したり、Dockerイメージのレイヤー管理など、Dockerは奥が深いです。
インターネット上にも有益な記事が結構ありますので、気になった方は各自調べてみるとより理解が深まるかと思います。
私も引き続き勉強していきます。
最後までお読みいただきありがとうございました。