0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今更ながらDockerをちゃんと学ぶ

Last updated at Posted at 2025-11-06

目的

  • 現状から先に進むには基礎的なことを固めないといけないなと感じたため(AWSとかのクラウドの勉強とかにも...)
  • 仕事やプライベートのチーム開発ではつよつよ先輩エンジニアが作った環境やテンプレートがすでに開発前に出来上がっているため何も考えずに使用していたので理解を深めたい
  • 環境構築や技術選定は面白い部分なので自分で0からやれるようにしたい

目標

  • 仕事で使用しているようなLaravel+Vueの環境を立てられるようになりたい
  • 開発環境のバージョンアップなどの仕事を請け負えるようにしたい

Docker

Dockerは、Docker社が開発しているコンテナ型の仮想環境を作成・配布・実行するためのプラットフォームです。
ミドルウェアのインストールや各種環境設定をコード化して管理することができ、コード化されたファイルを共有することでどこでも誰でも同じ環境が作れます。
また、Dockerイメージを基に複数コンテナを簡単に起動してクラスタ構成を構築でき、オーケストレーションツール(KubernetesやDocker Swarmなど)を使えば運用も容易になります。

Dockerコンテナと仮想マシンの違い

・仮想マシンは物理PCを丸ごと作るイメージ
・Dockerはアプリだけを独立させて動かすイメージ
コンテナはゲストOSをもたないので軽量かつリソース効率がよく起動も高速

仮想マシン

1台の物理マシンの上に複数の別のパソコンを仮想的に作る技術

  • ライブラリ/ミドルウェア
    • アプリが動くための部品(PHP,Apache,Node.jsなど)
  • ゲストOS
    • 1つの仮想マシンが丸ごと持っているOS(Ubuntu,CentOSなど)
  • Hypervisor
    • 仮想マシンを管理・実行するソフト(VMware,VirtualBoxなど)
  • ホストOS/物理マシン
    • 実際に動いているパソコンのOSとハードウェア

Dockerコンテナ

1台の物理マシンの上で、複数のアプリケーション実行環境(=コンテナ)を独立して動かす技術

  • ライブラリ/ミドルウェア
    • アプリごとに必要な部分だけを含む(PHP,Apache,Node.jsなど)
  • Docker Engine
    • コンテナを動かすためのエンジン(=Docker)
  • ホストOS/物理マシン
    • 実際に動いているパソコンのOSとハードウェア

Docker.png

ハンズオン

簡単なwebサーバーを作ってファイルの役割や仕組みを理解しよう的な...

ファイル構成

プロジェクトディレクトリ/
│
├─ docker-compose.yml          # 全てのコンテナ(web・db)をまとめて起動・停止する設定ファイル
├─ Makefile                    # Dockerコマンドを短く使うためのコマンド集(例: make up, make down)
├─ .dockerignore               # Dockerビルド時に無視するファイルを指定(例: .git, node_modules など)
├─ web/                        # Webサーバー関連の設定ディレクトリ(Apache + PHP)
│   ├─ Dockerfile              # Webコンテナの設定ファイル(PHPやApacheのセットアップ内容を定義)
│   └─ html/                   # Webアプリケーションのソースコードを格納
│       └─ index.php           # ブラウザで最初に表示されるPHPファイル
└─ db/                         # データベース関連の設定ディレクトリ(MySQLなど)
    ├─ my.cnf                  # 文字コードを共通化
    ├─ Dockerfile              # DBコンテナの設定ファイル
    └─ init
        └─ init.sql                # 初期データを登録したい場合に使用するSQLファイル(Seeder)

メインファイル説明的な

  • docker-compose.yml
    • 複数のコンテナをまとめて管理・起動・停止するための構成を定義するファイル
      • services
        • 実際に起動するコンテナ群を定義するブロック
        • services下に置くコンテナ名はなんでもいい?!
          • コンテナ間の通信のホスト名なのでappやdbにこだわらなくてもいい
            • でも結局管理的にも固定名になるよねっていう
      • build
        • 独自のDockerfileからイメージをビルドする設定
      • image
        • 既存のDockerイメージを使う場合に指定
      • ports
        • ホストのコンテナのポート番号
      • volumes
        • ローカルのフォルダやファイルをコンテナにマウント(共有)する設定
      • environment
        • 環境変数の設定
        • DBのユーザー名やパスワードを定義
      • depends_on
        • 起動順序を指定
      • volumes
        • コンテナ削除時にも消えないデータ永続化領域の宣言
  • Dockerfile
    • コンテナの定義ファイル
    • Dockerfileを元にDockerイメージがビルドされそれを実行したもの = コンテナ
      • FROM
        • どのベースイメージを使うかの指定
      • RUN
        • コンテナ作成時に実行するコマンド
          • ライブラリのインストール等
      • WORKDIR
        • 作業ディレクトリを設定
      • COPY
        • ホスト上のファイルをコンテナ内にコピー
      • CMD
        • コンテナ起動時に実行されるデフォルトのコマンド
      • EXPOSE
        • コンテナが待ち受けるポート番号を指定
        • composeのportsと連携
  • Makefile
    • ターミナルでのコマンド操作を短縮・自動化するためのファイル
    • Dockerとは別らしい?
  • .dockerignore
    • Dockerfileビルド時に無視したいファイル・フォルダを指定
    • .gitignoreと同じような感じ

適当に書いたファイル群

dockder-compose.yml
services:
  web:
    build:
      context: ./web        # Dockerfile が存在するビルドコンテキストのパス
      dockerfile: Dockerfile  # 使用する Dockerfile の名前
    container_name: apache  # 作成されるコンテナの名前
    ports:
      - "8080:80"           # ホストの8080番ポートをコンテナの80番ポートにマッピング
    volumes:
      - ./web/html:/var/www/html  # ホストの ./web/html をコンテナの /var/www/html にマウント
    depends_on:
      - db                  # web コンテナは db コンテナが起動してから開始

  db:
    build:
      context: ./db         # Dockerfile が存在するビルドコンテキストのパス
      dockerfile: Dockerfile  # 使用する Dockerfile の名前
    container_name: mysql   # 作成されるコンテナの名前
    environment:
      MYSQL_ROOT_PASSWORD: root   # MySQL root ユーザーのパスワード
      MYSQL_DATABASE: db          # 初期作成されるデータベース名
      MYSQL_USER: user            # MySQL に作成する追加ユーザー
      MYSQL_PASSWORD: password    # 追加ユーザーのパスワード
    volumes:
      - db_data:/var/lib/mysql    # データ永続化用ボリューム

volumes:
  db_data:                      # MySQL データを永続化するための Docker ボリューム
web/Dockerfile
# ベースイメージ(公式のPHP+Apache)
FROM php:8.2-apache

# MySQL接続用のPDO拡張をインストール
RUN docker-php-ext-install mysqli pdo pdo_mysql

# 作業ディレクトリを設定
WORKDIR /var/www/html

# アプリをコピー(composeのvolumesでもマウントされるが、初期ビルド時用)
COPY ./html /var/www/html

# Apacheをフォアグラウンドで実行
CMD ["apache2-foreground"]
db/Dockerfile
# ベースイメージ
FROM mysql:8.0

# MySQL設定ファイルを追加(utf8mb4対応)
COPY ./my.cnf /etc/mysql/conf.d/my.cnf

# SQL初期化ファイルを追加(コンテナ初期化時に実行される)
COPY ./init /docker-entrypoint-initdb.d
my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4
index.php
<?php

$host = 'db';        // docker-compose.yml の service 名
$user = 'user';      // MYSQL_USER
$pass = 'password';      // MYSQL_PASSWORD
$dbname = 'db';  // MYSQL_DATABASE

// 接続
$conn = new mysqli($host, $user, $pass, $dbname);

// 接続エラー処理
if ($conn->connect_error) {
    die("接続失敗: " . $conn->connect_error);
}

// データ取得クエリ
$sql = "SELECT * FROM users";
$result = $conn->query($sql);

// 結果を表示
if ($result->num_rows > 0) {
    echo "<h2>✅ 登録ユーザー一覧</h2>";
    echo "<ul>";
    while ($row = $result->fetch_assoc()) {
        echo "<li>ID: {$row['id']} / 名前: {$row['name']} / メール: {$row['email']}</li>";
    }
    echo "</ul>";
} else {
    echo "ユーザーが登録されていません。";
}

// 接続終了
$conn->close();

?>
init.sql
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100)
);

INSERT INTO users (name, email) VALUES
('ユーザー', 'user@example.com');
Makefile
# ▼ コンテナを起動
up:
	docker compose up -d

# ▼ コンテナを起動・ビルド
up-b:
	docker compose up -d --build

# ▼ コンテナを停止・削除
down:
	docker compose down

# ▼ コンテナを停止・削除(ボリュームも削除)
down-v:
	docker compose down -v

実行結果

makeコマンドを打てばコンテナが立ち上がるはず

make up-b

無事に表示された(文字化け直すの時間かかった)
スクリーンショット 2025-11-06 113336.png

おわりに

  • なんとなーく使っていたDockerがなんとなーくわかったような気がした
  • 以外にも知らない事実が眠っていた
    • service下のコンテナ名なんでもいいとか
    • Dockerfile分離して管理できるとか
  • アプリによってconfigやpackage等があるのでその辺の知識も付けたくなった
  • コンテナネットワークについてもそのうち追記します
  • ちゃんとした環境の構築は別の記事でやります
  • 激浅知識で書いているので間違っているところがあったらすみません
    • (どうせ誰も見てないやろの精神)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?