Dockerと友達になろう
はじめに
このページは、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コンテナが作成されるまでの流れ
上記に記載していた図を用いていきたいと思います。
-
ClientからリクエストをHostに送信
Docker DesktopやDocker cliを使用して、Dockerイメージ,コンテナを作成するためのリクエストを送る。(コマンドの例:docker create,docker image, docker build) -
Clientから受け取ったリクエストをdocker deamonが受信する。
-
docker deamonは必要なメモリ内必要なイメージがなければ、containerdがRegistryからイメージを取得する
-
取得 or メモリにあるイメージからruncがコンテナを起動する。
hello wolrdをやってみよう
Docker社公式に配布しているDocker imageを使用してターミナルにHello from Docker!が
表示されるようにコンテナを作成していこうと思います。
※Dockerをインストールしておくこと
docker run hello-world // このコマンドを実行するだけ
参考にしたDocker hubの公式サイト
Dockerのコマンド一覧
よく使用するコマンドが綺麗にまとめられています。
コマンドのリファレンス
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をインストールすると便利らしい。
参考資料
-
仮想化やDockerのメリットについて
https://qiita.com/etaroid/items/b1024c7d200a75b992fc -
Dockerの中身について簡単に解説されている
https://o2mamiblog.com/docker-beginner-1/ -
Dockerのドキュメント
https://docs.docker.jp/engine/introduction/understanding-docker.html -
dockerの将来について
https://zenn.dev/ttnt_1013/articles/f36e251a0cd24e -
dockerネットワークについて
https://qiita.com/khara_nasuo486/items/eeb76b66b60aa37df916 -
dockerfileの参考サイト
https://qiita.com/gon0821/items/f9e3bcbb6cb01d4ef7fa
Discussion