🙀

【初心者】Dockerの使い方(Node.jsの開発環境構築)

2023/10/13に公開

はじめに

この記事は最も軽量な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