私は環境構築大嫌いですw最近では"Docker"なるものがあって、何やら環境周りを簡単にできる模様です。今どきのソフトウェア開発の現場では、もはやDockerを使えないとプログラマとしてやっていけない雰囲気がある(ほんとか??)ので、今回はDockerについて勉強してみました。参考にしたのはこちら。感想DockerとはDockerのアーキテクチャ以下にホストOS型仮想化とコンテナ型仮想化の比較の図を示します。コンテナ型にはゲストOSがいないんです。昔ながらの仮想化技術では、仮想化基盤の上にゲストOS用の領域を確保してその上にOSを乗せて環境を構築していました。Engineが仮想化ソフトウェアとゲストOSの二役をこなすため、段の数が減っています。物理マシンに乗っかるソフトウェアが少なければ少ないほど冗長な動作は減少し、より軽量に使用することが可能になります。この本ではDockerを使用するメリットとして以下の四点が挙げられています。Infrastructure(不変なインフラ)という考え方が提唱されており、いつ何度実行しても同じ結果が保証される冪等性を保つことが望ましいとされています。Dockerでは、ある地点でのサーバーの状態を保存し複製可能にすることで、正しくセットアップされたサーバーを常に使用できるようになるメリットがあります。同じアプリケーションでも、デプロイ先のサーバーが違えば当然挙動も違います。Code(インフラの構成管理)という考え方が提唱されています。Dockerを使用すればインフラをDockerfileとしてコードベースで定義でき、手作業が介在する余地を減るため、サーバーの意図しない挙動を回避することに役立ちます。実行環境とアプリケーションの一体化によるポータビリティ性の向上また、Dockerでのデプロイの考え方も非常に重要です。従来では、開発環境で開発したアプリケーションをどこかのサーバーにデプロイしていたため、インフラの再現とアプリケーションのデプロイは切り離されて考えられていました。Dockerは、OSとアプリケーションを同梱した箱のようなもので、インフラとアプリケーションをセットでデプロイすることができます。これにより、作業環境の差異が生まれづらくなり、アプリケーションのポータビリティが高くなるメリットがあります。システムを構成するアプリケーションやミドルウェアの構成管理の容易さ複数のアプリケーションを組み合わせた大規模なシステムを構築するためには、実行するアプリケーションだけでなくそれらで使用されるミドルウェアを適切に管理する必要があります。Dockerでこのようなシステムを実現するためには、複数のコンテナのアプリケーション間でノードをまたいで管理するオーケストレーションと呼ばれる機能が提供されています。これにより、運用がこれまでより手軽になります。Containerが動くまでの大まかな流れを以下に示します。Dockerで環境を構築する際の大まかな流れは大まかにこんな感じです。Imageを手に入れます。Hubからダウンロードすることで入手可能です。Containerにします。Containerが料理といったところでしょうか。このような流れでDocker環境を構築していきます。※細かいコマンドやら、サンプルコードは本買って読んでください。DockerfileDockerfileはDocker独自のDSL(ドメイン固有言語)で記述します。このDSLでは様々なインストラクションが提供され、これらを組み合わせることでインフラ構成を定義します。主要なインストラクションを下に示していきます。FROMDockerイメージのベースとなるイメージを指定します。FROMは1つのDockerイメージを作る際に1つしか使えません。RUNDockerイメージのビルド時にDockerコンテナ内で実行するコマンドを定義します。COPYDockerを動作させているホストマシン場のファイル・ディレクトリをDockerコンテナ内にコピーします。CMDDockerコンテナとして実行する際に、コンテナ内で実行するプロセスを設定します。CMDもFROM同様、1つのDockerイメージを作る際に1つしか使えません。LABELイメージの作者名などに使用するようです。ENVDockerコンテナ内で使用できる環境変数を指定します。ARGビルド時に情報を埋め込むために使用します。イメージビルドのときだけ使用できる環境変数。Dockerfileの書き方ものすごくシンプルに書くとこんな感じでしょうか。FROM句でベースとなるDockerイメージを取得します。hub(Dockerイメージを提供しているサービス、Githubのようなもの)からイメージを取得します。その後、3000番ポートを開放して、appディレクトリを作って、Dockerの中にmain.jsファイルを取り込んでいます。起動すると、main.jsが実行されます。DockerイメージDockerfileをビルドするとDockerイメージが作成されます。こんなコマンドでビルドができるらしいっす。Dockerfile配置のディレクトリパス出来上がったDockerイメージを確認するときはこちらのコマンド。lsこんな感じに出てくればOKです。コンテナDockerイメージはあくまで、Dockerコンテナを作るための設計図のようなものなので、ここからコンテナを作る必要があります。onlyなDockerイメージの上に書き込み可能なレイヤを生成するようです。[コマンド引数]必要なくなったコンテナはこちらのコマンドで停止できます。stop領域がもったいないときは、こちらのコマンドでコンテナを削除します。試しに使ってみるこういうのは実際に使ってみないといいとこも悪いとこもわからないので、実際に作ってみます。こんな感じの環境を作ってみます。8MySQLいやいや、何の環境だよ、、、ってツッコミは置いておいて、とりあえず作ってみます。サンプルを引っ張ってくるまずは、UbuntuのDockerイメージを取得してみます。ubuntu:18.04DockerImageDockerImageを確認してみます。84.1MBDockerContainer動かしてみるとこんな感じでした。ubuntu:18.04root@647d913a5cbc:/#オプションについて、"-i"オプションはroot権限で仮想環境のターミナルに入れました。コンテナ内にいろいろインストールコンテナ内でインストール作業をしてもいいんですが、dockerからexitするとすべて消えてしまうので、Dockerfileを適当に書きます。これでなんとなく行けそうです。Dockerを起動して確認してみます。wrapperおー、できてるっぽいですね。コンテナんの停止コンテナのターミナルに入っているときは、exitコンテナを停止できます。NAMES何もいません。停止中のコンテナも含めて表示すると、コンテナIDを確認することができます。id>で接続できます。感想とりあえず、なんとかDockerが使えるようになったと思います。実際には、Dockerイメージのデータサイズを小さくすることを考えたり、複数コンテナを起動してオーケストレーションしたりするらしいので、まだまだ奥が深いです。オーケストレーションに関してもKubernetesとかもこの本には載っていたのですが、それはまた今度、なにかの機会に勉強して書こうかと思います。エンジニアに送る、"心構え"と"キャリア観"たまにすごい人の講演を聞いているんですが、こちらの公演の話...2018-08-11【自由研究:仮想通貨】他人のRippleの残高を眺めてみる前回はとりあえずRippleのデータを眺めてみました。nogawanoga...2018-07-29【自由研究:仮想通貨】Rippleのデータを眺めてみる世間的には夏休みなので、ちょっと自由研究してみます。以前こんなのを読んでいました。(1)ほしい物リスト買ってあげると中の人が喜びますはてなブログをはじめよう!nogawanogawaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。