業務で初めて docker を使う方向けに、キャッチアップのためのレッスンを実施させていただきました。
せっかくなので記事としてまとめておきます。
docker の挙動を深く理解するという目的ではなく、docker 未経験の方が docker でアプリケーションを開発している現場に参加する際に、最低限開発を進めることを目的として、概念・インターフェースを解説します。
今回は、docker の基本的な概念とコンテナの動かし方を理解します。
- docker の基本的な概念を理解する
- コンテナを立ち上げ、ホストOSからコマンドを実行できるようになる
- Dockerfile に書かれている内容を理解できるようになる
docker introduction 🔗
概念理解 🔗
概念理解については、優れた解説記事が世にたくさんあるので、ここではポイントだけまとめておきます。
- docker は「コンテナ」という単位で Linux の実行環境(=インストールされているツールや保存されているファイルなど)を1つにまとめておく仕組み。
- 仮想化のアプローチとしては、コンテナの他にハイパーバイザ型が存在する。
- ハイパーバイザ型がOSレベルで分離されているのに対し、コンテナはホストOSの Linux カーネルは共有しており、
namespaceとcgroupによって分離されているため。 - コンテナだと、毎回 OS を立ち上げる必要が必要がないため、軽量&高速に利用できる。
仮想化技術 🔗
docker は「仮想化」と呼ばれる技術に分類されます。
仮想化とは何かという話ですが、「アプリケーションを動かすために必要な諸々(OS/ストレージ/ライブラリ/ネットワーク/etc…)を論理的に分割して、専用の環境を作り上げること」という理解で今は大丈夫です。
では、仮想化すると何が嬉しいのか、あるいは、なぜアプリケーションを動かすための専用の環境を作り出したいのか、という話になります。
仮想化するメリットはいくつかありますが、アプリケーション開発者の視点だと、最大のメリットは同じ環境を簡単に複製できるという点だと思います。
たとえば、
ローカルの開発環境では正しく動作していたのに、テスト用のサーバーだと動かない。確認したら必要なミドルウェアのバージョンが違っていた。
とか、
新しい現場に配属されて、レポジトリをクローンし、環境構築の手順書通りに必要なライブラリやSDKをインストールしたが動かない。環境構築手順書が古くて必要な依存がいくつか足りなくなっていた。
といったケースをいちいち手動で解消するのは、開発規模が大きくなるにつれて無視できないほど大きなコストになっていきます。
仮想化技術を使えば、環境の一致が容易になります。
イメージとコンテナ 🔗
コンテナは、アプリケーションを動かすための専用の環境という話をしました。
コンテナを作るまでの流れは、大きく以下の3ステップになります。
- Dockerfile という「環境の定義書」を作成する。
- 上記のファイルを使って、イメージと呼ばれる「コンテナの雛形」を作成する。
- イメージからコンテナを作成する。
今回のレッスンでは、 Rails のチュートリアルを進めるために必要な環境が構築されたコンテナを作成してみましょう。
Hands on 🔗
コンテナの大本は Dockerfile と呼ばれる環境の定義書であると話しました。
なので、今回のゴールは「Railsがインストールされたコンテナを生成するためのDockerfileを作成すること」になります。
step.1: コンテナ内で rails を入れる 🔗
Dockerfileを作成することがゴールなので、「Dockerfileを記述してみて、イメージを作り、コンテナを立ち上げて目的の状態になっているかを確かめる」という進め方をしたくなるかもしれません。
簡単なイメージであればこれでも問題ありませんが、複雑な定義をする必要がある場合には「Dockerfile が間違っていたら修正して再度コンテナを作って検証する」としているとあまり効率がよくありません。
なので、
- まずはベースとなるイメージを決める。
- そのコンテナでシェルを起動して接続する。
- 必要なインストールコマンドなどを実行し、成功したら
Dockerfileに記述する。
としていくと、少し効率的に開発することができます。
ベースとなるイメージを決める 🔗
イメージはゼロから作成していくものではなく、すでに存在している何かしらのイメージをベースにして、そこに必要な環境設定を追加していくように作っていきます。
真っさらな Linux イメージから作っていくことも可能ですが、Rails の場合実行環境には Ruby が必要です。
メジャーな言語であれば、Linux にその言語のインタプリタやコンパイラがインストール済みのイメージが
Docker Hub
に公開されているのでこれが利用できます。
今回は ruby v2.6 を使っていきます。
コンテナでシェルを起動して接続する 🔗
ベースのイメージが決まったら、コンテナを起動して接続します。
$ docker run -it --name rb ruby:2.6 /bin/bash
このコマンドを実行すると、別のシェルが起動しているように見えるはずです。
docker run コマンドは、指定したイメージ(ruby:2.6)でコンテナを起動します。
最後に渡している /bin/bash は、コンテナの中で実行するコマンドです。
厳密には、コンテナの ENTRYPOINT に渡すパラメーターのようなものなのですが、今はここに渡したコマンドが実行できると思っておいて大丈夫です。
その他のフラグについては、docker run --help を実行すると説明が読めるので、各自確認してみてください。
rails をインストールする 🔗
Rails
には、gem install rails で rails をインストールするように書いてあるので、コンテナ内で実行します。
$ gem install rails
step.2: Dockerfile に記述する 🔗
ここまでの作業を Dockerfile に記述します。
まずは Dockerfile を作成します。
$ touch Dockerfile
以下のように定義を書いていきます。
FROM ruby:2.6
RUN gem install rails
1行目の FROM では、ベースとなるイメージを記述しています。
2行目の RUN では、環境構築のために必要なコマンド(ここでは rails のインストール)を記述しています。
step.3: コンテナを作って確認する 🔗
この Dockerfile から、イメージを作成(ビルド)してみます。
$ docker build -t rails-tutorial .
イメージが作られたことを確認します。
$ docker image ls
rails-tutorial という行が作られていれば成功です。
このイメージを使ってコンテナを立ち上げます。
$ docker run -it --name rails rails-tutorial /bin/bash
先ほどの ruby:2.6 で起動した場合とことなり、すでに rails がインストール済みであることが確認できます。
$ rails --version
宿題 🔗
-
チュートリアルを進めるために、
railsの他にsqlite3、node、yarnが必要と書かれれています。これらをインストールするようにDockerfileを編集してください。(aptで入れると、要求されているバージョンが入れられない場合があります。その場合は各公式のドキュメントを参考にして必要なバージョンをインストールしてください。) -
これらをインストールした後に
rails serverを実行するとWebpacker configuration file not foundというエラーが表示されます。このエラーを解消されるようにDockerfileを編集してください。