現在作成しているアプリケーションの開発環境にDockerを導入したものの、いまいち理解が進んでないと感じたので、備忘録も兼ねてこの記事を書きます。
また、具体的な使い方の部分は箇条書きではなく普通に書いています。
Dockerとは?
- Docker incによって開発されている
コンテナ型仮想環境
を開発・配置・実行するためのオープンソースプラットフォーム- 異なるPCやサーバーであっても、簡単に同じ仮想環境を作成できる
- Go言語で書かれている
ワンポイント解説
元々はホスト型仮想化(VMWare、Virtual Boxなど)
が主流だったそうですが、現在はコンテナ型仮想化
が主流です。
引用:docker
上記画像はコンテナ型仮想化の簡易的な図です。インフラとホストOSの部分はホスト型仮想化と同じなのですが、違いはその上です。Dockerを用いたコンテナ型仮想化の場合、ホストOSの上層はdockerエンジン(図ではDockerと書いてある)と言うものがあります。このdockerエンジンはアプリケーションをコンテナ化(containerization)する役割があり、ユーザーがコマンドを打つとこのdockerエンジンが動きます。dockerエンジンの上部にあるのがコンテナ化されたアプリやライブラリです。
どんな場面で利用される?
- アプリケーションの
開発環境
- アプリケーションの
検証、本番環境
- Webサーバーやdbサーバーなどの構築
- その他、プログラミング言語の実行環境など
Dockerを使うメリット
- 手軽に環境を共有できるので、パッケージやPCの違いによるバグやトラブルが起こりにくい
Dockerfile
、docker-compose.yml
ファイルを使うことで、インフラをコード化でき、いちいちコマンドを打つ手間が省ける(Infrastructure as Code思想)- 仮想環境のコンテナ上にパッケージなどをインストールでき、PCに直接インストールせずに済む
短時間で環境構築ができる
ので、無駄な時間が使わずに済む- Docker hubからimageをダウンロードすることですぐに環境構築できる
ワンポイント解説
Docker imageはDockerコンテナを実行するのに必要な情報(パッケージなど)の集合です。(この記事がわかりやすかったです)
Docker hubには自分の実行したい言語に合わせて様々な種類やバージョンのdocker imageが提供されています。後でも説明しますが、$docker run
コマンドでコンテナを走らせることができます。
実際に使ってみる
では、実際に使ってみましょう。
$docker run hello-world
コマンドの意味は以下の通りです。
コマンド | 意味 |
---|---|
docker | dockerコマンド |
run | サブコマンド。docker imageからコンテナを生成する |
hello-world | imageの指定をする。※タグを付けなかった場合は自動的にlatestタグが付与される |
ちなみにrunコマンド
はpull、create、start
を合体させた様なもの。
それぞれのコマンドの役割は以下の通りです。
コマンド | 意味 |
---|---|
pull | imageを取得する |
create | コンテナの生成を行う |
start | コンテナを起動する |
これら以外にもなまざまなコマンドがあります。
Dockerfileについて
上記の$ docker run
をした時点ではdocker hubにあったイメージからコンテナを起動しているだけなので、自分の環境をこれから作っていく必要があります。しかし、自分の環境を作っていく際に、何回もコマンドを打たなければならず、時間がかかる上にミスも起こる可能性があります。
そこで登場するのがDockerfile
です。
これは、自分の環境を起動するための情報を持ったimageを作成するためのコマンドや情報が記述されたファイルです。
詳しく解説すると、、上記のDockerとは?
のところで出てきた画像の、App AやApp B、App Cなどがコンテナです。
それらのコンテナを動かしたり生成したりするための情報の集合がdocker imageです。
そして、そのdocker imageを作る(build)ためのファイルがDockerfile
になります。
流れとしては、
Dockerfileの命令→→→build→→→imageが完成する→→→run→→→コンテナが起動する
この様な感じです。
Dockerfileのコマンドは環境によって全然違うので、各々が必要なコマンドを記載してください。
と言っても具体例が欲しいと思うので、僕の具体例を紹介します。
環境
- react 16.13.1
- node v12.19.0
- npm 6.14.8
- macOS
# DockerfileFROM node:15.3.0-alpine3.10WORKDIR /usr/src/app
FROMは取得したいベースイメージ(Docker hubにあるやつ)の選択をします。
WORKDIRは、(今回は記載していませんが)RUNやCMD、ENTRYPOINTなどを記述する際に実行したいディレクトリを選択します。
$docker build -t<イメージ名>
build
コマンドでDocker imageをbuildできます。-t
をつけることで、<イメージ名>の部分に任意の名前をつけることができます。
これでimageのbuildが完了したので、あとはコンテナを実行するだけです!!
$docker run <イメージ名>
1回目は少し時間がかかるかもしれませんが、2改名行はキャッシュを保持したままなので、実行が早くなるはずです。
最後に
今回はdockerの入門部分について解説してきました。
実際は、Dockerfileもコマンドももっともっとたくさん種類があります。機会があったら、少し踏み込んだ内容の記事も書こうと思います。