目的
- 現状から先に進むには基礎的なことを固めないといけないなと感じたため(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とハードウェア
ハンズオン
簡単な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にこだわらなくてもいい
- でも結局管理的にも固定名になるよねっていう
- コンテナ間の通信のホスト名なのでappやdbにこだわらなくてもいい
- build
- 独自のDockerfileからイメージをビルドする設定
- image
- 既存のDockerイメージを使う場合に指定
- ports
- ホストのコンテナのポート番号
- volumes
- ローカルのフォルダやファイルをコンテナにマウント(共有)する設定
- environment
- 環境変数の設定
- DBのユーザー名やパスワードを定義
- depends_on
- 起動順序を指定
- volumes
- コンテナ削除時にも消えないデータ永続化領域の宣言
- services
- 複数のコンテナをまとめて管理・起動・停止するための構成を定義するファイル
- Dockerfile
- コンテナの定義ファイル
- Dockerfileを元にDockerイメージがビルドされそれを実行したもの = コンテナ
- FROM
- どのベースイメージを使うかの指定
- RUN
- コンテナ作成時に実行するコマンド
- ライブラリのインストール等
- コンテナ作成時に実行するコマンド
- WORKDIR
- 作業ディレクトリを設定
- COPY
- ホスト上のファイルをコンテナ内にコピー
- CMD
- コンテナ起動時に実行されるデフォルトのコマンド
- EXPOSE
- コンテナが待ち受けるポート番号を指定
- composeのportsと連携
- FROM
- 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
おわりに
- なんとなーく使っていたDockerがなんとなーくわかったような気がした
- 以外にも知らない事実が眠っていた
- service下のコンテナ名なんでもいいとか
- Dockerfile分離して管理できるとか
- アプリによってconfigやpackage等があるのでその辺の知識も付けたくなった
- コンテナネットワークについてもそのうち追記します
- ちゃんとした環境の構築は別の記事でやります
- 激浅知識で書いているので間違っているところがあったらすみません
- (どうせ誰も見てないやろの精神)

