🐳

【読書メモ】docker&仮想サーバー完全入門を読んでdockerに再入門する

2024/02/15に公開

概要

Dockerの入門書を読みながら、気になったことや、覚えておきたいことを書き留めたメモのまとめです。
ワンコインで購入できると話題だったので、この機会に学び直すことにしました。
エンジニアとしてキャリアをスタートする前に、個人開発でDockerを使っていましたが、なんとなくでやってた部分が多かったので今回再入門します。

読書メモ

▼サーバーにLinuxが使われるのはなぜか

・OSS

OSSのため、何か問題が起きたときにソースを確認することができる。
また、開発も盛んに行われており、修正や改善が頻繁に行われている。

・サーバ向けの設計

MacOSやWindowsは、個人向けに便利な機能を自前で組み込んでくれているが、Linuxはディストリビューションを自由に選択できたり、カスタマイズ性に優れている。
サーバー用途であれば、GUIを削除してサーバーに必要なものだけに絞って構成を組めるので無駄を省くことができる。

・パーミッション管理が可能

Linuxはディレクトリ、ファイルごとにアクセス権限を管理することができる。

Linux、ディストリビューションとカーネル
  • Linux
    Linuxは、リーナス・トーバルズが開発したUNIXライクな「OS(Operating System)」のこと。
    OSは、リソースの管理やファイル、プロセス管理、PCを操作するためのユーザーインターフェース(CLI, GUI)の役割を担っており、コンピュータの機能の中枢。
  • カーネル
    カーネルは、OSの機能の中核を担い、OSはカーネルを含むコンポーネントの集合と言える。
    ソフトウェアと、ハードウェアのやり取りの仲介役の機能を担っている。
  • ディストリビューション
    OSや、ソフトウェアの配布形態やパッケージングのこと。
    カーネルに、ライブラリや、アプリケーション、コマンドなどを合わせたもの。
    有名どころだと、Debian系(Ubuntu等), Redhat系(CentOS等)がある。

▼コンテナとは

アプリケーションと、ファイルシステムを完全分離したプロセス。一つの物理マシンの中で、複数の環境を作ることができる。
コンテナの利点は、ホストOSと『カーネル』を共有できること。
仮想マシンの場合は、ホストOSとは別に、各環境ごとにOSを入れないといけないのでその分のオーバーヘッドが発生する。

▼Dockerとは

コンテナを作成、実行するためのソフトウェア。
このDockerのプロセス上でコンテナを実行する。
DockerはLinuxで動かす前提で作られており、MacOSで動かす場合はLinux環境が必要。
(Docker Desktopがその環境を用意してくれてる)

▼コンテナのメリット、デメリット

  • メリット
    • ホスト環境を汚さない
    • IaC(Infrastructure as Code)
    • 可搬性がある
    • 環境の作成、削除のコストが低いことで、環境の管理が容易
  • デメリット
    • 学習コストが高い(Linux、オーケストレーションの知識が求められる)
    • ホストOSが異なる場合に、カーネルの違いによる問題が発生する可能性がある

▼Dockerの構成要素

クライアント

GUIやCLIで、Dockerに対して操作を行うクライアント。

Dockerデーモン

クライアントからのリクエストを受け付けるソフトウェア。REST APIを使ってやり取りを行なっている。

デーモンとは

バックグラウンドで要求を監視して待機している常駐プログラムのUNIX系OSにおける呼び名。

Dockerレジストリ

Dockerイメージを管理するレジストリ。

▼コマンドについての認識の整理

  • docker-composeは古い方で、docker composeが正解
  • docker container runをdocker runとしていたが、コマンドが増えてきたため省略しないことが推奨されている
  • compose.ymlのversion:の指定は現在非推奨
  • CMDとENTRYPOINTの関係
    • docker runのcmdオプションに指定がある && ENTRYPOINTがある => ENTRYPOINTの引数としてdocker runのcmdオプションが使われる
    • docker runのcmdオプションに指定がある && ENTRYPOINTがない => runのcmdの引数としてDockerfileのCMDが使われる
    • docker runのcmdオプションに指定がない && ENTRYPOINTがある => ENTRYPOINTの引数としてDockerfileのCMDオプションが使われる
    • docker runのcmdオプションに指定がない && ENTRYPOINTがない => runのcmdとしてDockerfileのCMDが使われる
  • ENTRYPOINTを複数ある場合は、最後の一つのみが実行される
  • docker composeコマンドのチートシート

▼データの永続化

ボリュームを使ってデータの永続化を行う。ボリュームとは、Dockerが管理する記憶領域のこと。
バインドマウントは、ホストOSのフォルダやファイルを直接コンテナ内のファイルにマウントすること。
ホスト側のファイルを変更すると、仮想環境内のマウントされたファイルも同様に変更される。
推奨はボリュームを使うことだが、いちいちビルド、起動をしないとファイルの修正をコンテナに反映できないので、
開発中はボリュームマウント(バインドマウント)を使用していた方が便利そう。

感想

新しく何かを学んだというよりかは、既存の知識の整理ができて理解が深まったと思います。
素人でもDockerを使えば、ネットに落ちている情報だけで環境を作れてしまうことに驚きです。抽象化されているからこそ、Dockerの周辺知識、低レイヤーの知識がないと十分に使いこなせないと思うので、広い範囲で知識を詰め込んでいこうと思います。
次は、もう一歩深い部分の内容を読んでみようと思います。

Discussion