Docker とは
Docker はコンテナ環境の老舗です。ご存じない方には説明が必要かもしれません。コンテナとはホストOSから独立したマイクロサービスの実行環境です。
よく、コンテナを使ってこなかった方やご存じない方から「なぜコンテナを使うのか」と聞かれることがあります。なかなかうまく答えられませんが、以下のようなメリットがあるんだと思っています。
- 何度でもつくり直せる
- 新バージョンを積極的にチャレンジできる
- コンテナの中で何をしてもコンテナの外は汚染されない
- プロジェクト、ブランチ、サービス、その他好きな単位にコンテナを分けて分割統治できる
- コンテナの圧縮ファイルを渡せば、新規参入メンバーは即開発を開始できる
- コンテナの圧縮ファイルがあれば、開発マシンが突然クラッシュしても、代替機で即開発を再開できる
本プロジェクトにおけるコンテナ分割ポリシー
バックエンドも自前で用意していると、最低でも2コンテナ構成になります。
- フロントエンドサービスを受け持つコンテナ
- バックエンドサービスを受け持つコンテナ
認証やデータベースは別コンテナになることも多く、通常のプロジェクトであればコンテナ構成は複雑になり、何らかのワークロードが欲しくなってきます。
幸い本プロジェクトでは、バックエンドに Supabase という BaAS を使っていますので、1つのコンテナで事足りています。しかしながら現在使用しているコンテナは6個目のコンテナなんです。(8月12日から14日の午前中までは7個目を使っていたのですが Swiper の autoplay がどうしても機能せず6個目に戻しました)
- 1個目: Supabase お試し (認証とデータベースアクセス) 用 -> 成功
- 2個目: Supabase お試し (リアルタイム (LineやSlackのように何もしなくても画面表示が更新される) Webアプリ) 用 -> 成功
- 3個目: カルーセルコントロール試行錯誤 -> Swiper に決定
- 4個目: mui 導入 -> 失敗
- 5個目: React ダウングレード -> mui 導入試行錯誤 -> 導入方針決定
- 6個目: React ダウングレード -> このコンテナで開発中
- 7個目: React 最新バージョンでのチャレンジ -> Swiper の autoplay が動作せずチャレンジ中断
コンテナと人生は同じ
結果的に何らかの飛躍、試行錯誤、黒歴史を歩むときにコンテナを分けていれば、いざというときでも安心です。時間は失いますが何も傷つけません。失った時間も実は大事な経験だったのかもしれません。
人生も同じだと思います。無数のコンテナで構成されている人間は3年でまったくの別人に生まれ変われるものと信じています。
docker-compose
Docker が標準で用意してくれているコンテナオーケストレーションモジュールです。
docker-compose.yml
1 version: "3"
2
3 services:
4 hreact:
5 image: node:latest
6 container_name: "sirokuro-dev7"
7 hostname: "sirokuro-dev7"
8 ports:
9 - "3007:3000"
10 stdin_open: true
11 tty: true
12 working_dir: "/var/www/html"
13 volumes:
14 - ./src:/var/www/html
15 networks:
16 - sirokuronet
17 networks:
18 sirokuronet:
19 external: true
20
- 4行目: コンテナのサービス名
- 5行目: node.js の最新バージョンを Github から取得してくれる
- 6行目: コンテナ名を指定している
- 8-9行目: ホストOSの 3007 番ポートへのアクセスをコンテナの 3000 番ポートに転送してくれる
- 13-14行目: ホストOSの ./src フォルダを コンテナの /var/www/html にマウントしてコンテナのデータをホストOSで永続化してくれる
13-14行目 の定義のおかげで以下が実現できます。
- ホストOSのテキストエディタでコンテナ内のソースコードを編集できる
- コンテナが壊れてもソースコードは失われない
- ホストOS の Git リポジトリでソースコードを操作できる
4-16行目で hreact サービス (コンテナ) を定義しています。この docker-compose.yml ファイルに db や auth や rest など複数のサービス (コンテナ) を定義し、非同期 (同時) で起動することもできますし、何らかの依存関係 (db が起動してからその他を起動する等) を定義することもできます。(オーケストレーションしてくれます)
docker-compose up
コンテナを起動します。
$ pwd
/Users/c22/Dev/sirokuro-dev7
$ ls
README.md docker-compose.yml
$ docker-compose up
[+] Running 1/1
⠿ Container sirokuro-dev7 Created 0.1s
Attaching to sirokuro-dev7
sirokuro-dev7 | Welcome to Node.js v18.7.0.
sirokuro-dev7 | Type ".help" for more information.
docker-dompose up したターミナルはコンテナの標準出力を表示しています。docker-compose up に -d オプションを付けると、バックグランドでコンテナを起動するのでターミナルは解放されますが、コンテナの標準出力は重要なメッセージを出力してくれる場合があるので、フォアグランドで実行させて、問題に気づけるチャンスを残すのがおすすめです。
フォアグランドで起動したコンテナは、control + c で停止します。
docker container コマンド
ls
起動中コンテナの一覧を取得します。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
873676d7b4e9 node:latest "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:3007->3000/tcp sirokuro-dev7
$
-a オプションをつけると停止中コンテナを含むコンテナ一覧を取得します。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
873676d7b4e9 node:latest "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:3007->3000/tcp sirokuro-dev7
237dc58da323 node:latest "docker-entrypoint.s…" 29 hours ago Exited (137) 10 hours ago unrweb-mui
0412c37b049a node:latest "docker-entrypoint.s…" 2 days ago Exited (137) 26 hours ago sirokuro-concept2
a562afa3f0b0 node:latest "docker-entrypoint.s…" 3 days ago Exited (137) 2 days ago skdev7
$
exec
コンテナでコマンドを実行します。コンテナの /bin/bash を実行することで、コンテナにログインするのと同等のコマンド操作を行えます。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
873676d7b4e9 node:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3007->3000/tcp sirokuro-dev7
$ docker container exec -it sirokuro-dev7 /bin/bash
root@sirokuro-dev7:/var/www/html# hostname
sirokuro-dev7
root@sirokuro-dev7:/var/www/html#