🐧

【完全版】Dockerを使うエンジニアのためのLinux基礎マスター

に公開

はじめに

「Dockerは使えるけど、Linuxはよくわからない」

こんな状態で開発を続けていませんか?実はDockerはLinuxカーネルの技術を基盤としており、Linux知識がないとトラブル時に手も足も出なくなります。

この記事では、Docker利用者が「これだけは知っておくべき」Linuxの基礎知識を網羅的に解説します。

この記事の対象読者

  • Dockerは使っているがLinuxはほぼ知らない方
  • docker execでコンテナに入ったとき何をすればいいかわからない方
  • 権限エラーやネットワークトラブルで困った経験がある方

この記事で得られること

  • Linuxの基本概念とDockerとの関係性
  • 実務で使う必須コマンド
  • 権限管理・ネットワーク・ログ解析の実践スキル
  • Docker固有のLinux技術(Namespace、cgroups)の理解

1. なぜDockerエンジニアにLinux知識が必要なのか

Dockerコンテナは独立したOSではなく、ホストのLinuxカーネルを共有して動作しています。つまり、コンテナ内で実行されるコマンドは、すべてLinuxの仕組みの上で動いています。

Linux知識が必要になる場面

場面 必要なLinux知識
コンテナ内でファイル編集 基本コマンド(vim, cat, echo)
Permission deniedエラー 権限管理(chmod, chown)
ネットワーク接続できない ネットワーク設定(ip, netstat)
コンテナが重い・落ちる プロセス管理(ps, top, kill)
ログを確認したい ログ解析(tail, grep, less)
ボリュームマウントの問題 ファイルシステムの理解

2. Linuxの基本概念

2.1 カーネルとディストリビューション

カーネル:OSの核。ハードウェアとソフトウェアを仲介する

ディストリビューション:カーネル+便利なツール群のパッケージ

Dockerコンテナには必要最小限のユーザーランド(ライブラリ、コマンド等)のみが含まれており、カーネルはホストOSと共有します。仮想マシンのようにゲストOSを丸ごと含まないため、Dockerは軽量に動作します。

2.2 シェルとは

シェルは、ユーザーとLinuxカーネルの間を仲介するプログラムです。

# コンテナに入るときに使うのがシェル
docker exec -it コンテナ名 /bin/bash  # bashシェル
docker exec -it コンテナ名 /bin/sh    # shシェル(軽量イメージ向け)

Alpineなど軽量イメージではbashがインストールされておらず、BusyBoxのsh(ash)のみ利用可能な場合があります。

2.3 ファイルシステム構造

Linuxのディレクトリ構造は、Windowsと大きく異なります。

/                  # ルートディレクトリ(すべての起点)
├── bin/           # 基本コマンド(ls, cp, cat等)
├── etc/           # 設定ファイル
├── home/          # ユーザーのホームディレクトリ
├── var/           # ログ、一時ファイル
│   └── log/       # ログファイル
├── tmp/           # 一時ファイル
├── usr/           # ユーザー用プログラム
│   └── local/     # 追加インストールしたソフト
├── proc/          # プロセス情報(仮想ファイルシステム)
└── sys/           # システム情報(仮想ファイルシステム)

3. 必須コマンド20選

3.1 ファイル・ディレクトリ操作

# 現在地の確認
pwd

# ディレクトリ移動
cd /var/log        # 絶対パス
cd ..              # 親ディレクトリへ
cd ~               # ホームディレクトリへ

# ファイル一覧表示
ls                 # 基本
ls -la             # 詳細表示(権限含む)
ls -lh             # 人間が読みやすいサイズ表示

# ファイル内容表示
cat ファイル名            # 全文表示
head -n 20 ファイル名     # 先頭20行
tail -n 20 ファイル名     # 末尾20行
tail -f ファイル名        # リアルタイム監視(ログ確認に便利)

# ファイル操作
cp                  # コピー
mv                  # 移動・リネーム
rm ファイル名             # 削除
rm -rf ディレクトリ       # ディレクトリごと強制削除(注意!)
mkdir ディレクトリ名      # ディレクトリ作成
mkdir -p a/b/c            # 深い階層を一度に作成

3.2 ファイル検索・テキスト処理

# ファイル検索
find /var -name "*.log"              # 名前で検索
find . -type f -mtime -1             # 1日以内に更新されたファイル
find . -size +100M                   # 100MB以上のファイル

# テキスト検索
grep "error" ファイル名              # 文字列検索
grep -r "error" /var/log/            # 再帰的に検索
grep -i "error" ファイル名           # 大文字小文字を無視
grep -n "error" ファイル名           # 行番号表示

# パイプで組み合わせ
cat access.log | grep "404" | wc -l  # 404エラーの件数をカウント
ps aux | grep nginx                  # nginxプロセスを検索

3.3 ファイル編集

コンテナ内ではvimnanoがインストールされていないことが多いです。

# 簡易的なファイル作成・追記
echo "内容" > ファイル名      # 上書き
echo "内容" >> ファイル名     # 追記

# ヒアドキュメントで複数行書き込み
cat << EOF > config.txt
line1
line2
line3
EOF

# sedで置換(ファイルを直接編集)
sed -i 's/old/new/g' ファイル名

3.4 プロセス管理

# プロセス一覧
ps aux                    # 全プロセス
ps aux | grep nginx       # 特定プロセスを検索

# リアルタイムモニタリング
top                       # CPU/メモリ使用率
htop                      # より見やすい版(要インストール)

# プロセス終了
kill PID                  # 通常終了
kill -9 PID               # 強制終了

# バックグラウンド実行
コマンド &                # バックグラウンドで実行
nohup コマンド &          # ログアウトしても継続

3.5 ネットワーク確認

# IPアドレス確認
ip addr                   # 新しい方式
ifconfig                  # 古い方式(非推奨だが使える環境も多い)

# ポート確認
netstat -tlnp             # 開いているポート一覧
ss -tlnp                  # 新しい方式

# 疎通確認
ping ホスト名             # 接続確認
curl http://localhost     # HTTPリクエスト
wget URL                  # ファイルダウンロード

# DNS確認
nslookup ドメイン名
dig ドメイン名

3.6 システム情報

# ディスク使用量
df -h                     # ファイルシステムの使用量
du -sh ディレクトリ       # ディレクトリのサイズ
du -sh * | sort -rh       # サイズ順でソート

# メモリ確認
free -h                   # メモリ使用量

# OS情報
uname -a                  # カーネル情報
cat /etc/os-release       # ディストリビューション情報

4. 権限管理(これを知らないとDockerで詰む)

Dockerで最も頻繁に遭遇するトラブルが権限問題です。

4.1 パーミッションの読み方

$ ls -la
-rw-r--r-- 1 root root  1234 Dec 27 10:00 file.txt
drwxr-xr-x 2 user group 4096 Dec 27 10:00 directory/
-rw-r--r--
│├─┼─┼─┤
│ │ │ └── その他のユーザー(other)の権限
│ │ └──── グループ(group)の権限
│ └────── 所有者(owner)の権限
└──────── ファイル種別(-:ファイル, d:ディレクトリ)
記号 意味 数値
r 読み取り(Read) 4
w 書き込み(Write) 2
x 実行(Execute) 1
- 権限なし 0

4.2 chmod - 権限の変更

# 数値指定(よく使う)
chmod 755 script.sh       # rwxr-xr-x(実行ファイル向け)
chmod 644 config.txt      # rw-r--r--(設定ファイル向け)
chmod 777 temp/           # rwxrwxrwx(全権限、非推奨)
chmod 600 secret.key      # rw-------(秘密鍵向け)

# 記号指定
chmod +x script.sh        # 実行権限を追加
chmod u+w file.txt        # 所有者に書き込み権限を追加
chmod g-w file.txt        # グループから書き込み権限を削除
chmod o-rwx file.txt      # その他から全権限を削除

# 再帰的に変更(ディレクトリ以下すべて)
chmod -R 755 /app

4.3 chown - 所有者の変更

# 所有者の変更
chown user ファイル名

# 所有者とグループを同時に変更
chown user:group ファイル名

# 再帰的に変更
chown -R user:group /app

4.4 Dockerでよくある権限トラブルと解決策

トラブル1:ボリュームマウントしたファイルに書き込めない

# コンテナ内
$ echo "test" > /app/data/file.txt
bash: /app/data/file.txt: Permission denied

原因:ホストとコンテナでUID/GIDが異なる

解決策

# 方法1:ホスト側で権限を変更
chmod 777 ./data  # 簡易的だが非推奨

# 方法2:Dockerfileで同じUIDのユーザーを作成
RUN useradd -u 1000 appuser
USER appuser

# 方法3:docker-compose.ymlでユーザー指定
services:
  app:
    user: "1000:1000"

トラブル2:実行権限がない

$ ./script.sh
bash: ./script.sh: Permission denied

解決策

chmod +x script.sh

5. ネットワーク基礎

5.1 Dockerのネットワーク構造

5.2 コンテナ内でのネットワーク確認

# コンテナのIPアドレス確認
hostname -i

# ネットワークインターフェース確認
ip addr

# ルーティングテーブル
ip route

# 他のコンテナへの接続確認
ping コンテナ名    # Docker Composeの場合、サービス名で疎通可能

# ポートの確認
netstat -tlnp      # 開いているポート
ss -tlnp           # 同上(新しいコマンド)

# 外部への接続確認
curl -I https://google.com

5.3 よくあるネットワークトラブル

トラブル1:コンテナ間で通信できない

# 同じネットワークに所属しているか確認
docker network ls
docker network inspect ネットワーク名

解決策:同じDockerネットワークに接続する

# docker-compose.yml
services:
  app:
    networks:
      - mynet
  db:
    networks:
      - mynet

networks:
  mynet:

トラブル2:コンテナから外部に接続できない

# DNS解決の確認
nslookup google.com

# /etc/resolv.confの確認
cat /etc/resolv.conf

6. ログ解析・デバッグ

6.1 ログファイルの場所

# 一般的なログの場所
/var/log/              # システムログ全般
/var/log/syslog        # システムログ(Ubuntu)
/var/log/messages      # システムログ(CentOS)
/var/log/nginx/        # Nginxログ
/var/log/mysql/        # MySQLログ

6.2 ログ確認の基本

# リアルタイムでログを監視
tail -f /var/log/nginx/access.log

# 複数ファイルを同時監視
tail -f /var/log/nginx/*.log

# 直近100行を表示
tail -n 100 /var/log/nginx/error.log

# エラーだけ抽出
grep -i "error" /var/log/nginx/error.log

# 特定時間帯のログを抽出
grep "27/Dec/2025:10:" /var/log/nginx/access.log

# ログのページャー表示
less /var/log/nginx/access.log
# → / で検索、n で次の検索結果、q で終了

6.3 Dockerでのログ確認

# Dockerコマンドでログ確認
docker logs コンテナ名
docker logs -f コンテナ名           # リアルタイム
docker logs --tail 100 コンテナ名   # 直近100行
docker logs --since 1h コンテナ名   # 直近1時間

# docker-compose
docker-compose logs サービス名
docker-compose logs -f              # 全サービスをリアルタイム

6.4 トラブルシューティングの流れ


7. Docker特有のLinux技術

Dockerがどのように「隔離された環境」を実現しているか理解しましょう。

7.1 Namespace(名前空間)

Namespaceは、プロセスから見えるリソースを分離する技術です。

Namespace種類 分離対象 効果
PID プロセスID 各コンテナでPID 1から開始
Network ネットワーク 独自のIPアドレス、ポート
Mount ファイルシステム 独自のルートファイルシステム
UTS ホスト名 独自のホスト名
IPC プロセス間通信 独立した共有メモリ
User ユーザー/グループ コンテナ内のroot ≠ ホストのroot

7.2 cgroups(コントロールグループ)

cgroupsは、プロセスが使用できるリソースを制限するLinuxカーネルの機能です。2006年にGoogleエンジニアが開発を開始し、2008年にLinuxカーネル2.6.24にマージされました。

# Dockerでのリソース制限例
docker run -m 512m nginx           # メモリ上限512MB
docker run --cpus=0.5 nginx        # 0.5コア分のCPU時間に制限
docker run --memory-swap=1g nginx  # スワップ含めて1GB

7.3 OverlayFS(レイヤー構造)

Dockerイメージがレイヤー構造になっている仕組みです。OverlayFSはLinuxカーネルのユニオンファイルシステムで、複数のディレクトリを重ね合わせて1つのファイルシステムとして見せます。

┌─────────────────────────┐
│    コンテナレイヤー      │ ← 書き込み可能(揮発性)
├─────────────────────────┤
│    イメージレイヤー3     │ ← 読み取り専用
├─────────────────────────┤
│    イメージレイヤー2     │ ← 読み取り専用
├─────────────────────────┤
│    ベースイメージ        │ ← 読み取り専用
└─────────────────────────┘

ファイルを変更すると、コンテナレイヤーにコピーされて編集されます(Copy-on-Write)。


8. As-Is/To-Be分析

Linux学習前後でどう変わるかを整理します。

観点 As-Is(学習前) 課題 To-Be(学習後)
トラブル対応 エラーが出たら再起動 根本原因がわからない ログを見て原因特定できる
コンテナ操作 docker execで入っても何もできない コマンドを知らない 必要な情報を取得・編集できる
権限エラー chmod 777で解決 セキュリティリスク 適切な権限設定ができる
ネットワーク 繋がらないと困る 切り分けできない ping/curlで原因特定
パフォーマンス 遅いと感じるだけ 何が重いかわからない top/psでボトルネック特定

9. 学習ロードマップ

Phase 1:基本コマンド(1週間)

  • ファイル操作:ls, cd, cat, cp, mv, rm, mkdir
  • 検索:find, grep
  • 確認:pwd, which, man

Phase 2:権限管理(1週間)

  • ls -laの読み方を理解
  • chmod, chownを実践
  • Dockerボリュームの権限問題を解決できる

Phase 3:ネットワーク・プロセス(1〜2週間)

  • ip addr, ping, curl で疎通確認
  • ps, top でプロセス確認
  • netstat, ss でポート確認

Phase 4:ログ解析(1週間)

  • tail -f でリアルタイム監視
  • grep でエラー抽出
  • パイプを使った複合コマンド

Phase 5:Docker内部理解(2週間)

  • Namespace の概念理解
  • cgroups の概念理解
  • OverlayFS の仕組み理解

10. まとめ

Dockerエンジニアに必要なLinux知識のポイント:

  1. 基本コマンド:ファイル操作、検索、テキスト処理
  2. 権限管理:chmod/chownでパーミッション制御
  3. ネットワーク:疎通確認とトラブルシューティング
  4. ログ解析:tail、grep、パイプの組み合わせ
  5. Docker内部:Namespace、cgroups、OverlayFSの概念

Linux知識があれば、Dockerのトラブルシューティングが格段に楽になります。まずは基本コマンドから始めて、実際のトラブル対応を通じてスキルを磨いていきましょう。


参考資料

公式ドキュメント

技術解説記事

Discussion