LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

ふわっとした理解の初学者がdockerと仲良くなるための3ステップ

f:id:koga_lcl:20201212024629p:plain

この記事はLCL Advent Calendar 2020 - 12日目の記事です。 qiita.com

はじめに

LCLのバックエンドエンジニアの古賀です。
本記事の内容は以下のような方を対象にしたdockerの初学者向けの記事になっています。

  • チームでdockerを使い始めたがよく分かっていない
  • コマンドアレルギーなので理解が追いつかない

特にチームで使い始めて、ふわっと始めた方は最初が大変ですよね。
私も数年前にチームで環境構築をdockerへ移行したのですが
以下の点で最初の一歩が難儀でした。

  • ログがない(ように見える)ので何が起こっているのか分からない
  • dockerコマンドが長くて覚えきれない
  • 自分で環境作ってないので環境更新したいとき取っ掛かりがない

ですが今では関連ツールがブラッシュアップされたり、界隈のナレッジがブログ化されたりなどして
非常にdockerを始めやすい環境になってきたと思います。

今回は私がLCLでの経験を通してdockerと仲良くなった3つのステップを紹介させていただきます。

dockerと仲良くするための3ステップ

  • Docker DesktopのGUIで初期のコンテナ操作に慣れる
  • 開発が進んできたらコマンド操作は必要→よく使うものはMakefileでまとめて楽する
  • 理解を深めたくなったら公式のサンプルをアレンジしてみる

最初の一歩はDocker Desktopで

まずは篠田将彦さんのこちらの記事をご参考ください。
futureys.tokyo

Docker DesktopのGUIでできることがまとまっているおり
コンテナの起動や停止、ログの確認など便利さがよく分かる内容になっています。

数年前に比べDocker DesktopのGUIは格段に使いやすくなり
初学者の方にはとても嬉しいツールになりました。
コマンドをほとんど使わずにコンテナ操作できるのは非常にありがたいです。

Docker DesktopのGUI例。
右上のアイコン群から起動や停止、ブラウザでの表示などできて親切。 f:id:koga_lcl:20201211183711p:plain

docker公式がいろんな環境のサンプルを紹介しているので
dockerが初めてという方は、Docker Desktopと組合せて使ってみるのがおすすめです。 docs.docker.jp

コマンド操作が避けて通れないなら楽をする

Docker Desktopのおかげでdockerの最初の一歩を踏み出しやすくなりましたが
開発が進んでいくとライブラリの更新などでコマンド操作がどうしても必要になってきます。
しかしコマンドは微妙に長い・・・。
頻繁に使うにしてはなかなか脳のリソースを専有してきます。

コマンドの一例

# アプリイメージをビルド
docker-compose build -f docker-compose.yml

# シードデータ投入
@docker-compose run --rm runner rails db:seed

# bundle install実行
@docker-compose run --rm runner bundle install

etc...

そこでLCLでは頻繁に使うコマンドはMakefileにまとめて楽をしています。

Makefileの一例

.PHONY: help build start stop restart up down ps log runner setup

.DEFAULT_GOAL := help

help:   ## ヘルプを表示
    @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

build:  ## アプリイメージをビルド
    docker-compose build -f docker-compose.yml

seed:   ## シードデータ投入
    @docker-compose run --rm runner rails db:seed

bundle-install: ## bundle install実行
    @docker-compose run --rm runner bundle install

etc...

上記のようにMakefileにまとめるとmake buildなど非常に簡潔なコマンドになります。
頑張ってコマンドを覚えるのもいいですが、楽できる部分は楽をするのがエンジニア。
簡潔なコマンドだと抵抗感も低くなってきます。
慣れてきたらコンテナ操作をコマンドに移行すると開発にもスピード感が出てくるはずです。

便利さを実感できたら広げようdocker環境

チームなどで用意されたdocker環境を使っていく分には
前述の2つのステップで大分仲のいい友達になれたと思います。

そこから一歩踏み込んで

  • 古いリポジトリの環境構築をdockerに置き換えたい
  • 新しい案件のdocker環境構築をやってみたい

などになってくると、dockerとの真剣交際が始まったと言えます。

dockerの記述は、突き詰めるととても深い内容になってしまいますが
公式が用意しているサンプルを読み解いて求める環境にアレンジしていくのが
一番理解していきやすいステップじゃないかと思います。

注意点としてDockerfileなどの定義ファイルを見ていきますが
それらの詳細な解説は本記事では省かせていただきます。
初学者の方が記述を理解していくための勉強方法として見ていただければ思います。

サンプルを見ていく

docker公式がいろんなサンプルを紹介しており docs.docker.jp

今回はその中からrailsについて見ていきます。 docs.docker.com

そこからdockerの

Dockerfileの例

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.ymlの例

version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

まったくの初学者だと辛い内容ですよね・・・。
ここで拒絶反応起こしてしまいそうですが
いきなり理解できないのは当然なのでここで大事なのは
1行1行に意味がちゃんとあるということです。
意味を知らないなら、辞書を引きながら少しずつ理解を深めていければOKなのです。

公式のリファレンスから読み解いていく

各定義ファイルの意味などは公式のリファレンスが整備されており
まずはこちらで理解を深めていくのが間違いがないと思います。

Dockerfileの公式のリファレンス docs.docker.jp

docker-compose.ymlの公式のリファレンス docs.docker.jp

定義ファイルの役割や各記述の意味などについて触りの理解ができたのなら
サンプルを自分好みに変更していく準備ができたと言えます。

サンプルの記述を求める環境に変更していく

サンプルの内容がが、そのまま要件に結びつくのは稀で

  • DBはpostgresだったけどMySQLにしたい
  • 新規に作らず既存の動いているDBを参照したい

など様々な変更点が出てくると思います。

結論から言ってしまうと
docker rails mysqldocker rails ローカルDBなどのワードでググると
先人の方々がまとめていただいている記事やサンプルが出てくるはずです。

それなら求める環境構成のサンプルを最初から使っていけばいいのでは?
と思ってしまいますが
理解を深めるためには自分自身で手を動かすのが一番の近道です。

公式の記述に対して、別の方のまとめた記述を移植していくと
上手くいかないことが多々あると思います。

また同じことをしているはずなのに記述方法が違うこともあるはずです。
それらにも何か意味があるのかな?と調べていくことで新しい発見につながると思います。

これらの試行錯誤や調べがdocker環境構築の理解の大事なきっかけになるはずです。
是非サンプルを色々いじりながらそのきっかけを掴みにいってほしいです。

最後に

いかがだったでしょうか。
dockerは環境構築に一過性を持たせてくれる非常にいいツールですが
最初の理解が難しいものだと思います。

今回の記事で少しでも皆さんがdockerと仲良くなるための助けになれば幸いです。