🐬

Dockerをいちからまなぶ Part1

に公開

はじめに

これまで数え切れないほどDockerの解説記事が書かれてきておりますが、自分がIT技術系を勉強する上で、これ、開発環境を作るには既存の環境にNextjSやらPythonやらダウンロードしていきたいけどなんか依存関係?とかあるらしくて、でも自分がいま使ってる環境(M3MacBookAir)に。直接インストールしてっちゃったら途中で失敗したときに復元大変じゃない???と思うことがありました。

そんなとき、仮想マシンにDockerに、開発環境のススメがHitするなかで、どうやって考えたらいいのか、そもそもDockerってなんなのかわかんないという状況に陥ったので、勉強のアウトプットがてら、同じようにDockerを勉強したい方の手助けになればいいなと思いまとめるに至りました。

このシリーズは、IT初学者でもわかりやすく体系的に学べるような内容構成を目指しました。
アウトプットも兼ねており、自分自身が初学者であるため内容の間違い、改良点ございましたらすぐにコメントを残していただけると幸いです。

著者環境(2025.09.19現在)

  • PC: M3MacBookAir
  • OS: MacOS 26.0(25A354)
  • ターミナルエミュレータ: Warp

まず、OSってなに?

Dockerについて詳しく学ぶ前に、OSとはなんなのか、軽く学んでおきましょう。

OSとは、主に以下のような役割を持ちます

  • ハードウェア(CPU,メモリ,入出力-I/O)の制御
  • プロセスやスレッドの管理
  • ファイルシステムの提供
  • UIやアプリケーションの実行基盤の提供

プロセスとスレッドの違いは?

  • プロセス
    実行中のプログラムのこと。自分専用のメモリ空間をもち、OSから実行資源を割り当てられて動く単位
  • スレッド
    プロセスの内部で実行されるプログラムの流れ

プロセス,スレッドの比較

メモリ空間の共有 スレッドは同じプロセス内のスレッド同士でメモリ空間を共有する。
作成/終了のコスト スレッド < プロセス
切り替えのコスト スレッド間 < プロセス間

プロセス/スレッドがDockerに結びつく理由

Dockerは、仮想化とは異なる形で「プロセスを軽く分離する」技術に近いため、これらの概念をあらかじめ理解しておくと、コンテナの仕組み(名前空間,cgroup等)が後で理解しやすくなります。

Shell,ターミナルとはなにか

ターミナル

入力と出力をおこなうインターフェースです。もともとUNIXと接続してやりとりする端末(Terminal)という意味で使用されました。現在はPC内のインターフェースソフトウェアのこともターミナルと呼んでいます。ターミナル自身にコマンドを理解したり、実行する力はありません。ただのインターフェースです。

Shell

ターミナルの中で動くプログラムです。ユーザからコマンドを受け取り、それを解釈してOSに命令を送る役割を持ちます。

基本的なコマンドの理解

このページ内では解説は行いませんが、以下のページを参照するなどして、Linuxの基本的なコマンドの理解をしておいてください。

もう少しShellの理解をすすめる

Shellの定義・役割

ShellはOSのユーザーインターフェースの一種で、ユーザーから入力されたコマンドを解釈してOSに伝える伝える役目をもちます。

Shellに備わる主な機能

機能 内容
コマンド履歴 過去に実行したコマンドを再度呼び戻せる
補完機能(Tab補完) コマンド名,ファイルファイル名などを自動補完できる
ワイルドカード・パターン展開 *.txtのような記述で複数のファイルを一度に指定できる。
リダイレクト・パイプライン コマンドの入出力をファイルに書き込んだり他のコマンドに渡したりが可能
変数操作・環境変数 PATHなどの設定、シェル内変数の利用が可能
制御構造(条件分岐,ループ) if/ for/ whileなどの構文でスクリプトを書くことが可能。
スクリプト機能 複数のコマンドをまとめてファイルとして保存し、実行が可能

主なShellの種類と特徴

Shell名 特徴
sh(Bourne Shell) 古典的なshell。POSIX標準に近い。最もシンプル
bash(Bourne-Again Shell) 最もよく使われていて、スクリプト・対話モードともにバランスが良い。POSIX標準と互換性が高い。
zsh 対話モードで非常に使いやすく、補完やテーマ,プラグインが充実していて見た目/使い勝手が良い。macOSのデフォルトshellにもなっている。
fish(Friendly Interactive Shell) 最初からから使いやすさを重視した設計。デフォルトでで多くの便利機能が備わっている。

起動モードと設定ファイル

起動モード 解説 読み込まれる設定ファイル
ログインシェル ユーザがシステムにログインした直後のShell。ターミナルアプリ起動時にログインシェルとして動くこともある。 bash: ~/.bash_profile または~/.profile
zsh: ~/.zprofile など
対話的Shell プロンプトが出てユーザからのコマンド入力を受け付けている状態。 bash ~/.bashrc
zsh: ~/.zshrc
非対話的Shell(スクリプトモード) シェルスクリプトをファイルから実行するモード。ユーザ入力を持たない。 スクリプトファイル中のシェバン(冒頭行の#! /bin/bash等)による指定、または実行する際の規定の設定ファイルだけを読み込むことが多い。

Shellを使う上で留意すべきこと

  • 最初はbashかzshを使うのが無難です。Dockerコンテナ内部でもBashがが入っていることが多いため互換性を感じやすいです。
  • 自分のホームディレクトリにある設定ファイル(.bashrc,.zshrc)を見て、中に書かれている内容を理解できるようにしておくと便利です。特にPATH変数の設定,エイリアスの設定は後々重要になってきます(のちほど記事書くかもしれないです)

仮想化技術の概要

仮想化技術(Virtualization)は、物理的なコンピュータリソース(CPU,メモリ,ストレージ,音とワーク等)を抽象化し、それを仮想的に複数の環境で使えるようにする技術のことをいいます。

仮想化の種類とハイパーバイザー(Hypervisor)

仮想化を実現する代表的な形として、「仮想マシン(VM:Virtual Machine)」方式があります。
この方式で使われるのが、 ハイパーバイザー というソフトウェアです。

仮想マシン方式では、ゲストOSは独自のカーネルを持ち、仮想的なハードウェアをハイパーバイザがエミュレートするか、あるいはハードウェア支援(Intel VT-xやAMD-Vなど)を使って高速化されることがあります。

ハイパーバイザー

ハイパーバイザーには大きく分けてType01(ベアメタル型,ネイティブ型)とType 2(ホステッド型)があります。

Type 1 ハイパーバイザー

物理ハードウェア上に直接インストールされて動作し、ゲストOS(仮想マシン上のOS)にCPU,メモリ等を割り当てます。サーバ用途やクラウド環境でよく使用されます。
ex.) Xen, VMware ESXi, Hyper-Vの一部モード

Type 2 ハイパーバイザ

ホストOSの上でアプリケーションとして動き、その上にゲストOSを仮想マシンとして動かします。デスクトップ用途や開発用途で使われることが多いです。
ex.) VirtualBox, VMware Workstation

コンテナ型仮想化との違い

Dockerのようなコンテナ技術が、「OSレベルの仮想化」の一つの形態とみなせます。以下が仮想マシンとの差異点です。

  • コンテナはホストOSのカーネルを共有します。
    →ホストOSとコンテナ間でOSレベルの機能を共通利用できるため、仮想マシン仮想マシンよりも軽量で、起動が早いです。
  • コンテナ内部には、アプリケーションが動くために必要なユーザー空間(libraries, runtime, 設定等)のみを含め、OSの完全な仮想ハードウェアやカーネルは含めません。これによりリソース使用効率がが良くなります。
  • ただし、完全な分離という点では仮想マシン方式の方が強力なことがあります。コンテナはホストカーネルを共有するため、セキュリティや互換性の面で仮想マシンより劣るケースがあります。

仮想化の利点とデメリット

メリット

  • リソース効率が良い
    →複数の仮想環境を重くならずに多数立てやすいです。ホストOSの重複が少ないためその分効率的なリソース管理が可能です。
  • 起動・停止が早い
    →コンテナはOSの起動を伴わないことが多く、構成済みイメージのロードだけで済みます。
  • 移植性が高い
    →簡単に環境を統一できます。動作がホスト環境依存になりづらく、Dockerイメージを他のホストでもほほ同様に動かすことができます。

デメリット

  • セキュリティ上の隔離性が仮想マシンより弱い可能性があります。
  • 特定アプリケーションやOSのカーネルの挙動がホストのカーネルに依存するため、完全なOSの互換性が必要なケースでは仮想マシンが必要です。
  • リソース制限,ネットワーク,ファイルシステム等でホストとの違いを理解し調整をすることが必要になります。

終わりに

Part1は一旦以上にします!Part2の記事もただいま作成中なので今しばらくお待ち下さい!次回からはDockerの基本概念をまとめていきます。

Next Page :

更新履歴

2025.09.21 : 記事初回掲載

Discussion