2026年1月12日月曜日

Linux とネットワークの基礎から学ぶ Docker 入門 - - についての解説

Linux とネットワークの基礎から学ぶ Docker 入門

学習内容

  • Linux での Web アプリケーションの環境構築の基礎
  • Docker での環境構築で前提となるネットワークの基礎知識
  • API を使った Web アプリケーションの仕組み
  • Docker の仕組みの基礎知識
  • Docker で開発環境を作るための基礎知識

このコースの内容:

  • 5時間のオンデマンドビデオ
  • 3個の記事
  • 28個のダウンロード可能なリソース
  • モバイルとPCからアクセス
  • 字幕
  • 修了証明書
 

コースの内容

セクションの数: 8 • レクチャーの数: 55 • 総時間: 5時間6分
  • このコースについて5:05
  • 受講ガイド1:30
  • このコースで使用する環境について1:30
  • GCP の登録と、料金について2:15
  • Linux とは1:51
  • (追記)GCP で使用する OS について0:41
  • GCP で Linux の仮想マシン (GCE) を起動する4:26
  • SSH 接続してHello World2:24
  • ファイル操作の基本的なコマンドの練習3:06
  • コマンドの実行と PATH の基本6:39
  • Web サーバを構築してみる6:24
  • 自作の HTML をブラウザで表示7:06
  • プロセスの基本4:16
  • Linux の起動の流れと init プロセス4:20
  • nginx を手動で実行してみる6:03
  • ネットワークの仕組みの概要2:54
  • Echo プログラムを実装して通信してみる11:36
  • 通信で登場する IP アドレス・ポート番号・メッセージとは10:32
  • curl と telnet で Web サーバと通信してみる5:21
  • TCP/IP モデルとは2:37
  • このセクションで作るアプリケーションの説明5:11
  • (追記)GCP で使用する OS について0:40
  • サーバの準備と HTML の実装9:31
  • Ruby (Sinatra) の Hello World5:37
  • nginx のリバースプロキシ設定4:42
  • フロントエンド (JavaScript) とバックエンド (Sinatra) の疎通7:57
  • タスク一覧の取得処理を実装8:12
  • タスクの登録処理を実装9:21
  • JavaScript の改善2:32
  • MySQL のインストールとテーブルの作成8:28
  • Sinatra で MySQL とやりとり14:08
  • このセクションのまとめ5:10
  • Docker の概要とメリット6:53
  • Docker の仕組みと構成要素4:55
  • 構築する環境の説明2:21
  • Docker のインストール4:09
  • Hello World5:27
  • docker commit によるイメージの作成5:05
  • Dockerfile によるイメージの作成3:24
  • コンテナのライフサイクルの整理1:39
  • ボリュームによるファイルの共有4:54
  • Sinatra の開発環境の作成11:42
  • Sinatra にアクセスするためのポートの設定10:21
  • Sinatra のホットリロードの設定4:49
  • MySQL のコンテナの構築6:19
  • MySQL のコンテナ起動時に SQL を実行6:57
  • Sinatra のコンテナと MySQL のコンテナの疎通8:32
  • MySQL の文字コードの設定8:59
  • Docker Compose の導入12:37
  • Docker Compose でイメージのビルドも行う9:28
  • nginx のコンテナの構築4:40
  • nginx のコンテナのリバースプロキシ設定6:34
  • このセクションのまとめ2:20
  • さらにステップアップするには1:29
  • ボーナスレクチャー0:54

要件

  • 何らかのプログラミング言語で Web アプリケーションを作ったことがある
  • 絶対パス・相対パス程度のコンピュータの基礎知識がある
  • ターミナルで ls、cd などの基本的なコマンドを実行したことがある
  • Vim や nano など、ターミナルで使用可能なエディタを使うことができる
  • Google Cloud (GCP) に登録して使用することができる (他の手段で同様の Linux 環境をご用意いただいても構いません)
  • Docker をインストール可能な PC を所有している

解説

Docker は軽量かつ再現性の高い環境構築の手段として優れており、開発環境・本番環境ともに Docker を使う機会が多くなっています。 プログラミングを学んだ方がステップアップとして Docker を学びたいというケースも非常に多いです。 しかし、Docker を勉強しようとして突き当たる大きな壁が、Linux とネットワークの知識不足です。   ーーーーー     この内容のそれぞれについて、実行コマンドの具体例や業界話を交えながら解説してください。
 

このコース内容について、実際の現場で使われるコマンドや業界の実情を交えながら解説します。

📚 Linux環境構築の基礎(実践コマンド例)

GCPインスタンス起動後によく使うコマンド:

bash
# SSH接続(業界では鍵認証が標準)
ssh -i ~/.ssh/your_key.pem user@xxx.xxx.xxx.xxx

# サーバの状態確認(現場で頻繁に使用)
top
htop  # より視覚的に確認(インストールが必要)
free -h  # メモリ使用量
df -h    # ディスク使用量

# ファイル操作(実務での使い方)
find /var/log -name "*.log" -mtime -7  # 1週間以内のログファイルを探す
grep -r "ERROR" /var/log/  # エラーログを検索
tail -f /var/log/nginx/access.log  # リアルタイムでログ監視

業界話: 実際の現場では、tmuxscreenを使ってSSHセッションを維持することが多いです。ネットワークが切れても作業を継続できます。

🌐 ネットワーク基礎(具体例)

ネットワーク診断でよく使うコマンド:

bash
# ポート開放確認(セキュリティチェックで必須)
sudo netstat -tulpn | grep :80
# または(最近はssコマンドが推奨)
ss -tulpn

# 通信経路の確認
traceroute google.com
# Linuxでは(macOSと異なる)
tracepath google.com

# DNS解決の確認
dig google.com
nslookup google.com

# ファイアウォール設定(Ubuntu/Debian)
sudo ufw status
sudo ufw allow 22/tcp  # SSH開放

現場での実例: クラウド環境ではセキュリティグループやファイアウォールルールの設定忘れがよくあるトラブル原因です。「アプリケーションは動いているのに外部からアクセスできない」→ まずポート開放を確認します。

🐳 Docker実践コマンド集

開発者必須のDockerコマンド:

bash
# 開発中によく使うコマンド
docker ps -a  # 全コンテナ表示(-aで停止中も)
docker logs -f container_name  # ログを追尾
docker exec -it container_name bash  # 実行中のコンテナに入る

# イメージ管理
docker images
docker system df  # Dockerのディスク使用量
docker system prune -a  # 未使用リソース一括削除(注意!)

# デバッグ用
docker inspect container_name  # コンテナの詳細情報
docker stats  # リソース使用状況をリアルタイム表示

Dockerfileのベストプラクティス:

dockerfile
# マルチステージビルド(業界標準)
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node  # root以外で実行(セキュリティ向上)
EXPOSE 3000
CMD ["node", "server.js"]

業界の常識:

  • イメージサイズを小さくするためにalpineベースが好まれる

  • .dockerignoreファイルは必須(node_modulesなど除外)

  • 開発環境と本番環境で異なるDockerfileを使うことが多い

🔄 API連携の実際

curlコマンドでAPIテスト:

bash
# REST APIテストの基本
curl -X GET https://api.example.com/users \
  -H "Authorization: Bearer $TOKEN"

# JSONをPOST
curl -X POST https://api.example.com/tasks \
  -H "Content-Type: application/json" \
  -d '{"title": "新規タスク", "completed": false}'

# レスポンスの整形(jqがあれば)
curl -s https://api.example.com/users | jq '.[] | select(.active == true)'

現場での工夫: チームではPostmanInsomniaなどのGUIツールか、httpieコマンドを使うことも多いです。httpieはcurlより直感的です:

bash
http POST api.example.com/tasks title="タスク" completed:=false

🛠️ 開発環境構築の実例

Docker Composeで複数サービス:

yaml
# docker-compose.yml(実際のプロジェクト例)
version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: userpass
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    
  backend:
    build: ./backend
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PORT: 3306
    volumes:
      - ./backend:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    ports:
      - "8080:3000"
    
  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - backend
      - frontend

volumes:
  mysql_data:

💡 現場でよくあるトラブルと解決策

  1. 「Dockerでディスク容量不足」

bash
# 対処法
docker system prune -a --volumes
docker builder prune -a
  1. 「コンテナ間で通信できない」

bash
# ネットワーク確認
docker network ls
docker network inspect bridge
# 同じネットワークにいるか確認
  1. 「開発環境と本番環境で挙動が違う」 → Docker Composeのoverride機能を活用:

yaml
# docker-compose.override.yml(開発用)
services:
  backend:
    volumes:
      - ./backend:/app  # ホットリロード用
    environment:
      NODE_ENV: development

🚀 次のステップとして学ぶべきこと

  1. Kubernetes基礎

bash
# Minikubeでローカル環境構築
minikube start
kubectl get pods
  1. CI/CDパイプライン

    • GitHub Actions

    • GitLab CI

    • CircleCI

  2. インフラストラクチャ・アズ・コード

    • Terraform(GCP/AWS構築自動化)

    • Ansible(構成管理)

業界のトレンド: 現在は「GitOps」が主流。インフラ設定もGitで管理し、プルリクエストベースで変更します。ArgoCDやFluxなどのツールが使われています。

このコースはまさに現場で必要なスキルを網羅しています。特に「Linux + ネットワーク + Docker」の組み合わせは、クラウド時代の開発者には必須の知識です。実際のプロジェクトでは、これらの知識を組み合わせて、再現性の高い開発環境を構築することが求められます。

このDockerとLinuxの学習コースについて、実務的な視点で詳しく解説していきますね。

Linuxの基礎とWebアプリケーション環境構築

Linux環境の準備 実務では、GCPだけでなくAWS EC2やさくらのVPSなども使われます。SSH接続は基本中の基本で、実際のコマンドはこんな感じです:

bash
# SSH接続
ssh user@192.168.1.100

# よく使うファイル操作
ls -la  # 隠しファイルも含めて詳細表示
cd /var/www/html  # Webサーバのドキュメントルートへ移動
pwd  # 現在のディレクトリを確認
mkdir -p project/src  # 親ディレクトリも含めて作成

Webサーバの構築 nginxは現代のWeb開発で最も使われるWebサーバの一つです。Apacheから移行する企業も多いですね。

bash
# nginxのインストール(Ubuntu/Debian)
sudo apt update
sudo apt install nginx

# nginxの起動・停止・再起動
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 設定ファイルの確認
sudo nginx -t  # 文法チェック

プロセス管理の実務 システム管理者なら必須のスキルです:

bash
# プロセスの確認
ps aux | grep nginx  # nginxのプロセスを検索
top  # リアルタイムでプロセス監視
htop  # topの改良版(インストール必要)

# プロセスの終了
kill -9 12345  # PID 12345を強制終了
pkill nginx  # nginxプロセスを全て終了

ネットワークの基礎知識

IPアドレスとポート番号 実務では、開発環境はlocalhost:3000、本番はexample.com:443(HTTPS)のような構成が一般的です。

bash
# ネットワーク状態の確認
netstat -tuln  # 待ち受けているポートを表示
ss -tuln  # netstatの新しい版
lsof -i :3000  # ポート3000を使用しているプロセス確認

# 通信テスト
curl http://localhost:8080  # HTTPリクエスト送信
telnet localhost 80  # 低レベルな通信テスト
ping google.com  # 疎通確認

実際のEchoサーバー例(Python)

python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8888))
s.listen(1)
while True:
    conn, addr = s.accept()
    data = conn.recv(1024)
    conn.send(data)  # 受信したデータをそのまま返す
    conn.close()

API開発の実践(Ruby Sinatra)

実際の開発現場では SinatraはRuby on Railsより軽量で、小規模APIやマイクロサービスに最適です。

ruby
# app.rb
require 'sinatra'
require 'json'
require 'mysql2'

# CORS設定(フロントエンドとの疎通に必須)
before do
  headers 'Access-Control-Allow-Origin' => '*'
end

# タスク一覧取得
get '/api/tasks' do
  client = Mysql2::Client.new(
    host: ENV['DB_HOST'] || 'localhost',
    username: 'root',
    database: 'taskapp'
  )
  tasks = client.query('SELECT * FROM tasks')
  content_type :json
  tasks.to_a.to_json
end

# タスク登録
post '/api/tasks' do
  data = JSON.parse(request.body.read)
  client = Mysql2::Client.new(...)
  client.query("INSERT INTO tasks (title) VALUES ('#{data['title']}')")
  status 201
end

nginxのリバースプロキシ設定 実務では、nginxがフロントエンド(ポート80/443)を受け付け、バックエンド(ポート3000など)に転送する構成が標準です。

nginx
# /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name example.com;

    # 静的ファイル
    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }

    # APIへのプロキシ
    location /api/ {
        proxy_pass http://localhost:4567;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

MySQLとの連携

データベース環境構築

bash
# MySQLのインストール
sudo apt install mysql-server

# セキュアインストール(本番環境では必須)
sudo mysql_secure_installation

# MySQLへのログイン
mysql -u root -p

# データベースとテーブル作成
CREATE DATABASE taskapp CHARACTER SET utf8mb4;
USE taskapp;
CREATE TABLE tasks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    completed BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

業界でのベストプラクティス

  • 本番環境では、アプリケーションユーザーとrootを分ける
  • パスワードは環境変数で管理(.envファイル)
  • マイグレーションツールを使う(RailsならActiveRecord、PythonならAlembic)

Dockerによる環境構築

Dockerの基本コマンド

bash
# イメージ操作
docker images  # イメージ一覧
docker pull nginx:latest  # イメージのダウンロード
docker build -t myapp:1.0 .  # Dockerfileからビルド
docker rmi image_id  # イメージ削除

# コンテナ操作
docker ps  # 実行中のコンテナ一覧
docker ps -a  # 全てのコンテナ一覧
docker run -d -p 80:80 nginx  # デタッチモードで起動
docker exec -it container_name bash  # コンテナ内でコマンド実行
docker logs -f container_name  # ログをリアルタイム表示
docker stop container_name  # 停止
docker rm container_name  # 削除

実践的なDockerfile例(Sinatra)

dockerfile
FROM ruby:3.2

WORKDIR /app

# 依存関係のインストール
COPY Gemfile Gemfile.lock ./
RUN bundle install

# アプリケーションコードのコピー
COPY . .

# ホットリロード用の設定
ENV RACK_ENV=development

# ポート公開
EXPOSE 4567

# 起動コマンド
CMD ["ruby", "app.rb", "-o", "0.0.0.0"]

ボリュームマウントの実務的な使い方

bash
# 開発時はソースコードをマウント(ホットリロード可能)
docker run -v $(pwd):/app -p 4567:4567 myapp

# データベースのデータ永続化
docker run -v mysql_data:/var/lib/mysql mysql:8.0

Docker Composeの実践

実務で使われる構成

yaml
# docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: .
    volumes:
      - .:/app  # ホットリロード用
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASS=password
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=taskapp
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

volumes:
  mysql_data:

Docker Composeコマンド

bash
# 全サービス起動
docker-compose up -d

# ログ確認
docker-compose logs -f app

# 特定サービスの再起動
docker-compose restart app

# 全て停止・削除
docker-compose down

# ボリュームも含めて削除
docker-compose down -v

# イメージの再ビルド
docker-compose build --no-cache

業界での実践的なTips

開発環境と本番環境の違い

  • 開発: docker-compose.ymlでホットリロード有効
  • 本番: Kubernetes、ECS、Cloud Runなどのオーケストレーションツール使用
  • CI/CD: GitHub ActionsやCircleCIで自動ビルド・デプロイ

よくあるトラブルと解決法

bash
# ポートが既に使われている
sudo lsof -i :80
sudo kill -9 <PID>

# Dockerのディスク容量圧迫
docker system prune -a  # 未使用リソース削除

# コンテナが起動しない
docker logs container_name  # ログ確認
docker inspect container_name  # 詳細情報確認

この学習コースは、実務で必要なスキルがバランスよく含まれています。特にDocker Composeでのマルチコンテナ構成は、現代のマイクロサービス開発の基礎となる重要なスキルです。

0 件のコメント: