ぺのめも

Web開発を勉強中。学んだことや思ったことなど

Dockerとは?開発環境導入までに必要だった最低限の基本知識

はじめに

個人でRuby on RailsWebサービスを開発しているのですが、Docker+VSCode Remote Containerでの開発環境を初めて作るにあたって、コンテナやDockerについて何も分からないところから始めたので、その時に調べた基本知識をまとめておきます。

コンテナとは、Dockerとは

コンテナとは

1つの共有されたホストOS上で動く、独立したアプリケーション実行環境のこと。 仮想マシンと比較されることがあるが、下記のように比較できる。

  • 仮想マシン
    • ハードウェアとOSの間にハイパーバイザという管理層をはさみ、ハイパーバイザが提供する仮想的なハードウェア上で複数のOSを同時に動かす
  • コンテナ
    • ホストOSのカーネル上で、そのOSカーネルの提供する環境隔離機能を使って、独立した実行環境を作る技術
    • コンテナ自体にはOSは含まれない

Docker

コンテナにまつわるワークフロー全体を管理できるアプリケーション。
Dockerで管理するコンテナ=「Dockerコンテナ」。

コンテナのワークフロー(Build, Ship, Run)

「Build, Ship, Run」は、コンテナのワークフローを示す、Docker社提唱のスローガン的な言葉。
ワークフローには、「Dockerイメージ」「Dockerレジストリ」「Dockerコンテナ」の3つの概念が登場します。

  • Build
    • コンテナ作成に必要なファイル群などの材料から、Dockerイメージを作成
  • Ship
  • Run
    • Dockerイメージから、Dockerコンテナを実行
Dockerイメージ
  • Dockerコンテナとして実行するためのアプリケーションやそれが依存するファイル群、コンテナ環境自体の設定などを定めたもの。
  • コンテキストとDockerfileをビルドすることで、コンテナイメージを作成する
    • コンテキストとは、アプリケーションの実行に必要なファイル群のこと。
    • Dockerfileとは、Dockerイメージの作成手順を記載したファイルのこと。
Dokerレジストリ
  • Dockerイメージが格納されている場所。
  • 代表的なのはDocker Hub Container Image LibraryGitHubのような感じと理解。
  • 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に紐づくコンテナはタグが削除されてになる

Dockerfile A をビルドしてイメージを作成
Dockerfile A をビルドしてイメージを作成

Dockerfile Aを更新した A' をビルドしてイメージを作成
Dockerfile Aを更新した A' をビルドしてイメージを作成すると、古いほうはnoneになる

参考資料

書籍

イラストでわかる DockerとKubernetes技術評論社

かなり分かりやすくてよかったです。初学者向け。1-2時間でサクッと読めます。
分かりやすさ重視なので、ある程度知っている人にとっては内容が薄そう。

気に入ったところ

  • イラストでの図解が豊富&フルカラーなのでとっつきやすい
  • サンプルでこまめに挙動を確認し、実行したコマンドと表示結果にきちんと補足がある
  • サクッと読める

記事

基本事項について
開発環境構築について

最初にいきなりこれらの記事を読んだのですが、分かるような分からないような?だったので、上述の書籍を参照してコンテナの基本概念を理解してから、記事に戻った感じです。 qiita.com

qiita.com