はじめに
個人でRuby on RailsのWebサービスを開発しているのですが、Docker+VSCode Remote Containerでの開発環境を初めて作るにあたって、コンテナやDockerについて何も分からないところから始めたので、その時に調べた基本知識をまとめておきます。
コンテナとは、Dockerとは
コンテナとは
1つの共有されたホストOS上で動く、独立したアプリケーション実行環境のこと。 仮想マシンと比較されることがあるが、下記のように比較できる。
- 仮想マシン
- ハードウェアとOSの間にハイパーバイザという管理層をはさみ、ハイパーバイザが提供する仮想的なハードウェア上で複数のOSを同時に動かす
- コンテナ
Docker
コンテナにまつわるワークフロー全体を管理できるアプリケーション。
Dockerで管理するコンテナ=「Dockerコンテナ」。
コンテナのワークフロー(Build, Ship, Run)
「Build, Ship, Run」は、コンテナのワークフローを示す、Docker社提唱のスローガン的な言葉。
ワークフローには、「Dockerイメージ」「Dockerレジストリ」「Dockerコンテナ」の3つの概念が登場します。
- Build
- コンテナ作成に必要なファイル群などの材料から、Dockerイメージを作成
- Ship
- Dockerレジストリを用いて、Dockerイメージを共有
- Run
- Dockerイメージから、Dockerコンテナを実行
Dockerイメージ
- Dockerコンテナとして実行するためのアプリケーションやそれが依存するファイル群、コンテナ環境自体の設定などを定めたもの。
- コンテキストとDockerfileをビルドすることで、コンテナイメージを作成する
- コンテキストとは、アプリケーションの実行に必要なファイル群のこと。
- Dockerfileとは、Dockerイメージの作成手順を記載したファイルのこと。
Dokerレジストリ
- Dockerイメージが格納されている場所。
- 代表的なのはDocker Hub Container Image Library。GitHubのような感じと理解。
- Dockerレジストリで配布されている基本のDockerイメージをベースにして、必要なものを追加する形で自分のDockerイメージを作る形になる。
Dockerコンテナ
- 実際にアプリケーションを実行できる環境。
- Dockerイメージを実行することで、Dockerコンテナを立ち上げる。
コンテナのレイヤー構造
コンテナは、「変更差分の集まり」になっている。各変更差分を「レイヤ」と呼び、レイヤを重ね合わせる形で構成される。
Dockerfileの書き方
DockerfileにはDockerイメージの作成手順を記載する。
手順1つ1つがレイヤとして重ねられていくイメージ。
下記のDockerファイルであれば、3つの手順ごとにレイヤが重ねられていく。
FROM mcr.microsoft.com/devcontainers/ruby:0-3.1
- rubyのコンテナイメージを取得する(この中も実際はレイヤの重ね合わせになっている)
RUN gem install rails webdrivers
- railsをインストールする
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev,.preview.app.github.dev,.app.github.dev"
- 環境変数を設定する
Dockerfile(VSCode devcontainerでRuby on Railsの開発用に作成したもの):
FROM mcr.microsoft.com/devcontainers/ruby:0-3.1 # Install Rails RUN gem install rails webdrivers # Default value to allow debug server to serve content over GitHub Codespace's port forwarding service # The value is a comma-separated list of allowed domains ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev,.preview.app.github.dev,.app.github.dev"
よく使いそうなDockerコマンド
docker build -t [イメージ名] [Dockerfileが置いてあるパス]
- Dockerイメージを作成する
-t
オプションを付けると名前を指定できる
docker run -it [コンテナ名] /bin/bash
- Dockerコンテナを起動する
-it
以降を付けることで、コンテナ内のシェルをインタラクティブに操作できる
docker image ls
- Dockerイメージの一覧を表示
docker container ls
- Dockerコンテナの一覧を表示
docker ps
- 起動中のコンテナのステータスを表示
docker container prune
- 停止中のコンテナをまとめて削除できる
docker image prune
- タグがないイメージをまとめて削除できる
- 例えばDockerfileを更新して再度ビルドすると、更新前の古いイメージIDに紐づくコンテナはタグが削除されて
になる
参考資料
書籍
イラストでわかる DockerとKubernetes(技術評論社)
かなり分かりやすくてよかったです。初学者向け。1-2時間でサクッと読めます。
分かりやすさ重視なので、ある程度知っている人にとっては内容が薄そう。
気に入ったところ
- イラストでの図解が豊富&フルカラーなのでとっつきやすい
- サンプルでこまめに挙動を確認し、実行したコマンドと表示結果にきちんと補足がある
- サクッと読める
記事
基本事項について
開発環境構築について
最初にいきなりこれらの記事を読んだのですが、分かるような分からないような?だったので、上述の書籍を参照してコンテナの基本概念を理解してから、記事に戻った感じです。 qiita.com