LoginSignup
0
0

More than 1 year has passed since last update.

あるWebサービスの開発メモ・Docker

Last updated at Posted at 2022-08-12

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#
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0