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のコンテナを実行したりしてみようとおもいます。今回はこんなところで。


ブログ、再開です。

IMG_3534

どうも、エニセンスでエンジニアをしています。ミヤマです。
ながらくこのブログも更新されずにいたようです。
最近入ったぼくに関して言えば、存在すらも知りませんでした。
技術的なことはもちろん、マネジメントやエニセンスの社内のことを発信していければ、と思います。

ということで、今回はブログ再開するにあたって、今のエニセンスの技術的な部分どうなの?を紹介します。させてください。

プログラミング言語/フレームワーク

プログラミング言語、フレームワークに関して言えば、こんな感じです。

  • Rails
  • FuelPHP
  • Laravel

主にはwebアプリでは、Railsを主に使っています。やっぱり簡単にwebアプリ作れるのは、goodです。
ぼくが関わっているプロジェクトで言えば、FuelPHP(API)+Nuxtを使ってシステムを作っています。

(にしても、FuelPHPという変わり者、この子はどうしたものか。笑)

スマートフォンアプリにおいては、swift/Kotlinを使っています。ここは選択の余地はないんですが。。。笑
あとは、スマートフォンアプリにおいて言えば、たまにcordovaという変わり者がいたりします。
最近は、ReactNativeとかFlutterとかがイケてるやつなんだろーなー、と、思っています。

インフラ

httpサーバの設定であれば、おそらく全部Apacheを使っています。
nginxのシェアが。。。みたいな話はありますが、ぼくは、「ま、道具だし、手段だし」と納得しています。
開発環境としてはこんな感じです。↓
– docker
– ECS
– ECR

最近は、dockerを使ったproductionでの運用に踏み切ろうかな、とおもっています。
そうしたら、つぎはk8sを。。。とかもね。

というわけで

技術的な部分で思いつくものをパッと書いてみましたが、いわゆる「イケてる」技術は、それなりに追えているのかなー、と個人的には思っています。
とはいえ、** 技術は技術で、手段でしかない** ので、そのときにベストな解を選べるようにしていきたいですね。
では、今回はこんなところで。これからのブログをよろしくお願いします。


AndroidStudioでUnitTestを行う

androidunittest_08_2

こんにちは。初めましての方は初めまして、そうでない方は初めません。エニセンスのAndroidエンジニアの水野です。
今回と次回の2回に渡ってテストの自動化についてお話致します。

Androidアプリのエンジニアの皆様は、普段テストをどのように行っているのでしょうか?
おそらく殆どの方は実機やエミュレータで手動でテストを行っていると思います。

今回はそんな面倒なテストを先日行われたGoogleI/OのCodeLabの記事に添って自動化にチャレンジしてみたいと思います。

続きを読む


アプリ内に広告を設置しよう!そして気になるその効果は?

スクリーンショット 2015-06-13 22.09.16

こんにちは。エニセンスでアプリのプロデューサー&エンジニアを担当しているNoujimaです。
今回はアプリ内の広告についてお話しさせてください。

ちょうどアプリ内広告を入れて10日間ほどのアプリがありますのでそれの内容とちょっとした効果をご紹介していきますね。 続きを読む


1 2 3 4