【完全版】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 ファイル編集
コンテナ内ではvimやnanoがインストールされていないことが多いです。
# 簡易的なファイル作成・追記
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知識のポイント:
- 基本コマンド:ファイル操作、検索、テキスト処理
- 権限管理:chmod/chownでパーミッション制御
- ネットワーク:疎通確認とトラブルシューティング
- ログ解析:tail、grep、パイプの組み合わせ
- Docker内部:Namespace、cgroups、OverlayFSの概念
Linux知識があれば、Dockerのトラブルシューティングが格段に楽になります。まずは基本コマンドから始めて、実際のトラブル対応を通じてスキルを磨いていきましょう。
Discussion