2019年05月 一覧

Docker挫折したマンを助けたい(実践編)

kujira_zasyou

どうも、エンジニアのミヤマです。
前回は、Dockerとはどんなものか、をざっくり紹介しました。

https://blog.anysense.co.jp/app/program/post-934/

今回は、実際に手を動かしてDockerをなんとなくでも理解してもらえると。。。
というわけで、やっていきます。

準備するもの(前提)

Dockerを準備しておいてください。

それぞれ確認として、バージョンを確認したり、コンテナを確認したりしておきます。

今回、ぼくの環境(OS)はmacです。
macであれば、docker for macというのがあるので、簡単にインストールすることができますよ。

さっそく、コンテナを実行してみる

では、さっそくコンテナを実行してみようと思います。

前回のブログで説明したように、Dokcerはイメージをコンテナで実行します。

なのでまずは、ubuntuのイメージをとりあえずもってきます(プルしてきます)。
このイメージは、docker hubというところからもってきますが、コマンドがよしなにやってくれます。

次にプルしてきたイメージをコンテナで実行します。

そうするとubuntuのイメージが実行されているコンテナの中に入ることができます。
コンテナの中でubuntuが実行されていることを確認するために、以下のようなコマンドを打ってみてもいいかもしれません。

コンテナからは、control+P,Qで抜けることができます。

コンテナが実行されているか、確認する

そして、コンテナがされているのは、このコマンドで確認できます。

コンテナに名前をつけて、実行する

docker ps すると、コンテナの名前がテキトーにつけられているのがわかります。
これを自分でつけることもできます。まー、したいひとはどうぞ、って感じです。

次のコマンドで、コンテナに名前をつけて実行できます。

コンテナの中の変更は、削除されてしまう

コンテナは一度削除されると、そのコンテナの中の変更も削除されます。
それを見るために、ちょっとここで実験です。

コンテナの中で適当なファイルを作って、コンテナを削除してみます。

そして、コンテナを削除します。

ここから、またコンテナを作成すると、コンテナの中にはさっきの変更は保存されていないことがわかります。

でも、開発においてこれって困りますよね。
それをどう解決するかを次に紹介します。

コンテナにフォルダをマウントする

コンテナの中の変更は、コンテナの削除のタイミングで削除されてしまいます。
コンテナを使った開発においては、変更されるフォルダは別でコンテナの起動とは別にマウントする、という方法をとります。
こうやって、コンテナの外からマウントします。

コンテナには、ディレクトリを好きなところにマウントすることができます。(ボリュームマウントといいます。)

-vオプションをつけるとマウントすることができます。
このコマンドは、ローカルのフォルダをコンテナの中のディレクトリにマウントするというものです。

では、やってみます。

これで確かに、フォルダがコンテナにマウントできることを確認できました。

ついでに、マウントしたフォルダの中の適当なファイルを編集してみます。
そうすると、コンテナの中のフォルダとマウントしたフォルダはも同期されているはずです。

Dockerfileを作る

「ぼくは、私はubuntuの中でphpを動かしたい」っていう人、コンテナの中でこれをしたい、っていうのがあると思います。
でも、そういうイメージがdocker hubにない、ってことがあると思います。

そういうときは、Dockerfileを使います。

Dockerfileを使うことで、オリジナルのDockerのイメージを作ることができます。

まずは、Dockerfileを作る

ではでは、さっそくDockerfileを作ってみます。
まずは、適当にディレクトリを作って、その中にDockerfileという名前のファイルをつくります。
んで、今回はテキトーにphpでも入れてみます。

そして、そのDockerfileの内容はこのようにしておきます。

これの内容としては、ubuntu:18:04のイメージをインストールして、その中にphpをインストールしています。

では、このDockerfileをもとにオリジナルのイメージを作ります。
(今回はおまけで、そのできるイメージに名前をつけておきます。)

コマンドはこんな感じです。

イメージができたことを確認

以下のコマンドで、イメージができたことを確認します。

これでできてますね。では、このイメージをつかってコンテナを実行してみます。

まとめ

今回でなんとなくdockerがどんなもので、どうやって使えるのかイメージできたんじゃないでしょうか?
次回は、もうちょっとdockerを簡単にしてくれるツール、docker-composeを説明してみようとおもいます。
ではでは、今回はこのへんで。


Docker挫折したマンを助けたい

kujira_zasyou

どうも、エンジニアのミヤマです。

最近、コンテナやDockerといったワードをよく聞くようになってきました。
しかし一方で、さわってみて挫折した人も少なくないのかなと思います。

そんなDockerで挫折した人をもう一度立ち直らせるべく、今回はDockerを導入するにあたって気をつけること、意識すること、さらに、実際に導入するというところまでやっていきます。

このブログでは、アーキテクチャ的な用語はできるだけ使わずに説明します。

まず「イメージ」と「コンテナ」を理解する

docker_arch1

Dockerを始めると一番最初に理解するべきは、「イメージ」と「コンテナ」という概念です。

「イメージ」を作る

まずは、「イメージ」についてです。

ところで、osをインストールしたことはありますか?

WindowsならインストールのCD-ROMを入れて、インストールすると思います。
そのCDの中には、OSの「イメージ」が入っています。
このとき「イメージ」は、まっさらな、初期状態のOSが入っています。

データは持っていません。

dockerは、この「イメージ」という単位で管理されます。
dockerにおける「イメージ」は、そういうOSのCD-ROMを想像すると「イメージ」の理解がしやすいかもしれません。

「コンテナ」で実行する

Dockerは、イメージを「コンテナ」で実行します。
これは、イメージを実行するための仮想マシンみたいなもの、という理解でいいです。

ここで頭の片隅に残してほしいのは、コンテナは一つのプロセスとネットーワークをつくる、ということです。

Dockerってこんな感じ

docker_arch2

Dockerは、プロセス、ネットワークを仮想化する

Dockerでは、ひとつのコンテナに一つのイメージを実行します。

このイメージの正体は、ひとつのプロセスです。

例えば、それはphpのイメージやapacheのイメージ、rubyのイメージ、mysqlのイメージを以って、コンテナで実行することで、
その中には、それらに応じたプロセスが実行されます。

ここで大事なことは、ひとつのDockerのコンテナの中には、一つのプロセスが実行される、ということです。

Dockerでネットワークをつくる

Dockerでは、コンテナはコンテナ同士をつなぐネットワークを作ることができます。

例えば、phpを実行するコンテナとmysqlを実行するコンテナをネットワークをつないで、ひとつのシステムを構成することができます。

なぜDockerか?

ここまでDockerってこんな感じのモノ、を示してきました。でも、なぜDockerを使う必要があるんでしょうか?ここでDockerのメリット、デメリットを考えてみます。

Dockerのメリット

  • 管理がラク

一つのサーバで、複数のサービスを運用すると、結構面倒です。サーバを増やそうとすると、そのたびに初期設定をして。。。ということをするんですが、Dockerはそれをまるっと一つの「イメージ」(詳しくは後で)として管理することができます。
一方でDockerならコマンド一つでサービス(プロセス)、一つのサーバの中にあたかも仮想マシン的な感じで、実行することができます。
でも、Dockerはそれを一つのイメージとして管理します。
また、これはインフラリソースの柔軟性ともいえます。

Dockerのデメリット

  • 学習コスト

Dockerは「コンテナ」です。
「コンテナ」であり、「仮想マシン」とは似て非なるもの。

今までのVirtualBoxなどの仮想マシンアプリを使ってきた人にはとっつきにくいと思います。
dockerを始めるときは、そういった先入観を捨てないといけないように思います。

これになれるまでに時間がかかります。まー、慣れです。

  • 脆弱性

これは、Dockerの開発が進んでいるが故にしかたがありません。
IT技術において脆弱性はどんなものにもありますし。
今後も何かしらのセキュリティホールは見つかると思います。


次回は実際に、dockerのコンテナを実行したりしてみようとおもいます。今回はこんなところで。