#動機
Create React Appを少し遠回りしてはじめようをローカル環境を汚さずに実践したかっため、タイトルのような環境構築を目指しました。
#最終的なディレクトリ構成
node-docker/
|--docker-compose.yml
|--node/
|--app/
#docker-compose.yml
Docker Compose 概要
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。
まずプロジェクトフォルダnode-docker
を作成し、そこにdockercompose.yml
ファイルを作成します。
node-docker/
|--docker-compose.yml
version: '3'
services:
node:
image: node:14.9.0-alpine3.10
container_name: node
volumes:
- ./node/app:/app
tty: true
ports:
- 3000:3000
version
docker-compose.yml
のファイルフォーマットのバージョン
services
各コンテナをサービスとして定義できます。
node
サービス名
image
コンテナを実行時に元となるイメージを指定します。
イメージが存在していなければ、ComposeはDocker Hubからpull(取得)を試みます。
Dockerfile
からイメージを作成する場合は、例えばnode
ディレクトリの下にDockerfile
を作成し、以下のように指定します。
build: ./node
container_name
デフォルトで生成される名前の代わりに、カスタム・コンテナ名を指定します。なお、デフォルトだとnode-docker_node_1という名前になります。
volumes
ローカルのパス(左)とコンテナのパス(右)を共有します。
tty
端末を起動するかどうかを指定しています。(多分)
ports
ポートを公開します。ホストとポートを指定(ホスト:コンテナ)するか、コンテナのポートのみ指定します(ホスト側のポートはランダムに選ばれます)。
expose
はポートを露出し、リンクされたサービス間でのみアクセス可能になります。
- [docker-compose の ports 指定まとめ]
(https://qiita.com/tksugimoto/items/23fcce1b067661e8aa46) - ロミオとジュリエットで学ぶ「ポートが開いてる」と「Listenしている」の違い
#コンテナの作成と起動
ここまでで必要なファイルが揃ったので、コンテナの作成と起動を行っていきます。
Dockerfile
からイメージを作成する場合は、Docker-compose build
する必要がありますが、今回は既にビルドされたイメージをリモートから取得するので必要ありません。
作業はdocker-compose.yml
が置いてあるディレクトリ上で行います。
$ docker-compose up -d
d
オプションにより、バックグラウンドで起動することができます。
nodeコンテナに入る
以上でnode環境は整いましたが、node環境はコンテナ上にあるため、作業はその上でする必要があります。
そのために、起動中のコンテナ内で指定したコマンドを実行できるexec
コマンドを利用して、コンテナ上でシェル、端末を起動します。
$ docker-compose exec node sh
コンテナ内のディレクトリ構成は以下のようになっていて、docker-compose.yml
で指定したためコンテナでのapp
ディレクトリとローカルのnode/app
ディレクトリは対応しています。
/
|--app
|--bin
|--dev
|--home
|--lib
|--media
|--mnt
|--opt
|--proc
|--root
|--run
|--sbin
|--srv
|--sys
|--tmp
|--usr
|--var
作業は、ローカルと共有できているappディレクトリでした方が良いと思います。
#参考
Compose file version 3 reference
Compose ファイル・リファレンス
Docker Compose - docker-compose.yml リファレンス
【初心者向け】Dockerで手軽にNode.js開発環境構築 (2)