🧊

わからないのでDockerに入門したらさらによくわからなくなった

2022/04/24に公開

Docker に入門せんとす

仕事で Docker ファイルの修正がちょくちょく入っていく中、「何もわからん、、、^ q ^」という状態で眺めることが多かったのでひとまず Docker に週末で入門してみることにしてみました。
そして、その結果、ますます「Docker よくわからん、、、」となったので、その記録がてら記事を書いてみました。

Docker の基本的な用語

ひとまず「出てくる用語がわからん!」というところからだったので、かなり頻出するキーワードだった

  • コンテナ
  • イメージ

を抑えることにしました。
ひとまずは自分の現状の理解しているイメージを書いておこうと思います。

コンテナ

とにかくざっくりした印象は仮想 OS 的なものだと思っています(実際には仮想 OS ではなくて、仮想化の流れでできたコンテナ技術で OS 上の特定プロセスだけ載せる技術だそうですが、一旦スルーします)。
このコンテナにアプリケーションなどを配置してあげて、開発などが進められていくイメージです。

イメージ

イメージはコンテナを作るときの設計書のような役割だと思っています。
Docker hub で配布されていたり、Dockerfile から生成されたりします。
このイメージが共有できるので、どの環境でも同じ状態(同じ設計書から作られたコンテナができる)ができ開発環境がそれぞれで異なることがなく、最初の環境構築も無くなるというメリットがありそうです。

ついでに Docker compose

ついでに Docker compose についても今回サンプルを作ってみるにあたり使ったので記載します。
Docker compose は複数のコンテナを立ち上げることができます。
イメージの作成からコンテナ起動までがいっぺんに行えるので、いちいちビルド、イメージからコンテナ起動とやらずにすむというメリットがあります。
他にも Docker ネットワーク内の複数コンテナの接続周りも解消できるらしいですが、今回はやっていないのでパスです。

以上が現状の自分の一旦の理解になります。

とりあえずやってみた

とりあえずやってみないことにはわからない、ということで、適当な Nuxt のアプリを作ってコンテナで起動させてみることにしました。

:::開発環境
Docker version 20.10.14, build a224086
node v14.17.0
:::

手順は

  • Docker をインストール(公式サイトへいけばすぐできます)
  • npx nuxt-create-app でアプリ作成
  • Dockerfile と docker-compose.yml を root 直下に作成
  • 後はいい感じにひたすら書く!!!

です。一応 Dockerfile と docker-compose.yml のサンプルが下記になります。
正しいかはわかりませんが、一応コメントを書いているので参考にしてください。

# ベースイメージ
# alpineはとりあえず軽量らしいので採用、今回は自分のローカルと合わせて14系
# やってみたい人はこのバージョンは変更が必要かもしれません
FROM node:14-alpine

# コンテナが解放するポート
EXPOSE 3000
# ホストを指定
ENV HOST 0.0.0.0

# working directoryを/appに
WORKDIR /app
# package.json類だけコピー
COPY package.json . /
# 今回はyarnを使ったプロジェクトだったのでyarn.lock
COPY yarn.lock ./

# alpine linux packageマネジャーのアップデートなどを行う
# upgradeについては実は非推奨なのでできればしない方がいい
RUN apk update && \
  apk upgrade && \
  # ついでにyarn
  yarn
# docker-composeで使うバージョン
version: "3"
# services:アプリを動かすための様々なアクションのこと
services:
  frontend:
    # ビルドされる時のパス設定
    build:
      # どこでdocker buildしているか 今回はroot
      context: .
      # どこにdockerfileがいるか 今回はroot
      dockerfile: Dockerfile
    # port:ホストとコンテナのportの称号 nuxt標準の3000
    ports:
      - "3000:3000"
    volumes:
      # カレントディレクトリをコンテナの/appにマウントする
      - ./:/app
      # node_modulesをホストに残す
      - /app/node_modules
    # 起動するだけ
    command: "yarn run dev"

以上!!!上記ファイルを作成して、最後に

docker-compose up

をして、localhost:3000にアクセスして Nuxt の初期ページが表示されたら成功になります。

そしてまたわからんになる

こうして自身の手でなんとなく Docker 環境を立ててとりあえずは環境を立ち上げることに成功しました。
が、よくわからんことがいくつか生まれてしまったので、それを最後につらつらとかいていこうと思います。

Docker、FE の開発ではそんなに旨味ない?

私は FE を主戦場として日々戦っているのですが、Docker が出てくるのは開発時ではなく、デプロイ時なことが多いです。
あまり Docker で環境を整えてローカルで確認して、みたいなことをしていません。
そもそも FE の環境構築については割と誰でも同じような環境(OS だったり PC そのもののコアの部分では結構違いはあるカモですが)にしうることができそうな気がしています。というか、それほどまず開発環境を揃えるのも難しくない気もします。
例えば node のバージョンだったりというところだと Volta を使えば基本的に開発者で横一列に揃えられます。
また、依存関係は基本 lock ファイルなど固定にできますので差異が出ることも多くはなさそうです。
ので、BE などではどのような課題があって、どんな旨味があるかをちゃんと聞いてみたいなと思いました。

compose の旨味がやっぱりいまいちわからずに終わった

構成の問題だと思うのですが、compose の旨味が Nuxt をただ立ち上げるだけだとわかりませんでした。
今回の目標は Nuxt アプリだけを Docker 内で起動することが目標だったので、単純にイメージの作成、コンテナの立ち上げでもよかったのかなと思っています。
次回、もしくは何かの機会があれば、BE も作った上でやってみたいと思いました。

結局コンテナを掴みきれなかった

キーワードで取り上げたコンテナが理解できませんでした。
仮想 OS ではないが、仮想 OS に近い動きをする、というのがどうしてもうまく解釈できませんでした。
これは今後ちゃんと解釈して、できれば言語化したいなと思いました。

旅は続く

まだまだ理解でいていないこと(マルチステージビルドとか)がたくさんあります。
今後も少しづつ触り、現状の「Docker 何もわからん、、、^ q ^」から抜け出していきたいと思います。

Discussion