【初心者】Dockerの使い方(Node.jsの開発環境構築)
はじめに
この記事は最も軽量なNode.jsのDockerfileを使い、Node.jsの開発環境を構築します。
Dockerとは
Dockerとは軽量で高速に動作するコンテナ型仮想環境用のプラットフォームです。
Dockerを使用するにはDockerコンテナを作成する必要があります。
DockerコンテナはDockerデーモンと呼ばれるプログラムがDockerfileからDockerイメージを作り、DockerイメージからDockerコンテナを作成します。
Dockerの仕組み
DockerはGo言語で書かれています。Dockerを詳しく理解するには3つの技術を知る必要があります。
- 名前空間(namespace)
- コントロール・グループ(Control groups)
- ユニオン・ファイル・システム
設定
名前空間(namespaces)
Docker は名前空間(ネームスペース)と呼ばれる技術を利用し、コンテナ (container) と呼ぶワークスペース(作業空間)の分離をもたらします。Docker はコンテナ毎に 名前空間 の集まりを作成します。
Docker が使う Linux 上の名前空間は、次の通りです。
pid 名前区間 :プロセスの分離に使います(PID:プロセス ID)
net 名前区間 :ネットワーク・インターフェースの管理に使います(NET:ネットワーキング)
ipc 名前区間 :IPC リソースに対するアクセス管理に使います(IPC:InterProcessCommunication、内部プロセスの通信)
mnt 名前区間 :マウント・ポイントの管理に使います(MNT:マウント)
uts 名前区間 :カーネルとバージョン認識の隔離に使います(UTS:Unix Timesharing System、Unix タイムシェアリング・システム)
コントロール・グループ (Control groups)
アプリケーション実行の鍵となるのは、自身が必要なリソースのみを分離することです。
これがあるので、ホスト上で複数の利用者がいても、コンテナを使えるようにします。また、コントロール・グループにより、Docker はコンテナに対して利用可能なハードウェア・リソースを共有し、必要があればコンテナが必要なリソース上限を設定できます。
ユニオン・ファイル・システム
Docker はコンテナ毎にブロックを構築するためにユニオン・ファイル・システムを使います。
Docker は AUFS、btrfs、vfs、DeviceMapper を含む複数のユニオン・ファイル・システムの派生を利用できます。
詳しく知る必要はないですが、このような技術が使われていることを頭の隅に置いておくとエラーが表示された際にエラーを理解しやすくなると思います。
Dockerについて、多少理解ができたと思うので実際にDockerコンテナを作成するまでの流れを説明します。
step1 docker-compose.ymlの作成
step2 Dockerコンテナの起動
step3 Dockerfileも使用する場合
docker-compose.ymlを作成する
まず、作業ディレクトリを作成します。
今回はnode.jsの環境を構築するため作業ディレクトリをdocker-nodeとします。
# docker-nodeという作業ディレクトリを作成
$ mkdir docker-node
# 作成したディレクトリへ移動
$ cd docker-node
docker-compose.ymlとはdockerコンテナの作成方法、初期処理、設定などを記した設計図のようなものです。
Docker-Composeでは、アプリケーションを動かすための各要素をServiceと呼びます。
このServiceの書き方について説明します。
今回はViエディターで作成します。Viの使い方は独特です。
# docker-compose.ymlの作成
$ vi docker-compose.yml
以下の内容を記述します。
version: "3" # Composeファイルのバージョン
services: # serviceはこの中に記述します。
app: # Service名
image: node:alpine # Dockerイメージを指定します。
container_name: node # Dockerコンテナ名
working_dir: /usr/src/app # 作業ディレクトリの指定
volumes:
- type: bind # マウントタイプ
source: ./app # マウント先
target: /usr/src/app # マウントされるコンテナのパス
tty: true # コンテナを起動させ続ける。
Dockerコンテナの起動
Dockerイメージの作成
コンテナの作成
コンテナの起動
という流れでコンテナは起動します。
下記のDocker Composeのコマンドをご覧ください。
イメージ構築 | コンテナ構築 | コンテナ起動 | |
---|---|---|---|
build | 〇 | ✕ | ✕ |
up | △ | 〇 | 〇 |
start | ✕ | ✕ | 〇 |
run | 〇 | 〇 | 〇 |
今回はいっきに起動まで行います。バックグランドで行います。
$ docker compose up -d
下記コマンドでコンテナの確認を行います
$ docker ps -a
STATUSがUpになっていれば起動しています。Exitedになっている場合は停止中です。
NAMESがnodeになっていることも確認してください。
NAMESにはdocker-compose.ymlでcontainer_nameに指定した名前が入ります。
docker compose upコマンドを行っても停止中の場合、下記コマンドでログを確認してください。
$ docker compose logs -f
下記コマンドでイメージの確認を行います。
$ docker images
docker-compose.ymlでimageに指定した名前が表示されていることを確認してください。
起動しているコンテナのプロセスを確認します。
$ docker top <Container ID> -aux
COMMANDに書かれているコマンドを確認してください。
実行中のコンテナの中に入ります。
$ docker compose exec app node
# 出力結果
Welcome to Node.js v****
と表示されたら成功です。
node.js以前のシェルを起動したい場合は、bashに書き換えてください。
Dockerfileも使用する場合
Dockerfileも使用する書き方も紹介します。
「docker-node」フォルダの中にDockerfileを作成します。
# Dockerfileの作成
$ vi Dockerfile
以下の内容を記述します。
# ベースイメージの指定
FROM node:alpine
# 作業ディレクトリの指定
WORKDIR /usr/src/app
続いてDocker-Compose.ymlを作成します。
# docker-compose.ymlの作成
$ vi docker-compose.yml
以下の内容を記述します
version: "3"
services:
app:
container_name: node
build:
context: . # ビルドコンテキスト
dockerfile: Dockerfile # Dockerfileのディレクトリ
volumes:
- type: bind
source: ./
target: /usr/src/app
tty: true
上記と同じようにコンテナを起動することができます。
さいごに
今回はNode.jsの環境構築をしました。正直いって、足りないものだらけで今回作成した環境は使えません。しかし、最もシンプルなので、応用しやすいと思います。
記事に関する間違いなどありましたらコメントください。
最後まで読んでいただきありがとうございました。
Discussion