📘

Dockerと友達になろう

2024/03/09に公開

はじめに

このページは、Dockerについて基本的な知識をまとめているページです。
今後も学習した内容や知識を整理する際に、このページを更新していこうと思います。

Dockerってなんぞや?

Docker社によって開発されたコンテナ技術を使用した仮想化技術のこと。
仮想化技術には、ホスト型、ハイパーバイザー型、コンテナ型の3種類存在します。

従来の仮想化では仮想マシンごとに1つのゲストOSをインストールし、あたかも1台の独立したサーバーのように利用していましたが、DockerではホストOSのカーネルを共有して利用することで従来の仮想化と違いゲストOSを必要とせずに軽快に動作することができます。
※ホスト型やハイパーバイザー型についてはこの記事では記載しません。

そもそも仮想化ってなに?

PCにインストールされているOS(ホストOS)の上に、別のマシンを仮想的に立ち上げる事のことをいいます。簡単に言うとパソコンの中に別のパソコンを仮想的に起動することが仮想化です。

Dockerを使用するメリットなんだ?

Dockerは他の仮想化技術と比較すると軽量なことがメリットだと思いますが、その結果、他の開発者に自分と同じ開発環境を共有することができることが最大のメリットだと思います。
自分が動いてたプログラムが、他の人の環境だと動かなないことが起きると原因究明に時間が
取られてしまい、本来開発できる時間がとられてしまいますからね..

dockerの仕組み

Dockerの仕組みを簡単に図にしてみました。

図の詳細

Client

  • Docker cli
    Dockerをコマンドで実行できるようにするインターフェースのこと
    コマンド例:docker create,docker image build

  • Docker Desktop
    DockerをGUIから操作するためのクライアントツール
    WIndouws,Macそれぞれクライアントツールが存在する

Host

  • Docker deamon
    コンテナを管理するために常駐するプロセスのことで司令塔。

  • containerd
    高レベルのContainer Runtimeで、実行中のコンテナの管理・監視であったり
    コンテナイメージの管理(Registryへのpush, pullなど)が主な役割

  • runc
    低レベルのContainer Runtimeで、コンテナを起動・実行することが役割

  • イメージ
    Dockerコンテナの動作環境に必要なテンプレートのこと。
    OSやアプリの実行が必要なコマンドも含まれます。
    コンテナを作成するための、設計図をイメージするといいかもしれません。

  • コンテナ
    Dockerイメージをもとにアプリを実行する環境のこと。
    1つのイメージから1つのDockerコンテナが作成される。

  • storage
    コンテナ内で発生したデータは同じコンテナ内に保存されるが、コンテナを破棄すると消えてしまいます。コンテナが消えてもデータを保存しておきたい場合、コンテナ外にデータ保存領域を作成する必要がある。
    データの保存先には、3種類存在する。

    • ボリューム
      Docker の管理下でストレージ領域を確保する。
      (Linux なら /var/lib/docker/volumes/以下)
      名前付きボリュームと匿名ボリュームがあり、名前付きの場合は Docker ホスト内で名前解決できるのでアクセスしやすい。他のプロセスからはさわれないので安全。基本はこれを使うのがよい。

    • バインドマウント
      ホスト側のディレクトリをコンテナ内のディレクトリと共有する。

    • tmpfs
      メモリ上にストレージ領域を確保する。名前の通り一時的な領域となる。
      用途としては、機密性の高い情報を一時的にマウントする場合などに使う。

  • network
    Dockerのネットワークを管理するもの。
    Dockerをインストールするとbridge、none、hostのネットワークが作成される。

    • bridge
      ブリッジ接続でホストのネットワークと接続

    • none
      ネットワーク・インターフェースが欠如した状態

    • host
      ホスト側のネットワーク・スタックにコンテナを接続しており、コンテナ内のネットワーク設定が、ホスト上と同じようにみること

Registry

Dockerコンテナを作成する際に、必要なイメージを管理している場所。
自分が作成したイメージも保存することができる。

Dockerコンテナが作成されるまでの流れ

上記に記載していた図を用いていきたいと思います。

  1. ClientからリクエストをHostに送信
    Docker DesktopやDocker cliを使用して、Dockerイメージ,コンテナを作成するためのリクエストを送る。(コマンドの例:docker create,docker image, docker build)

  2. Clientから受け取ったリクエストをdocker deamonが受信する。

  3. docker deamonは必要なメモリ内必要なイメージがなければ、containerdがRegistryからイメージを取得する

  4. 取得 or メモリにあるイメージからruncがコンテナを起動する。

hello wolrdをやってみよう

Docker社公式に配布しているDocker imageを使用してターミナルにHello from Docker!が
表示されるようにコンテナを作成していこうと思います。
※Dockerをインストールしておくこと

docker run hello-world // このコマンドを実行するだけ

参考にしたDocker hubの公式サイト
https://hub.docker.com/_/hello-world

Dockerのコマンド一覧

よく使用するコマンドが綺麗にまとめられています。
https://www.kagoya.jp/howto/cloud/container/dockercommand/
https://zenn.dev/zmb/articles/f93e411d967964

コマンドのリファレンス
https://docs.docker.jp/engine/reference/index.html

Dockerfile

上記では簡単なコマンドを持ちいてHello Worldのコンテナイメージを作成していきましたが、実務ではDockerfileを使用してコンテナを作成すると思います。
ここでは簡単にDockerfileについて記載していきます。

Dockerfileとは?

コンテナイメージを管理するためのファイルで、コンテナの仕様をファイルで管理することができる。
Dockerコンテナの変更プロセスを自動化することができ、
コンテナイメージの履歴を層(レイヤー)として管理することで、イメージを最小化することができる。

Dockerfileの書き方の例

FROM [イメージ] [タグ] 一番最初に書くこと
FROM ubuntu:22.10

RUN [コマンド] -
RUN apt update \
    && apt install -y apache2


CMD ["実行ファイル", "パラメータ1","パラメータ2"]  Dockerコンテナが実行されたときにデフォルトで実行するコマンド
CMD ["apachectl","-D","FOREGROUND"]


COPY [コピー元][コピー先] ホスト(ローカル)のファイルやディレクトリをDockerイメージにコピーします。
COPY index.html /mydir/index.html

ENV [キー] = [値]  Dockerfile内で環境変数を設定するために使用
ENV MYSQL_USER=admin

WORKDIR [ディレクトリのパス]  コマンドを実行する作業ディレクトリ
WORKDIR /app

Docker compose

複数コンテナのアプリケーションを定義・共有するためのツールのこと。
※本番環境では使用できないので、ECSやKubernetestを使用している。今回の投稿では記載しない

今後更新する予定のもの

  • Docker composeについて記載
  • TODO:Express & Vueの環境を構築してみる

メモ

Docker + vscodeを使用する場合、VScodenに拡張機能のRemote-Containersをインストールすると便利らしい。

参考資料

Discussion