<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>開発ツール（Dev Tools） ‣ てんハロ｜未経験エンジニアのIT学習ログ</title>
	<atom:link href="https://it-bokenki.com/category/dev-tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-bokenki.com</link>
	<description>Hello Worldから、今日も生きてる</description>
	<lastBuildDate>Wed, 23 Jul 2025 06:35:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://it-bokenki.com/wp-content/uploads/2025/06/cropped-ブログ　アイコン-32x32.png</url>
	<title>開発ツール（Dev Tools） ‣ てんハロ｜未経験エンジニアのIT学習ログ</title>
	<link>https://it-bokenki.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【初心者向け】現場で役立つGitHubコマンド厳選まとめ｜GUIから卒業したい初心者へ！</title>
		<link>https://it-bokenki.com/2025/07/21/github-commands/</link>
					<comments>https://it-bokenki.com/2025/07/21/github-commands/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Mon, 21 Jul 2025 13:26:49 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[GitHub]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=5034</guid>

					<description><![CDATA[<p>プロが教える、業界最前線のノウハウ【Coloso】 困ってた自分に届けたい話 「あのとき、コマンド知っていれば…！」 初めてチーム開発に参加したとき、GitHubの操作に自信がなくて、GUIでぽちぽちと安全そうなボタンを [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/21/github-commands/">【初心者向け】現場で役立つGitHubコマンド厳選まとめ｜GUIから卒業したい初心者へ！</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457VJB+C7ZCTU+5Q4A+601S1">
<img fetchpriority="high" decoding="async" border="0" width="300" height="250" alt="" src="https://www27.a8.net/svt/bgt?aid=250630247739&#038;wid=001&#038;eno=01&#038;mid=s00000026713001008000&#038;mc=1"></a>
<img decoding="async" border="0" width="1" height="1" src="https://www15.a8.net/0.gif?a8mat=457VJB+C7ZCTU+5Q4A+601S1" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457VJB+C7ZCTU+5Q4A+5YRHE">プロが教える、業界最前線のノウハウ【Coloso】</a></p>



<h2 class="wp-block-heading"><span id="toc1">困ってた自分に届けたい話</span></h2>



<p>「あのとき、コマンド知っていれば…！」</p>



<p>初めてチーム開発に参加したとき、GitHubの操作に自信がなくて、GUIでぽちぽちと安全そうなボタンを押すばかり。正直、<strong>黒い画面（CLI）ってプロっぽくてかっこいいけど、自分にはまだ早い</strong>と思ってました。</p>



<p>でも、GUIのツールがアップデートされたり、チームごとに使うツールが違ったりすると、<br>「<strong>え、どこ押せばよかったっけ？</strong>」と、毎回迷子に。</p>



<p>そのうち、</p>



<ul class="wp-block-list">
<li><strong>同じブランチ名で強引にプッシュしてコンフリクトの嵐</strong></li>



<li><strong>コミットメッセージがバラバラで履歴がぐちゃぐちゃ</strong></li>



<li><strong>リモートの変更を取り込まないまま作業を進めて大混乱</strong></li>
</ul>



<p>という、地味だけど痛いトラブルを何度も経験。</p>



<p>「<strong>コマンドで操作できていれば、もっと早く正しく対応できたのに…！</strong>」と何度も後悔しました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>この記事は、同じように困っていた方への<strong>備忘録兼シェア</strong>として書いています。</p>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">リポジトリの初期化・クローン</span></h2>



<h3 class="wp-block-heading"><span id="toc3">新しく作るとき（自分でゼロから開発を始めるとき）</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git init</code></pre></div>



<p>自分だけのポートフォリオサイトを作るときや、チームにまだ共有しない段階の個人開発を始めるときに、<strong>すでに作成したフォルダの中でこのコマンドを打つことで、そのフォルダが「Gitで履歴管理できる状態」になります</strong>。その後、GitHubに新しく作ったリモートリポジトリと紐づけるためには、次のようにします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git remote add origin https://github.com/ユーザー名/リポジトリ名.git</code></pre></div>



<p>これで、ローカルとGitHubの接続が完了します。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">他の人のリポジトリやチームのリポジトリを使いたいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git clone https://github.com/チーム/リポジトリ名.git</code></pre></div>



<p>すでにあるプロジェクトを自分のPCに持ってきたいときに使います。GitHubの「Code」ボタンからURLをコピーして、ターミナルでこのコマンドを実行すると、フォルダごと全部ダウンロードされます。履歴も含まれるので、過去の変更もすべて確認できます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">コミットと履歴管理</span></h2>



<h3 class="wp-block-heading"><span id="toc6">ファイルを追加・変更したら履歴に残すとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git add .
git commit -m &quot;ヘッダーのデザインを調整&quot;</code></pre></div>



<p>コード修正したあと、そのまま次の作業に進むのではなく、まず変更を一つの「区切り」として記録しておきたいときに使います。<br><code>git add .</code> は、全ての変更されたファイルを「記録準備OK」の状態にするコマンドです。<br>その後、<code>git commit -m "..."</code> でメッセージをつけて保存します。<br>ここでのメッセージは「何を」「なぜ」変更したのかをチームがわかるように簡潔に書きましょう。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">直前のコミットを修正したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git commit --amend</code></pre></div>



<p>「コミットしたあとにファイルの入れ忘れに気づいた」「メッセージに誤字があった」「やっぱりちょっと修正したい」——そんなときに使えるのが <code>git commit --amend</code> です。</p>



<p>このコマンドを実行すると、<strong>直前のコミットを上書きする形で修正</strong>できます。たとえば、ファイルを追加し忘れていたなら、そのファイルを <code>git add</code> でステージングしてから <code>git commit --amend</code> を実行すれば、1つのまとまったコミットにすることができます。</p>



<p>なお、<strong>すでにGitHubにpushしているコミットをamendすると履歴が変わるため注意</strong>が必要です（その場合は <code>--force</code> 付きで再pushが必要になります）。</p>



<p>ローカル作業中に「コミットやり直したい」と思ったら、まず <code>git commit --amend</code> を思い出してみてください</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc8">過去の履歴をパッと確認したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git log --oneline --graph --decorate</code></pre></div>



<p>誰がいつどんな変更をしたかを見たいときに使います。<br>長い履歴をだらだらと読むのではなく、1行ずつコンパクトに見られるので視認性がとても良いです。<br><code>--graph</code> をつけることで、どのブランチがどこから分かれて、どこで合流したかもわかりやすくなります。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc9">ブランチ操作</span></h2>



<h3 class="wp-block-heading"><span id="toc10">作業用の新しいブランチを作って、すぐに移動したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git switch -c 新しいブランチ名</code></pre></div>



<p>最近のGitでは、ブランチの切り替えや作成は <code>git checkout</code> よりも <code>git switch</code> を使うのが主流になっています。たとえば新しいブランチを作ってすぐにそのブランチに移動したいときには、<code>git switch -c feature/新しいブランチ名</code> のように書くと、一発でローカルブランチ作成・切り替えが完了します。<br>すでに作られているブランチに移動したいときは、<code>git switch ブランチ名</code> だけでOKです。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc11">今のブランチを確認したいとき・他のブランチを見たいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git branch</code></pre></div>



<p>今までに作成されたローカルブランチが一覧で表示されます。今自分がいるブランチには <code>*</code> がついています。作業の前に「今どこにいるか」を確認する習慣をつけるとミスが減ります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>異なるローカルブランチで作業していたことがあり、大変な目に何度もあっている主です。この習慣は大切です&#8230; !</p>
</div></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc12">作業が終わったブランチを削除したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git branch -d feature/完了したブランチ</code></pre></div>



<p>不要になったブランチはこまめに消すことで、ローカルがスッキリします。<br>まだマージしていないのに間違って消そうとすると警告が出ますが、どうしても削除したい場合は <code>-D</code> を使って強制削除もできます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc13">リモートリポジトリ操作</span></h2>



<h3 class="wp-block-heading"><span id="toc14">自分の作業をGitHubにアップしたいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git push origin feature/新機能名</code></pre></div>



<p>作業した内容をチームに共有したいときには、このコマンドでGitHubにアップします。<code>origin</code> はGitHub側のリポジトリ名を意味し、その後に続くのが自分のブランチ名です。もし初めてのプッシュで「上手くリンクできていない」場合は、次のように書くことで自動的に紐づけされます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git push -u origin feature/新機能名</code></pre></div>



<p>こうしておけば、次回以降は <code>git push</code> だけでOKになります。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc15">他の人の変更を自分の作業に反映させたいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git pull --rebase</code></pre></div>



<p>GitHub上で別の人が更新していた場合、自分のローカルを最新にしてから作業を再開したいときに使います。<code>--rebase</code> をつけることで、マージコミットを発生させずに履歴をキレイな状態に保てます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc16">マージ・コンフリクト解消</span></h2>



<h3 class="wp-block-heading"><span id="toc17">他のブランチの内容を今のブランチに統合したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git merge ブランチ名</code></pre></div>



<p>たとえば、現在作業している <code>feature/login-form</code> ブランチに、チームがまとめているメインの開発ブランチ（例：<code>develop</code> や <code>main</code>）の最新変更を取り込みたいときに使います。</p>



<p>この「ブランチ名」の部分には、「取り込みたい変更がある側のブランチ名」を指定します。よくある例としては <code>develop</code> や <code>main</code> ですが、会社やプロジェクトによっては <code>staging</code> や <code>release</code> など別の名前を使っていることもあります。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc18">コンフリクトが起きたとき</span></h3>



<p>ファイルの中に <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code> や <code>=======</code> が現れたら、それがコンフリクトです。<br>自分の変更と他の人の変更がぶつかってしまった状態なので、エディタで手動で「どちらを残すか」「どう融合するか」を判断します。修正したら、次のコマンドでコンフリクトが解消されたことをGitに伝えます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git add コンフリクト解消済みファイル
git commit</code></pre></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc19">トラブルシュート</span></h2>



<h3 class="wp-block-heading"><span id="toc20">直前のコミットとの差分を見たいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git diff HEAD~1 HEAD</code></pre></div>



<p>「この前のコミットから何を変えたっけ？」という場面で使います。ファイルを開かなくても、ターミナル上で変更点が確認できます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc21">昔のコミットに戻したいとき（でも履歴は壊したくない）</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git revert &lt;コミットID&gt;</code></pre></div>



<p>「やっぱりこの機能、いらなかったな…」というときに使います。<code>revert</code> を使えば、「そのコミットを取り消すための新しいコミット」を作ってくれるので、履歴はきれいなまま残ります。履歴を壊す <code>reset</code> より安全です。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc22">作業中の変更を一時的に退避したいとき</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git stash</code></pre></div>



<p>今まさにファイルを編集している途中に「緊急で別ブランチに切り替えて修正お願い！」という指示が来たとします。でもまだコミットもしていないし、今の作業内容は残しておきたい…。そんなときに便利なのがこの <code>git stash</code> コマンドです。</p>



<p>これを実行すると、作業中の変更内容を一時的に「しまっておく」ことができます。ブランチを切り替えたあと、元に戻ってから <code>git stash pop</code> を使えば、さっきまでの変更内容がちゃんと復元されます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/21/github-commands/">【初心者向け】現場で役立つGitHubコマンド厳選まとめ｜GUIから卒業したい初心者へ！</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/21/github-commands/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【初心者向け】Mailpitで開発中のメール送信を安全にテストする方法【Docker + Next.js対応】</title>
		<link>https://it-bokenki.com/2025/07/08/docker-mailpit/</link>
					<comments>https://it-bokenki.com/2025/07/08/docker-mailpit/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Tue, 08 Jul 2025 14:31:46 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4533</guid>

					<description><![CDATA[<p>IT/Webエンジニア専門の転職エージェント【ユニゾンキャリア】 困ってた自分に届けたい話 これまでずっと、メール送信のテストは自分のアドレスに送って確認していました。それでもなんとかなってはいたのですが、複数のメールア [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/08/docker-mailpit/">【初心者向け】Mailpitで開発中のメール送信を安全にテストする方法【Docker + Next.js対応】</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>Mailpit</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>Dockerのイメージのひとつだっけ？</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>開発環境でメール送信処理をテストしたい</li>



<li>GmailやSendGridの実アカウントは使いたくない</li>



<li>MailpitをDockerで簡単に立ち上げたい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS5+AF33W2+5F00+HVNAP">
<img decoding="async" border="0" width="300" height="250" alt="" src="https://www25.a8.net/svt/bgt?aid=250611125630&#038;wid=001&#038;eno=01&#038;mid=s00000025272003003000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=457GS5+AF33W2+5F00+HVNAP" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457GS5+AF33W2+5F00+HV7V6">IT/Webエンジニア専門の転職エージェント【ユニゾンキャリア】</a></p>



<h2 class="wp-block-heading"><span id="toc1">困ってた自分に届けたい話</span></h2>



<p>これまでずっと、メール送信のテストは自分のアドレスに送って確認していました。<br>それでもなんとかなってはいたのですが、<strong>複数のメールアドレスで挙動を確認したいときなど、とにかく手間がかかる…</strong>。</p>



<p>「みんなどうやってるんだろう？」と疑問に思っていたときに、たまたま見つけたのが<strong>Mailpit</strong>というツールでした。</p>



<p>最初は「送信したメールをWeb画面で見るってどういうこと？」と、正直よくわかりませんでした。<br>ですが、実際に使ってみると「こんな便利なものがあったのか！」と衝撃を受けました。</p>



<p>それ以来、<strong>開発中のメール送信テストはMailpit一択</strong>です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>この記事は、同じように困っていた方への<strong>備忘録兼シェア</strong>として書いています。</p>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">Mailpitとは？</span></h2>



<p><strong>Mailpit</strong> は、開発環境向けの「ローカルメール受信サーバー」です。<br>実際のメールサーバー（Gmailなど）を使わず、<strong>開発中のフォーム送信や通知メールがきちんと送られているかを、ブラウザ上で確認できます。</strong></p>



<p><span class="keyboard-key">メリット</span></p>



<ul class="wp-block-list">
<li>&#x2705; ローカルでメール受信ができる</li>



<li>&#x2705; ブラウザでメールの中身をすぐ確認できる（Web GUI）</li>



<li>&#x2705; SendGridや本物のメールアドレスは不要</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">DockerでMailpitを起動する手順</span></h2>



<h3 class="wp-block-heading"><span id="toc4">STEP１：docker-compose.yml の記載</span></h3>



<p>まずは、以下のように <code>docker-compose.yml</code> を記述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> mailpit:
    image: axllent/mailpit:latest
    container_name: 任意のコンテナ名
    ports:
      - "1025:1025" # SMTP受信用
      - "8025:8025" # 管理画面（GUI）</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> mailpit</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">axllent</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">mailpit</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">任意のコンテナ名</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">1025:1025</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> # </span><span style="color: #D8DEE9">SMTP受信用</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8025:8025</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> # </span><span style="color: #D8DEE9">管理画面</span><span style="color: #D8DEE9FF">（</span><span style="color: #D8DEE9">GUI</span><span style="color: #D8DEE9FF">）</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">STEP２：コンテナを起動</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker compose up -d</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">STEP３：正常にコンテナができたか確認</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker compose ps</code></pre></div>



<p>ブラウザで <code>http://localhost:8025</code> にアクセスすると、下記のMailpitの管理画面が表示されます。</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="506" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-1024x506.png" alt="" class="wp-image-4534" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-1024x506.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-300x148.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-768x379.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-1536x759.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-2048x1012.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.08.13-1320x652.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc7">nodemailer + Mailpit の実装（Next.js）</span></h2>



<h3 class="wp-block-heading"><span id="toc8">STEP１：パッケージをインストール</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># メール送信用のライブラリ
npm install nodemailer
npm install nodemailer-sendgrid
npm install @sendgrid/mail

# 入力バリデーションライブラリ
npm install zod

# nodemailer 用の TypeScript 型定義ファイル
npm install --save-dev @types/nodemailer</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc9">STEP２：APIエンドポイントを作成（/api/mail/route.ts）</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import { NextResponse } from "next/server";
import { getTransporter } from "@/lib/mailer";

export async function POST(req: Request) {
  const { email } = await req.json();
  const transporter = getTransporter();

  try {
    await transporter.sendMail({
      from: process.env.MAIL_FROM,
      to: email,
      subject: "自動返信テスト",
      text: "こちらは自動返信メールです。",
    });

    return NextResponse.json({ success: true });
  } catch (err) {
    console.error("メール送信エラー:", err);
    return NextResponse.json({ success: false }, { status: 500 });
  }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">NextResponse</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">next/server</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">getTransporter</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">@/lib/mailer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">POST</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">req</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">email</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">req</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">json</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">transporter</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">getTransporter</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">try</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">transporter</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">sendMail</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">from</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">MAIL_FROM</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">to</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">email</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">subject</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">自動返信テスト</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">text</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">こちらは自動返信メールです。</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NextResponse</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">json</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">success</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">catch</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">console</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">error</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">メール送信エラー:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NextResponse</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">json</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">success</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">status</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">500</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">STEP３：メール送信フォームを作る（components/mailer/form.tsx）</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>"use client";

import { useState } from "react";
import { z } from "zod";

const schema = z.object({
  email: z.string().email("正しいメールアドレスを入力してください"),
});

export default function MailForm() {
  const &#91;email, setEmail&#93; = useState("");
  const &#91;error, setError&#93; = useState("");
  const &#91;sent, setSent&#93; = useState(false);

  const handleSubmit = async () => {
    const result = schema.safeParse({ email });
    if (!result.success) {
      setError(result.error.errors&#91;0&#93;.message);
      return;
    }

    try {
      const res = await fetch("/api/mail", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ email }),
      });
      if (res.ok) {
        setSent(true);
        setError("");
      } else {
        setError("送信に失敗しました");
      }
    } catch (err) {
      console.error(err);
      setError("通信エラーが発生しました");
    }
  };

  return (
    &lt;div className="p-4 border rounded bg-gray-50 max-w-2xl mx-auto mt-10">
      &lt;div className="flex flex-col gap-4 mt-10">
        &lt;input
          type="email"
          placeholder="メールアドレスを入力"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
          className="p-3 border border-gray-300 rounded"
        />

        &lt;div className="text-center">
          &lt;button
            type="button"
            onClick={handleSubmit}
            className="bg-blue-600 text-white px-6 py-2 rounded"
          >
            送信
          &lt;/button>
        &lt;/div>

        {error &amp;&amp; &lt;p className="text-red-600 text-sm text-center">{error}&lt;/p>}
        {sent &amp;&amp; (
          &lt;p className="text-green-600 text-sm text-center">
            自動返信を送信しました
          &lt;/p>
        )}
      &lt;/div>
    &lt;/div>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">use client</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">useState</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">react</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">z</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">zod</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">schema</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">object</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">email</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">string</span><span style="color: #D8DEE9FF">()</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">email</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">正しいメールアドレスを入力してください</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MailForm</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #D8DEE9">email</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">setEmail</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">useState</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #D8DEE9">error</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">setError</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">useState</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #D8DEE9">sent</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">setSent</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">useState</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">false</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">handleSubmit</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">result</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">schema</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">safeParse</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">email</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #D8DEE9">result</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">success</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">setError</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">result</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">error</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">errors</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">message</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">return;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">try</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">res</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">fetch</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/api/mail</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">method</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">POST</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">headers</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Content-Type</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">application/json</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">body</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">JSON</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">stringify</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">email</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">res</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ok</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">setSent</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">true</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">setError</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">setError</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">送信に失敗しました</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">catch</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">console</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">error</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">setError</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">通信エラーが発生しました</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;div</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">p-4 border rounded bg-gray-50 max-w-2xl mx-auto mt-10</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;div</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">flex flex-col gap-4 mt-10</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">&lt;input</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">type</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">email</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">placeholder</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">メールアドレスを入力</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">value</span><span style="color: #81A1C1">={</span><span style="color: #D8DEE9">email</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">onChange</span><span style="color: #81A1C1">={</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">setEmail</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">target</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">value</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">p-3 border border-gray-300 rounded</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">/&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">&lt;div</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">text-center</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">&lt;button</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">type</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">button</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">onClick</span><span style="color: #81A1C1">={</span><span style="color: #D8DEE9">handleSubmit</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">bg-blue-600 text-white px-6 py-2 rounded</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            送信</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">&lt;/button&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">&lt;/div&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">error</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;p</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">text-red-600 text-sm text-center</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;{</span><span style="color: #D8DEE9">error</span><span style="color: #81A1C1">}&lt;/p&gt;}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">sent</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">&lt;p</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">className</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">text-green-600 text-sm text-center</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            自動返信を送信しました</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #81A1C1">&lt;/p&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        )</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;/div&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;/div&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  )</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc11">STEP４：nodemailerの設定（lib/mailer.ts）</span></h3>



<p>開発／本番 切り替え対応の内容を記載します。</p>



<p>開発環境と本番環境でメール送信先や処理を切り替える処理は、<strong><code>lib/</code> 配下の共通関数モジュールにまとめておくのが一般的</strong>のようです。</p>



<p>こうすることで、環境ごとの処理分岐を1か所に集約でき、APIエンドポイントやフロントエンド側からは毎回同じ関数を呼び出すだけで済むようになります。<br>結果として、<strong>コードが見やすくなり、保守性も高まります。</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/lib/mailer.tsx

import { createTransport } from "nodemailer";
// @ts-expect-error 型定義がないため無視
import sgTransport from "nodemailer-sendgrid";

// 環境切り替え
export const getTransporter = () => {
  if (process.env.NODE_ENV === "production") {
    // 本番：例 SendGrid を使用
    return createTransport(
      sgTransport({
        apiKey: process.env.SENDGRID_API_KEY!,
      })
    );
  } else {
    // 開発：Mailpit を使用
    return createTransport({
      host: process.env.MAIL_HOST,
      port: Number(process.env.MAIL_PORT),
      secure: process.env.MAIL_SECURE === "true",
    });
  }
};
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// src/lib/mailer.tsx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">createTransport</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">nodemailer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #616E88">// @ts-expect-error 型定義がないため無視</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">sgTransport</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">nodemailer-sendgrid</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// 環境切り替え</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">getTransporter</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">NODE_ENV</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">===</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">production</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 本番：例 SendGrid を使用</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">createTransport</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">sgTransport</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">apiKey</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">SENDGRID_API_KEY</span><span style="color: #81A1C1">!</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    )</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 開発：Mailpit を使用</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">createTransport</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">MAIL_HOST</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Number</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">MAIL_PORT</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">secure</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">MAIL_SECURE</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">===</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">true</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc12">STEP５：環境変数設定</span></h3>



<p><strong><span class="keyboard-key">.env.local</span></strong> ：開発用.envのこと。mailpitの環境変数設定を記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># mailpit設定
MAIL_HOST=
MAIL_PORT=
MAIL_SECURE=</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key"><strong>.env.production</strong></span> ：本番環境用.envのこと。今回はSendGridの環境変数設定を記載しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># SendGrid設定
SENDGRID_API_KEY=</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key"><strong>.env</strong></span> ：開発・本番で共通使用.envのこと。今回は、送信者のメールアドレスが該当します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>FROM_EMAIL=</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc13">STEP６：実行</span></h3>



<p><code>npm run dev</code> で開発環境のNext.jsを起動</p>



<p><code>http://localhost:3000</code> からフォームにアクセス</p>



<p>下記のinputタグにメールアドレスを入力する</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="391" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-1024x391.png" alt="" class="wp-image-4535" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-1024x391.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-300x114.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-768x293.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-1536x586.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10-1320x504.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.09.10.png 1646w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc14">STEP７：実行結果</span></h3>



<p>メールを送信すると <code>http://localhost:8025</code> のMailpitにメールが表示される！</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="265" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45-1024x265.png" alt="" class="wp-image-4536" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45-1024x265.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45-300x78.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45-768x199.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45-1320x342.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-04-19.11.45.png 1509w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc15">まとめ｜Mailpitは開発中のメール送信テストに最適</span></h2>



<ul class="wp-block-list">
<li>開発中にメールを<strong>安全・手軽に確認したい</strong>なら、Mailpitは超便利</li>



<li>Dockerだけで立ち上がるから<strong>環境構築も簡単</strong></li>



<li>Next.js + nodemailerでも問題なく動作確認が可能</li>
</ul>



<p><strong>Dockerもっと勉強したい！</strong>と思われた方は、こちらの記事もおすすめです。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-minio/" title="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMinIOを構築し、Next.jsやNode.jsからS3互換のローカルストレージにファイルを保存・取得する方法を、初心者向けに手順付きでわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/08/docker-mailpit/">【初心者向け】Mailpitで開発中のメール送信を安全にテストする方法【Docker + Next.js対応】</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/08/docker-mailpit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker初心者必見｜基本コマンド一覧</title>
		<link>https://it-bokenki.com/2025/07/04/docker-command/</link>
					<comments>https://it-bokenki.com/2025/07/04/docker-command/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 17:29:20 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4257</guid>

					<description><![CDATA[<p>未経験からエンジニア転職を目指すなら&#x1f449; テックゲート転職 をチェック！ イメージ関連 イメージとは？ アプリを動かすために必要な「環境セット」です。 OS・ツール・設定がまるごと1つになっていて、このイメ [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/04/docker-command/">Docker初心者必見｜基本コマンド一覧</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>Dockerコマンド</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>コマンドって苦手なんだよな…</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>Dockerコマンド知りたい</li>



<li>現場でよく使うものだけ知りたい</li>



<li>チートシートとして見ておきたい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVV0H">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www25.a8.net/svt/bgt?aid=250611124856&#038;wid=001&#038;eno=01&#038;mid=s00000025047003004000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=457GS4+E5N2LU+5D9I+HVV0H" alt=""></div>



<p class="has-text-align-center">未経験からエンジニア転職を目指すなら<br>&#x1f449; <a href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVFKY">テックゲート転職</a> をチェック！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together">
<a href="https://it-bokenki.com/2025/07/04/docker/" title="【Docker環境構築】.envとdocker-compose.ymlはどこに置く？おすすめの配置と起動方法まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-20-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-20-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-20-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-20-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-20-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Docker環境構築】.envとdocker-compose.ymlはどこに置く？おすすめの配置と起動方法まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">Docker環境構築で迷いがちな.envファイルとdocker-compose.ymlの正しい配置場所と起動方法を初心者向けに解説。保守性や再利用性の観点からおすすめ構成や.envの読み込み方法、v2で注意すべきポイントも紹介！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<h2 class="wp-block-heading"><span id="toc1">イメージ関連</span></h2>



<h3 class="wp-block-heading"><span id="toc2">イメージとは？</span></h3>



<p><strong>アプリを動かすために必要な「環境セット」です。</strong></p>



<p>OS・ツール・設定がまるごと1つになっていて、<br>この<strong>イメージを元にアプリを動かす＝コンテナを作る</strong>という流れです。</p>



<p><span class="keyboard-key">&#x1f449; 例えば… </span></p>



<ul class="wp-block-list">
<li><strong><code>mysql</code><strong><code>:8.0</code> </strong> </strong>→ MySQLが動くイメージ</li>



<li><code><strong>node:20</strong></code> → Node.js 20 が使えるイメージ</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc3">イメージ名は REPOSITORY:TAG の形で覚えよう！</span></h3>



<p>イメージ名 ＝ <code>REPOSITORY:TAG</code></p>



<ul class="wp-block-list">
<li><code>REPOSITORY</code> → イメージの名前（例：<code>mysql</code>, <code>node</code>, <code>minio/minio</code>）</li>



<li><code>TAG</code> → バージョンや種類（例：<code>8.0</code>, <code>18</code>, <code>latest</code>）</li>
</ul>



<p>この2つをセットで「イメージ名」と呼びます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">イメージ関連のコマンド</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>説明</th></tr></thead><tbody><tr><td><code>docker images</code></td><td>イメージの一覧を表示</td></tr><tr><td><code>docker pull イメージ名</code></td><td>イメージをネットからダウンロードする</td></tr><tr><td><code>docker build -t イメージ名 .</code></td><td>自分で作った設定からイメージを作る</td></tr><tr><td><code>docker rmi イメージID</code></td><td>イメージを削除する</td></tr></tbody></table></figure>



<p><code>イメージID</code> はイメージ一覧で確認できます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">コンテナ関連</span></h2>



<h3 class="wp-block-heading"><span id="toc6">コンテナとは？</span></h3>



<p>イメージから作られた「<strong>実際に動いているアプリ本体</strong>」です。</p>



<p>イメージはあくまで動かす前の準備セット、<strong>コンテナはそれを実行して動いている状態</strong>です。</p>



<p><span class="keyboard-key">&#x1f449; 例えば… </span></p>



<ul class="wp-block-list">
<li><strong><code>mysql:8.0</code> </strong>→ イメージ名</li>



<li><code><strong>my-mysql</strong></code> → コンテナ名</li>
</ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker run --name my-mysql mysql:8.0</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">コンテナ関連のコマンド</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>かんたんな説明</th></tr></thead><tbody><tr><td><code>docker ps -a</code></td><td>起動・停止した全コンテナの一覧を見る</td></tr><tr><td><code>docker start コンテナ名</code></td><td>止まっているコンテナを起動する</td></tr><tr><td><code>docker restart コンテナ名</code></td><td>コンテナを再起動する</td></tr><tr><td><code>docker exec -it コンテナ名 bash</code></td><td>コンテナの中に入って操作する</td></tr><tr><td><code>docker logs コンテナ名</code></td><td>コンテナの動作ログを確認する</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">クリーンアップ関連</span></h2>



<h3 class="wp-block-heading"><span id="toc9">クリーンアップとは？</span></h3>



<p><strong>不要になったイメージやコンテナなどを削除して、環境をすっきりさせるためのコマンドです。</strong></p>



<p>Dockerを使っていると、不要なファイルが溜まっていきます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">クリーンアップ関連のコマンド</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>説明</th></tr></thead><tbody><tr><td><code>docker system prune</code></td><td>使っていないデータをまとめて削除（&#x26a0;注意）</td></tr><tr><td><code>docker volume rm ボリューム名</code></td><td>保存用のデータ箱を削除する</td></tr><tr><td><code>docker network ls</code></td><td>ネットワーク一覧を表示する</td></tr><tr><td><code>docker network rm ネットワーク名</code></td><td>使わないネットワークを削除する</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc11">docker-compose関連</span></h2>



<h3 class="wp-block-heading"><span id="toc12">docker-composeとは？</span></h3>



<p><strong>複数のコンテナを一括でまとめて操作できる便利なコマンドです。</strong></p>



<p>Webアプリなどは複数のサービス（例：アプリ本体＋DB）を動かすことが多いため、<br>まとめて管理できる<code>docker-compose</code>は非常に便利です。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc13">docker-compose関連のコマンド</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>説明</th></tr></thead><tbody><tr><td><code>docker-compose up -d</code></td><td>バックグラウンドでコンテナ起動</td></tr><tr><td><code>docker-compose down</code></td><td>コンテナ・ネットワークを削除して停止</td></tr><tr><td><code>docker-compose logs</code></td><td>サービスのログ確認</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>Dockerもっと勉強したい！</strong>と思われた方は、こちらの記事もおすすめです。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/04/docker-command/">Docker初心者必見｜基本コマンド一覧</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/04/docker-command/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</title>
		<link>https://it-bokenki.com/2025/07/03/docker-minio/</link>
					<comments>https://it-bokenki.com/2025/07/03/docker-minio/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:26:50 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[開発事例]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4194</guid>

					<description><![CDATA[<p>未経験からエンジニア転職を目指すなら&#x1f449; テックゲート転職 をチェック！ この記事の目的 Next.jsなどのアプリから、ローカルのMinIOにファイルを保存・取得したい人向けに、Docker環境へのMin [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/03/docker-minio/">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>MinIOの導入</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>読み方はミニオ…？ なにそれ怖い…</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>ローカルでS3っぽい環境を作りたい</li>



<li>Docker上にストレージを立てたい</li>



<li>Next.jsやNode.jsからファイルを保存したい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVV0H">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www25.a8.net/svt/bgt?aid=250611124856&#038;wid=001&#038;eno=01&#038;mid=s00000025047003004000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=457GS4+E5N2LU+5D9I+HVV0H" alt=""></div>



<p class="has-text-align-center">未経験からエンジニア転職を目指すなら<br>&#x1f449; <a href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVFKY">テックゲート転職</a> をチェック！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together">
<a href="https://it-bokenki.com/2025/06/14/status/" title="404？500? ステータスコードとは？よく見るコード厳選まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/06/２行-3-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/２行-3-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-3-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-3-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">404？500? ステータスコードとは？よく見るコード厳選まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">開発エンジニアが現場でよく使うHTTPステータスコードを、意味・原因・使われる場面とともにわかりやすく解説！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<h2 class="wp-block-heading"><span id="toc1">この記事の目的</span></h2>



<p>Next.jsなどのアプリから、<strong>ローカルのMinIOにファイルを保存・取得</strong>したい人向けに、<br>Docker環境へのMinIO導入と、接続手順を紹介します。<br>（AWSは使いません！）</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">MinIOとは？</span></h2>



<p>MinIO（ミニオ）は、<strong>Amazon S3と互換性のあるオブジェクトストレージ</strong>です。<br>S3と同じAPIを使えるため、<code>@aws-sdk/client-s3</code> を使って接続できます。</p>



<p><span class="keyboard-key">&#x1f4e6; MinIOの特徴</span></p>



<ul class="wp-block-list">
<li>軽量で高速なオブジェクトストレージ</li>



<li>Dockerで簡単に立ち上げられる</li>



<li>完全ローカルで完結する（S3の代替に便利）</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">実装方法</span></h2>



<h3 class="wp-block-heading"><span id="toc4">ステップ1：MinIOをDockerで立ち上げる</span></h3>



<p>まず、<code>docker-compose.yml</code> に以下を追加します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"  // APIアクセス用（アプリ・SDKから）
      - "9001:9001"  // 管理画面（GUI）
    environment:
      MINIO_ROOT_USER: your_username       // 開発用ユーザー名
      MINIO_ROOT_PASSWORD: your_password   // 開発用パスワード
    command: server /data --console-address ":9001"
    volumes:　// データ永続化の設定
      - minio_data:/data

volumes: // データ永続化の設定
  minio_data:
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  minio</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minio</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">minio</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">minio</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">9000:9000</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// APIアクセス用（アプリ・SDKから）</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">9001:9001</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// 管理画面（GUI）</span></span>
<span class="line"><span style="color: #D8DEE9FF">    environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MINIO_ROOT_USER</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">your_username</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88">// 開発用ユーザー名</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MINIO_ROOT_PASSWORD</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">your_password</span><span style="color: #D8DEE9FF">   </span><span style="color: #616E88">// 開発用パスワード</span></span>
<span class="line"><span style="color: #D8DEE9FF">    command</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">data</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">console</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">address</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">:9001</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">　</span><span style="color: #616E88">// データ永続化の設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> minio_data</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">data</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">volumes</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// データ永続化の設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">  minio_data</span><span style="color: #ECEFF4">:</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x1f433; docker minio volume とは？</span></p>



<p>MinIOにアップロードしたファイルを、<strong>コンテナを削除・再起動しても消えないように保存する</strong>ための方法です。</p>



<p>通常、Dockerコンテナだけに保存したデータは、コンテナが停止・削除されると一緒に消えてしまいます。それを防ぐために、Dockerでは <code>volumes</code> を使って、<strong>データをPCの中（ホスト側）に残す仕組み</strong>が用意されています。</p>



<p>MinIOは <code>/data</code> にファイルを保存するため、上記（ // データ永続化の設定）のように設定しておけば、ファイルは消えません。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">ステップ2：MinIOにログイン＆バケット作成</span></h3>



<p>ブラウザで <code>http://localhost:9001</code> にアクセス<br>先ほど設定したユーザー名／パスワードでログイン</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="506" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-1024x506.png" alt="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="wp-image-4200" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-1024x506.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-300x148.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-768x379.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-1536x759.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-2048x1012.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.32.54-1320x652.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>ボタンをクリックでOKです。<br>これによりライセンス画面が閉じて、通常のMinIO管理画面（バケット作成など）に進めます。これは<strong>ローカル環境で使う分には問題ありません</strong>。</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="508" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-1024x508.png" alt="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="wp-image-4195" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-1024x508.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-300x149.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-768x381.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-1536x762.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-2048x1016.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-15.59.36-1320x655.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><code>＋create Bucket</code> を押し、「uploads」など任意のバケットを作成</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="501" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-1024x501.png" alt="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="wp-image-4196" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-1024x501.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-300x147.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-768x376.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-1536x752.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-2048x1003.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.00.16-1320x646.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>バケットを作成完了</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="506" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-1024x506.png" alt="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="wp-image-4197" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-1024x506.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-300x148.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-768x380.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-1536x759.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-2048x1012.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-16.01.46-1320x652.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">ステップ3：SDKをインストール</span></h3>



<p>MinIOはS3互換なので、以下をインストールします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>npm install @aws-sdk/client-s3</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">ステップ4：ファイルアップロードの実装</span></h3>



<p><code>src/lib/minio.ts</code> を作成して、接続設定を実装</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({
  region: "us-east-1", // MinIOでは使われないが、SDKの必須項目のため任意の値を指定（省略不可）
  endpoint: "http://localhost:9000",
  credentials: {
    accessKeyId: "your_username",     // 開発用ユーザー名
    secretAccessKey: "your_password", // 開発用パスワード
  },
  forcePathStyle: true, // バケット名をパスで扱うようにするためtrue
});

export async function uploadToMinio(file: File) {
  const arrayBuffer = await file.arrayBuffer();　// ファイルの生データを取得

  const command = new PutObjectCommand({
    Bucket: "uploads",       // GUIで作成したバケット名
    Key: file.name,          // 保存時の名前
    Body: arrayBuffer,       // アップロードするデータの中身
    ContentType: file.type,  // ファイルの種類（MIME）
  });

  await s3Client.send(command);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">S3Client</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">PutObjectCommand</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">@aws-sdk/client-s3</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">s3Client</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">new</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">S3Client</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">region</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">us-east-1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// MinIOでは使われないが、SDKの必須項目のため任意の値を指定（省略不可）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">endpoint</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://localhost:9000</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">credentials</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">accessKeyId</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">your_username</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">     </span><span style="color: #616E88">// 開発用ユーザー名</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">secretAccessKey</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">your_password</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 開発用パスワード</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">forcePathStyle</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// バケット名をパスで扱うようにするためtrue</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">uploadToMinio</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">file</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> File</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">arrayBuffer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">arrayBuffer</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">　</span><span style="color: #616E88">// ファイルの生データを取得</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">command</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">new</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">PutObjectCommand</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Bucket</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">uploads</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88">// GUIで作成したバケット名</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Key</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">name</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">          </span><span style="color: #616E88">// 保存時の名前</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Body</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">arrayBuffer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88">// アップロードするデータの中身</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ContentType</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">type</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// ファイルの種類（MIME）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">s3Client</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">send</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">command</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc8">ステップ5：動作確認</span></h3>



<p>Next.jsやNode.jsの処理の中で <code>uploadToMinio(file)</code> を呼び出せば、<br>ローカルのMinIOにファイルが保存されます。</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="504" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-1024x504.png" alt="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="wp-image-4203" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-1024x504.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-300x148.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-768x378.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-1536x756.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-2048x1007.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-9.25.33-1320x649.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>Dockerもっと勉強したい！</strong>と思われた方は、こちらの記事もおすすめです。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/03/docker-minio/">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/03/docker-minio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Docker環境構築】.envとdocker-compose.ymlはどこに置く？おすすめの配置と起動方法まとめ</title>
		<link>https://it-bokenki.com/2025/07/04/docker/</link>
					<comments>https://it-bokenki.com/2025/07/04/docker/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 15:39:52 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4179</guid>

					<description><![CDATA[<p>未経験でも気軽に！サブスク型プログラミングスクール【Freeks】 Dockerとは？ Dockerとは、アプリを動かすための環境（OS・ミドルウェアなど）をまるごとパッケージできるツールです。コンテナ単位でアプリを動か [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/04/docker/">【Docker環境構築】.envとdocker-compose.ymlはどこに置く？おすすめの配置と起動方法まとめ</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>Dockerの環境構築</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>環境構築ってややこしいよね</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><code>.env</code> と <code>docker-compose.yml</code> どこに置くのが正解？</li>



<li>ファイルを分けると起動時に困るのでは？</li>



<li>なんとなくルートに全部置いてるけど…整理した方がいいの？</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BXQOH">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www20.a8.net/svt/bgt?aid=250611125612&#038;wid=001&#038;eno=01&#038;mid=s00000025904002005000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=457GS5+A4DB02+5JVK+BXQOH" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BX3J6">未経験でも気軽に！サブスク型プログラミングスクール【Freeks】</a></p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-default">
<a href="https://it-bokenki.com/2025/07/03/docker-minio/" title="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMinIOを構築し、Next.jsやNode.jsからS3互換のローカルストレージにファイルを保存・取得する方法を、初心者向けに手順付きでわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<h2 class="wp-block-heading"><span id="toc1">Dockerとは？</span></h2>



<p>Dockerとは、<strong>アプリを動かすための環境（OS・ミドルウェアなど）をまるごとパッケージできるツール</strong>です。<br>コンテナ単位でアプリを動かすことで、開発環境の差異をなくし、誰でも同じように動作させることができます。</p>



<p>より詳しいDockerの基礎はこちら&#x1f447;</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">.envとdocker-compose.ymlの配置パターン3つ比較</span></h2>



<p>今回は<span class="red">方法③</span>を採用し、解説していきます。</p>



<figure class="wp-block-table aligncenter"><table><thead><tr><th class="has-text-align-center" data-align="center">パターン</th><th><code>.env</code> <br>の場所</th><th><code>.yml</code><br> の場所</th><th>特徴</th><th>向いている<br>ケース</th></tr></thead><tbody><tr><td class="has-text-align-center" data-align="center">方法①</td><td>ルート直下</td><td>ルート直下</td><td>最もシンプル<br>初心者向け</td><td>個人開発<br>小規模</td></tr><tr><td class="has-text-align-center" data-align="center">方法②</td><td>docker/</td><td>docker/</td><td>Docker構成を一元管理</td><td>環境分けが多い</td></tr><tr><td class="has-text-align-center" data-align="center"><span class="red">方法③ </span></td><td><span class="red">ルート直下</span></td><td><span class="red">docker/</span></td><td>アプリ側との再利用性＆保守性◎</td><td>チーム開発<br>中〜大規模</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">.env と docker-compose.yml を分けておく理由</span></h2>



<h3 class="wp-block-heading"><span id="toc4">理由１：アプリと共通で使えるようにするため</span></h3>



<p><code>.env</code> は Next.js / Node.js / Laravel などのアプリケーションでも使うことが多いので、ルートに置いておくと共通で参照しやすいです。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">理由２：Docker関連ファイルをまとめて保守性を上げるため</span></h3>



<p>こうしておけば、Dockerに関する設定がひと目でわかり、プロジェクトの構成が整います。</p>



<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img loading="lazy" decoding="async" width="478" height="290" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-10.54.06.png" alt="" class="wp-image-4186" style="border-width:1px;width:374px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-10.54.06.png 478w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-10.54.06-300x182.png 300w" sizes="auto, (max-width: 478px) 100vw, 478px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">今回の構成ディレクトリ図</span></h2>



<p>今回は<span class="red">方法③</span>を採用し、解説していきます。</p>



<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img loading="lazy" decoding="async" width="1006" height="434" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-11.03.59.png" alt="" class="wp-image-4187" style="border-width:1px;width:533px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-11.03.59.png 1006w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-11.03.59-300x129.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-02-11.03.59-768x331.png 768w" sizes="auto, (max-width: 1006px) 100vw, 1006px" /></figure>



<figure class="wp-block-table aligncenter"><table><thead><tr><th>項目</th><th>理由</th></tr></thead><tbody><tr><td><code>.env</code> をルートに配置</td><td>アプリ側でも再利用できるようにするため</td></tr><tr><td><code>docker-compose.yml</code> を<br><code>docker/</code> に配置</td><td>Docker関連ファイルをまとめて保守性を上げるため</td></tr><tr><td><span class="red"><code>env_file</code> を使わない</span></td><td>Compose v2では <code>${VAR}</code> 展開が効かず空文字になることがあるため</td></tr><tr><td><code>start.sh</code> を使う</td><td>環境変数の読み込みと起動コマンドを自動化するため</td></tr><tr><td><code>stop.sh</code> を使う</td><td>安全にコンテナを停止するための補助スクリプト</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">env_file を使わない理由を詳しく！</span></h3>



<figure class="wp-block-image aligncenter size-large is-resized has-custom-border"><img loading="lazy" decoding="async" width="1024" height="275" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-23.48.37-1024x275.png" alt="" class="wp-image-4424" style="border-width:1px;width:570px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-23.48.37-1024x275.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-23.48.37-300x81.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-23.48.37-768x206.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-23.48.37.png 1050w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>このように <code>env_file:</code> で <code>.env</code> を読み込んでも、<br>Compose v2 では <code>${APP_VERSION}</code> のような <strong>docker-compose.yml 内の変数展開が効かないことがあります</strong>。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">そもそも「Compose v2」って？</span></p>



<p>これは <strong>Compose v1 → v2</strong> の進化による仕様の違いです。</p>



<figure class="wp-block-table aligncenter"><table><thead><tr><th>比較項目</th><th>Compose v1</th><th>Compose v2</th></tr></thead><tbody><tr><td>実行方法</td><td><code>docker-compose</code>（ハイフンあり）</td><td><code>docker compose</code>（スペース）</td></tr><tr><td>技術基盤</td><td>Pythonスクリプト</td><td>Docker CLIに統合</td></tr><tr><td>現在の標準</td><td>&#x274c; 非推奨</td><td>&#x2705; 推奨（Docker Desktopに内蔵）</td></tr></tbody></table></figure>



<p> <code>.env</code> の変数を正しく反映させる方法を、下記で紹介します。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">Docker実行方法（2パターン）</span></h2>



<h3 class="wp-block-heading"><span id="toc9">パターン１：コマンドでオプションつけて毎回実行（手動）</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker compose --env-file .env -f docker/docker-compose.yml up -d</code></pre></div>



<ol class="wp-block-list">
<li><code>.env</code> ファイルの内容を明示的に読み込む</li>



<li><code>docker/docker-compose.yml</code> を指定して構成を読み込む</li>



<li><code>.env</code> 内の変数を <code>${VAR}</code> として YAML に反映する</li>



<li>すべてのサービス（container）を <strong>バックグラウンド（-d）で起動する</strong></li>



<li>まだ存在しないボリューム・ネットワークがあれば自動作成される</li>
</ol>



<p>→ 毎回打つのがやや面倒</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">パターン２： start.shで一発起動（自動）</span></h3>



<p>先ほどの①のコマンドを毎回ターミナルに打つのはやや面倒です。</p>



<p>それを自動化したスクリプトになります。（環境変数を読み込み → docker-compose 起動）</p>



<p><span class="keyboard-key">start.sh</span></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#!/bin/bash

docker compose --env-file .env -f docker/docker-compose.yml up -d</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#!/bin/bash</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">compose</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">env</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">file</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">compose</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yml</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">up</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">d</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>初回のみ実行権限を付与：</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>chmod +x start.sh</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>次からはこれだけでDockerを起動できる。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>./start.sh</code></pre></div>



<p>Dockerを停止したい場合の <code>stop.sh</code> も書き方はほぼ同じです。違うのは <code>up -d</code> を <code>down</code> にするだけ！</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>シェルについてもっと知りたい方は、こちらの記事もおすすめです。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2023/07/01/shell-introduction/" title="コマンドラインシェル入門：LinuxとWindowsシェルの違い" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2023/07/SQL-8-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2023/07/SQL-8-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2023/07/SQL-8-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2023/07/SQL-8-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">コマンドラインシェル入門：LinuxとWindowsシェルの違い</div><div class="blogcard-snippet internal-blogcard-snippet">シェル入門！LinuxとWindowsの違いと開発例を紹介。シェルの基本を学び、開発に役立つ具体的なコマンドを探求しよう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/04/docker/">【Docker環境構築】.envとdocker-compose.ymlはどこに置く？おすすめの配置と起動方法まとめ</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/04/docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</title>
		<link>https://it-bokenki.com/2025/07/03/docker-mysql/</link>
					<comments>https://it-bokenki.com/2025/07/03/docker-mysql/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:24:22 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[開発事例]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4158</guid>

					<description><![CDATA[<p>未経験でも気軽に！サブスク型プログラミングスクール【Freeks】 Dockerとは？ Dockerとは、「アプリを動かすための環境」をまるごとお弁当箱のようにパッケージにできるツールです。 メリット など、プログラミン [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/03/docker-mysql/">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>DockerでMySQLをローカルに環境構築</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>どっかー…？ なんか難しそう…</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>開発環境を一瞬で作りたい</li>



<li>チームと同じ環境で作業したい</li>



<li>MacでMySQLをすぐに使えるようにしたい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BXQOH">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www20.a8.net/svt/bgt?aid=250611125612&#038;wid=001&#038;eno=01&#038;mid=s00000025904002005000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=457GS5+A4DB02+5JVK+BXQOH" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BX3J6">未経験でも気軽に！サブスク型プログラミングスクール【Freeks】</a></p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-default">
<a href="https://it-bokenki.com/2025/07/03/docker-minio/" title="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMinIOを構築し、Next.jsやNode.jsからS3互換のローカルストレージにファイルを保存・取得する方法を、初心者向けに手順付きでわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<h2 class="wp-block-heading"><span id="toc1">Dockerとは？</span></h2>



<p>Dockerとは、<strong>「アプリを動かすための環境」をまるごとお弁当箱のようにパッケージにできるツール</strong>です。</p>



<p><span class="keyboard-key">メリット</span></p>



<ul class="wp-block-list">
<li>&#x2705; 開発環境の構築が一瞬でできる</li>



<li>&#x2705; チームで同じ環境を再現できる</li>



<li>&#x2705; テスト・本番環境の切り替えも簡単</li>
</ul>



<p>など、プログラミング学習でも現場でも大活躍します。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">環境構築手順</span></h2>



<h3 class="wp-block-heading"><span id="toc3">ステップ0：Macのチップ確認（IntelかApple Siliconか）</span></h3>



<p>まず前提として、自分のMacの「チップの種類」を確認します。</p>



<p><span class="keyboard-key">&#x2714; 確認方法</span></p>



<ol class="wp-block-list">
<li>メニューバー左上の「（リンゴマーク）」をクリック</li>



<li>「このMacについて」を選ぶ</li>



<li>表示されるウィンドウで「チップ」の項目を確認</li>
</ol>



<div style="height:5px" aria-hidden="true" class="wp-block-spacer"></div>



<p>下記が表示された場合、Apple M4 Pro → <strong>Apple Silicon 用</strong>の Docker を選びましょう。<br></p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="550" height="618" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.26.35.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4199" style="width:326px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.26.35.png 550w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-8.26.35-267x300.png 267w" sizes="auto, (max-width: 550px) 100vw, 550px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">ステップ1：Docker Desktop のインストール</span></h3>



<p>① <a href="https://www.docker.com/products/docker-desktop/">Docker公式サイト</a> にアクセス</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>② 「<strong>Download for Mac – Apple Silicon</strong>」を選んでインストーラをダウンロード</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="511" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-1024x511.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4160" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-1024x511.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-300x150.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-768x383.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-1536x767.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-2048x1023.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.38.43-1320x659.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>③ ダウンロードされた<code>.dmg</code> を開き、「Docker.app」をアプリケーションフォルダに移動</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="477" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08-1024x477.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4161" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08-1024x477.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08-300x140.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08-768x358.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08-1320x615.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.40.08.png 1404w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">ステップ2：Docker初期セットアップと起動</span></h3>



<p>① アプリケーションから <code>Docker</code> を起動</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="632" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-1024x632.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4162" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-1024x632.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-300x185.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-768x474.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-1536x947.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04-1320x814.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.42.04.png 1592w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>「Docker サブスクリプション利用規約」への同意確認画面が表示されます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x1f4cc; ざっくり要約</span></p>



<ul class="wp-block-list">
<li><strong>個人利用</strong> や <strong>小規模な開発会社</strong>での使用なら、<strong>無料で使えます！</strong>（AcceptしてOK）</li>



<li>商用利用で「社員250人超 or 年間収益1,000万ドル超」の場合は有料プランが必要</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>② 「<strong>Use recommended settings</strong>」でOK</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="446" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-1024x446.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4163" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-1024x446.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-300x131.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-768x334.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-1536x668.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57-1320x574.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.43.57.png 1774w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>少し待つと、画面右上のメニューバーに「&#x1f433;クジラマーク」が表示されます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">補足：Docker Desktop のアカウント登録 or ログイン画面</span></h3>



<p>Dockerアカウントを使うと、Docker Hub（イメージ共有サービス）と連携したり、CI/CD用に活用できたりします。</p>



<p>ただし、<strong>ローカルで開発するだけならアカウント登録は不要です！</strong><br>「Skip」をクリックしたら、いよいよDockerが使えるようになります&#x1f433;</p>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="568" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-1024x568.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4164" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-1024x568.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-300x166.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-768x426.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-1536x852.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-2048x1136.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.45.08-1320x732.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">ステップ3：MySQLコンテナ用のdocker-compose.ymlを準備</span></h3>



<p>下記は <code>docker-compose.yml</code> は MySQLコンテナをローカルに構築するための雛形になります<strong>。</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version: '3.8'  // Docker Composeのバージョン

services:
  mysql:  // サービス名（任意）
    image: mysql:8.0   // 使用するMySQLのバージョン
    container_name: 任意コンテナの名前
    restart: always. // PC再起動後も自動で再起動する
    environment:  // MySQLの初期設定（環境変数）
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3306:3306" 
    volumes:
      - mysql_data:/var/lib/mysql  // データ永続化

volumes:
  mysql_data:   // データ永続化</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">version</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3.8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// Docker Composeのバージョン</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  mysql</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// サービス名（任意）</span></span>
<span class="line"><span style="color: #D8DEE9FF">    image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> mysql</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">8.0</span><span style="color: #D8DEE9FF">   </span><span style="color: #616E88">// 使用するMySQLのバージョン</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">任意コンテナの名前</span></span>
<span class="line"><span style="color: #D8DEE9FF">    restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">always</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// PC再起動後も自動で再起動する</span></span>
<span class="line"><span style="color: #D8DEE9FF">    environment</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// MySQLの初期設定（環境変数）</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MYSQL_ROOT_PASSWORD</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">MYSQL_ROOT_PASSWORD</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MYSQL_DATABASE</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">MYSQL_DATABASE</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MYSQL_USER</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">MYSQL_USER</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">      MYSQL_PASSWORD</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">MYSQL_PASSWORD</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3306:3306</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> mysql_data</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/var</span><span style="color: #D8DEE9FF">/</span><span style="color: #D8DEE9">lib</span><span style="color: #D8DEE9FF">/mysql  </span><span style="color: #616E88">// データ永続化</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  mysql_data</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">   </span><span style="color: #616E88">// データ永続化</span></span></code></pre></div>



<p><strong>データ永続化とは？</strong>と思われた方は、下記の記事にて解説しています！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-minio/" title="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMinIOを構築し、Next.jsやNode.jsからS3互換のローカルストレージにファイルを保存・取得する方法を、初心者向けに手順付きでわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc8">ステップ4：.envファイルの準備</span></h3>



<p>上記の <code>docker-compose.yml</code> は <strong><code>.env</code> </strong>とセットで動作します。</p>



<p>同じフォルダに <code>.env</code> ファイルを作成して、以下のように記述してください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>MYSQL_ROOT_PASSWORD=ルートパスワード
MYSQL_DATABASE=データベース名
MYSQL_USER=ユーザー名
MYSQL_PASSWORD=パスワード</code></pre></div>



<figure class="wp-block-image size-large has-custom-border"><img loading="lazy" decoding="async" width="1024" height="362" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-1024x362.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4165" style="border-width:1px" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-1024x362.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-300x106.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-768x272.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-1536x543.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-2048x724.png 2048w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-14.55.26-1320x467.png 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc9">ステップ5：MySQLコンテナの起動</span></h3>



<p> <code>docker-compose.yml</code> がある場所で下記を実行</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker compose up -d</code></pre></div>



<p>成功すると、MySQLが起動して <code>.env</code> の設定が反映された状態になります。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">ステップ6：MySQLコンテナに接続</span></h3>



<p>下記は、<strong>Docker コンテナ内の MySQL に接続して、対話的に操作するコマンド</strong>です。<br>パスワード聞かれたら <code>.env</code> に書いた <code>rootpass</code> を入力</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker exec -it 任意コンテナの名前 mysql -u root -p</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>ログインできたら次のコマンドで設定したデータベースがあるか確認</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>SHOW DATABASES;</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc11">ステップ7：文字化け防止（utf8mb4）</span></h3>



<p>Docker経由でMySQLに接続すると、文字コードが <code>latin1</code> になることがあります。</p>



<p>全角文字を扱うには <code>utf8mb4</code>にするには以下のようにオプションを追加して接続してください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker exec -it　コンテナ名 mysql -u root -pパスワード --default-character-set=utf8mb4</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>その後のセッション内では、<code>latin1</code> が <code>utf8mb4</code> に変更されています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>SET NAMES utf8mb4;</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x26a0;&#xfe0f; 注意点</span></p>



<p><code>exit;</code> すると元に戻るため、必要に応じて <code>my.cnf</code> に設定を加えるか、SQLスクリプトで自動化しましょう。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc12">ターミナルでテーブルを作ってみよう</span></h2>



<p>DockerでMySQLを使う場合は、基本的にターミナル（CLI）で操作します。<br>ただし、GUIで操作したい場合も、別のツールを使えば可能です。<br>今回は<strong>ターミナルで実行する例</strong>を紹介します。<br></p>



<p>① MySQLのプロンプトに接続</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker exec -it　コンテナ名 mysql -u root -pパスワード --default-character-set=utf8mb4</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>② 接続後の表示</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mysql&gt;</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>③ 以下のSQLで、<code>users</code> テーブルを作成</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>④  <code>SHOW TABLES;</code> を実行すると、テーブルが作成されたことを確認できます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="200" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-1024x200.png" alt="Docker MySQLをローカルに構築する完全手順｜Mac対応・日本語文字化け対策つき" class="wp-image-4167" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-1024x200.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-300x59.png 300w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-768x150.png 768w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-1536x301.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36-1320x258.png 1320w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-15.04.36.png 1604w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>SQL（クエリ）とは？</strong>と思われた方は、下記の記事にて解説しています！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2023/05/20/sql/" title="SQLの概要と主要なコマンド： データベース操作の基本を学ぼう！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2023/05/SQL-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2023/05/SQL-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2023/05/SQL-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2023/05/SQL-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">SQLの概要と主要なコマンド： データベース操作の基本を学ぼう！</div><div class="blogcard-snippet internal-blogcard-snippet">SQLの概要と主要なコマンドについて解説します。SQLはデータベース操作において重要です。データベース操作の基本を理解し、データの効率的な操作を行いましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2023/05/21/sql-create/" title="SQLのCREATE文の基礎 : テーブルの作成をマスターしよう！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2023/05/SQL-1-2-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2023/05/SQL-1-2-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2023/05/SQL-1-2-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2023/05/SQL-1-2-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">SQLのCREATE文の基礎 : テーブルの作成をマスターしよう！</div><div class="blogcard-snippet internal-blogcard-snippet">SQLのCREATE文の基礎をマスターすることで、データベース操作の幅が広がり、より高度なデータベースの開発や管理ができるようになります。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc13">補足：Docker操作の基本コマンド</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker ps -a                 # コンテナ一覧（停止中も）
docker stop コンテナ名        # 停止
docker rm コンテナ名          # 削除
docker images               # イメージ一覧
docker rmi イメージID         # イメージ削除
docker volume ls            # ボリューム一覧</code></pre></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/03/docker-mysql/">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/03/docker-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Drizzleとは？TypeScriptで型安全にSQL・マイグレーションを管理する方法</title>
		<link>https://it-bokenki.com/2025/07/03/drizzle/</link>
					<comments>https://it-bokenki.com/2025/07/03/drizzle/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:39:03 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[Drizzle]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4172</guid>

					<description><![CDATA[<p>未経験からエンジニア転職を目指すなら&#x1f449; テックゲート転職 をチェック！ Drizzleとは？ Drizzle（ドリズル） は、以下の2つの機能を持つツールです。 用途 説明 ORM（Object Rela [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/03/drizzle/">Drizzleとは？TypeScriptで型安全にSQL・マイグレーションを管理する方法</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>Drizzle</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>Drizzle という言葉は聞いたことあるけど、正直よくわかっていない</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>SQLを型安全に書きたい</li>



<li>マイグレーションやテーブル設計をコードで管理したい</li>



<li>ちょっとした変更が面倒くさい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVV0H">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www25.a8.net/svt/bgt?aid=250611124856&#038;wid=001&#038;eno=01&#038;mid=s00000025047003004000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=457GS4+E5N2LU+5D9I+HVV0H" alt=""></div>



<p class="has-text-align-center">未経験からエンジニア転職を目指すなら<br>&#x1f449; <a href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVFKY">テックゲート転職</a> をチェック！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<h2 class="wp-block-heading"><span id="toc1">Drizzleとは？</span></h2>



<p><strong>Drizzle（ドリズル）</strong> は、以下の2つの機能を持つツールです。</p>



<figure class="wp-block-table"><table><thead><tr><th>用途</th><th>説明</th></tr></thead><tbody><tr><td>ORM（Object Relational Mapper）</td><td>JavaScript/TypeScript などから SQL（データベース）を安全に扱えるようにするツール</td></tr><tr><td>マイグレーションツール</td><td>データベースの構造変更をコードで管理・自動実行できるツール</td></tr></tbody></table></figure>



<p>つまり、「データベースの設計」や「変更」を <strong>コードで管理できる便利なツール</strong> です！</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">メリット</span></p>



<ul class="wp-block-list">
<li>&#x2705;&#xfe0f; TypeScriptでデータベースの列や型を<strong>コードで明確に書けて、間違いが減る</strong></li>



<li>&#x2705;&#xfe0f; テーブルの追加や変更をしたら、<strong>変更用のSQLを自動で作ってくれる</strong></li>



<li>&#x2705;&#xfe0f; コマンド1つで、<strong>SQLを書かずにデータベースが更新できる</strong></li>



<li>&#x2705;&#xfe0f; 無駄な機能が少なく、動作が速い＆自由に使いやすい</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">Drizzleの使い方</span></h2>



<p>例として、下記の流れをご紹介します。<br><strong>DrizzleでSQL実行 → Dockerのmysqlに接続してテーブル確認</strong><br><br>Dockerってなんだっけ？と思われた方は、下記の記事をご確認ください。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-mysql/" title="DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-18-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DockerでMySQLをローカル構築｜Mac対応・CLI操作と文字化け対策も解説</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMacにMySQLの開発環境を一瞬で構築！Apple Silicon対応のインストール手順、docker-compose.ymlと.env連携、utf8mb4設定、ターミナル操作でのDB作成まで初心者にもわかりやすく解説しています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-normal-card">
<a href="https://it-bokenki.com/2025/07/03/docker-minio/" title="Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/２行-17-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Next.js × Docker MinIO｜S3互換ストレージにファイルを保存する手順</div><div class="blogcard-snippet internal-blogcard-snippet">DockerでMinIOを構築し、Next.jsやNode.jsからS3互換のローカルストレージにファイルを保存・取得する方法を、初心者向けに手順付きでわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc3">ステップ１：パッケージインストール</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>npm install drizzle-orm　　　　# アプリの中で使う本体（DB操作・定義に使う）
npm install -D drizzle-kit　　# 開発時だけ使うCLIツール（マイグレーション生成用）

npx drizzle-kit init　　　　　 # 初期化コマンドも実行</code></pre></div>



<p>これで <code>drizzle.config.ts</code> が作成されます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">ステップ２：drizzle.config.ts の設定</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import type { Config } from "drizzle-kit";

export default {
  schema: "./src/schema", // スキーマファイルのディレクトリ
  out: "./drizzle",       // マイグレーションファイル出力先
  dialect: "mysql",       // DBの種類（mysql / pg / sqlite）
  dbCredentials: {
    host: "localhost",
    port: 3306,
    user: "root",
    password: "パスワード",
    database: "データベース名",
  },
} satisfies Config;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">Config</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">drizzle-kit</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">schema</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">./src/schema</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// スキーマファイルのディレクトリ</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">out</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">./drizzle</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88">// マイグレーションファイル出力先</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">dialect</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">mysql</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88">// DBの種類（mysql / pg / sqlite）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">dbCredentials</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">host</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">localhost</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3306</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">user</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">root</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">password</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">パスワード</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">database</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">データベース名</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">satisfies</span><span style="color: #D8DEE9FF"> Config</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">ステップ３：スキーマ定義</span></h3>



<p>例として「<strong>ユーザー（users）が投稿（posts）を複数持てる</strong>」という関係をDrizzle を使って表現します。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="484" height="90" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-16.24.14.png" alt="" class="wp-image-4340" style="width:269px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-16.24.14.png 484w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-16.24.14-300x56.png 300w" sizes="auto, (max-width: 484px) 100vw, 484px" /></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>テーブル名</th><th>何を表す？</th><th>主なカラム</th></tr></thead><tbody><tr><td><code>users</code></td><td>ユーザー（人）</td><td><code>user_id</code>, <code>name</code></td></tr><tr><td><code>posts</code></td><td>投稿（ユーザーの書き込み）</td><td><code>post_id</code>, <code>user_id</code>, <code>title</code></td></tr></tbody></table></figure>



<p><span class="keyboard-key">&#x25b6; usersテーブル</span></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/schema/users.ts
import { mysqlTable, varchar } from "drizzle-orm/mysql-core";
import { relations } from "drizzle-orm";
import { posts } from "./posts"; // postテーブルを読み込む

export const users = mysqlTable("users", {
  userId: varchar("user_id", { length: 36 }).primaryKey(), // ユーザーID（主キー）
  name: varchar("name", { length: 100 }), // ユーザー名
});

// ユーザーと投稿の「1対多」リレーションを定義
export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts, {
    fields: &#91;users.userId&#93;, // usersテーブルの userId を使って
    references: &#91;posts.userId&#93;, // postsテーブルの userId (外部キー)を参照する
  }),
}));
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// src/schema/users.ts</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">mysqlTable</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">varchar</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">drizzle-orm/mysql-core</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">relations</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">drizzle-orm</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">posts</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">./posts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// postテーブルを読み込む</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">users</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mysqlTable</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">users</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">userId</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">varchar</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">user_id</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">36</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">primaryKey</span><span style="color: #D8DEE9FF">()</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ユーザーID（主キー）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">varchar</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">name</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ユーザー名</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// ユーザーと投稿の「1対多」リレーションを定義</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">usersRelations</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">relations</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">users</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">({</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">many</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">})</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> (</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">posts</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">many</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">posts</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fields</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">users</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">userId</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// usersテーブルの userId を使って</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">references</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">posts</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">userId</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// postsテーブルの userId (外部キー)を参照する</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x25b6; postsテーブル</span></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/schema/posts.ts
import { mysqlTable, varchar } from "drizzle-orm/mysql-core";
import { relations } from "drizzle-orm";
import { users } from "./users"; // usersテーブルを読み込む

export const posts = mysqlTable("posts", {
  postId: varchar("post_id", { length: 36 }).primaryKey(), // 投稿ID（主キー）
  userId: varchar("user_id", { length: 36 }).notNull(), // 紐づくユーザーのID（外部キー）
  title: varchar("title", { length: 255 }), // 投稿タイトル
});

// 投稿とユーザーの「多対1」リレーションを定義
export const postsRelations = relations(posts, ({ one }) => ({
  user: one(users, {
    fields: &#91;posts.userId&#93;, // postsテーブルの userId を使って
    references: &#91;users.userId&#93;, // usersテーブルの userId を参照する
  }),
}));</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// src/schema/posts.ts</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">mysqlTable</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">varchar</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">drizzle-orm/mysql-core</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">relations</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">drizzle-orm</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">users</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">./users</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// usersテーブルを読み込む</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">posts</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mysqlTable</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">posts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">postId</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">varchar</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">post_id</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">36</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">primaryKey</span><span style="color: #D8DEE9FF">()</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 投稿ID（主キー）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">userId</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">varchar</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">user_id</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">36</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">notNull</span><span style="color: #D8DEE9FF">()</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 紐づくユーザーのID（外部キー）</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">title</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">varchar</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">title</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">length</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">255</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// 投稿タイトル</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// 投稿とユーザーの「多対1」リレーションを定義</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">postsRelations</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">relations</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">posts</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">({</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">one</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">})</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> (</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">user</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">one</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">users</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fields</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">posts</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">userId</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// postsテーブルの userId を使って</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">references</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">users</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">userId</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// usersテーブルの userId を参照する</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x1f4cc; リレーション設定のオプション</span></p>



<p><code>relations(...)</code> を使うことで「この人が書いた投稿を全部取得する」などが簡単に設定できます。</p>



<figure class="wp-block-table"><table><thead><tr><th>オプション</th><th class="has-text-align-center" data-align="center">  必須　</th><th>よく使う場面</th><th>ざっくり説明</th></tr></thead><tbody><tr><td><strong>fields</strong></td><td class="has-text-align-center" data-align="center">必須</td><td>外部キーを指定する時</td><td>自分のテーブルのカラムを書く<br>（例：<code>[userId]</code>）</td></tr><tr><td><strong>references</strong></td><td class="has-text-align-center" data-align="center">必須</td><td>どのテーブルのどのカラムとつなぐか</td><td>相手の主キーなどを書く<br>（例：<code>[users.userId]</code>）</td></tr><tr><td><strong>relationName</strong></td><td class="has-text-align-center" data-align="center">任意</td><td>同じテーブルと2つ以上つなぐ時</td><td>名前をつけておかないとエラーになることも</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">ステップ４：マイグレーションSQLファイルを生成</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>npx drizzle-kit generate --config ./tool/drizzle-kit/drizzle.config.ts</code></pre></div>



<p><code>drizzle/0000_*.sql</code> のようなSQLファイルが自動生成されます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">ステップ５：MySQL（Dockerコンテナ）にSQLを適用する</span></h3>



<p><span class="keyboard-key">&#x270d;&#xfe0f; 方法①</span> <strong>：生成されたSQLファイルを<strong>手動</strong>で反映</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># SQLファイルが自動生成される（drizzle/0000_*.sqlみたいな）
npx drizzle-kit generate　　
　
# そのSQLをDocker上のMySQLに流す
docker exec -i MySQLコンテナ名 mysql -u root -p データベース名 &lt; ./tool/drizzle-kit/drizzle/0000_xxxx.sql</code></pre></div>



<p>&#x25b6; 自動生成ファイルの出力場所</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="728" height="340" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-17.42.38.png" alt="" class="wp-image-4177" style="width:373px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-17.42.38.png 728w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-01-17.42.38-300x140.png 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure>



<p>マイグレーションに変更があるたびに、<code>generate → docker exec</code> を繰り返すことでDBを更新できます。</p>



<p><span class="keyboard-key">&#x26a0;&#xfe0f; 2回目以降のマイグレーション手順</span><br>スキーマを変更したら、以下の2コマンドだけでOKです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>npx drizzle-kit generate --config ./tool/drizzle-kit/drizzle.config.ts 
npx drizzle-kit migrate --config ./tool/drizzle-kit/drizzle.config.ts</code></pre></div>



<p><code>generate</code>：変更差分から<code>.sql</code> を生成<br><code>migrate</code>：生成されたSQLをDBに反映<br>初回は <code>push</code>、以降は <code>generate</code> → <code>migrate</code> で回せます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x270d;&#xfe0f; 方法②</span> <strong>：マイグレーションを自動で反映（推奨）</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>npx drizzle-kit push</code></pre></div>



<p><code>npx drizzle-kit push</code> は、<code>src/schema</code> などで定義された TypeScript ベースのスキーマ定義を読み取り、差分がある場合はそれを元に自動で SQL を生成し、<strong>直接データベースに反映</strong>してくれるコマンドです。</p>



<p>つまり、SQLファイルを手動で実行する必要がなく、<strong>マイグレーションの自動反映ができる便利な方法</strong>です。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc8">ステップ６：テーブルを確認する</span></h3>



<p>マイグレーションが正常に適用されたかどうかを確認するには、以下のコマンド・クエリで<strong>MySQLコンテナに入ってテーブル一覧を確認</strong>します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker exec -it MySQLコンテナ名 mysql -u root -p データベース名     # MySQLに接続

mysql&gt; SHOW TABLES;   # テーブル一覧表示</code></pre></div>



<p>テーブル一覧が表示され、<code>users</code> や <code>posts</code> などが存在すれば、マイグレーション成功です</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc9">SQLを流し込むのは手動と自動、どちらを使うべき？</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>方法①：<br>手動（docker exec）</th><th>方法②：<br>自動（drizzle-kit push）</th></tr></thead><tbody><tr><td>実行対象を明示できる</td><td>&#x2705; 明確にファイル指定できる</td><td>&#x274c; 自動検出で、明示はできない</td></tr><tr><td>作業の簡単さ</td><td>&#x274c; コマンドで、ファイルパスやコンテナ名の指定が必要</td><td>&#x2705; ワンコマンドで完了</td></tr><tr><td>確認しながら進めたいとき</td><td>&#x2705; ファイル内容をチェックしやすい</td><td>&#x274c; 実行内容は見えづらい</td></tr><tr><td>開発中の高速な反映</td><td>&#x274c; やや手間がかかる</td><td>&#x2705; スピード感をもって作業できる</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">結論</span></h3>



<ul class="wp-block-list">
<li><strong>開発中は <code>push</code> を活用</strong>して効率よく反映！</li>



<li><strong>本番に近い環境やCIでは <code>docker exec</code> で明示的に制御</strong>がおすすめ！</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/03/drizzle/">Drizzleとは？TypeScriptで型安全にSQL・マイグレーションを管理する方法</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/03/drizzle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitHubのHTTPS・SSH・CLIの違いとは？接続方法の選び方をわかりやすく解説！</title>
		<link>https://it-bokenki.com/2025/07/03/github-https-ssh-cli/</link>
					<comments>https://it-bokenki.com/2025/07/03/github-https-ssh-cli/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:45:41 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<category><![CDATA[GitHub]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=4133</guid>

					<description><![CDATA[<p>未経験からエンジニア転職を目指すなら&#x1f449; テックゲート転職 をチェック！ Gitのクローンには3種類ある GitHubでリポジトリを自分のPCにクローン（コピー）するため、「Code」ボタンを押すと次の3つ [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/07/03/github-https-ssh-cli/">GitHubのHTTPS・SSH・CLIの違いとは？接続方法の選び方をわかりやすく解説！</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>HTTPS・SSH・CLIの違い</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>どれを使えばいいんだろう〜</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>GitHubを使い始めたばかり</li>



<li>git clone に3種類あるのが気になっている</li>



<li>どれを使えばいいか迷っている</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVV0H">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www25.a8.net/svt/bgt?aid=250611124856&#038;wid=001&#038;eno=01&#038;mid=s00000025047003004000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=457GS4+E5N2LU+5D9I+HVV0H" alt=""></div>



<p class="has-text-align-center">未経験からエンジニア転職を目指すなら<br>&#x1f449; <a href="https://px.a8.net/svt/ejp?a8mat=457GS4+E5N2LU+5D9I+HVFKY">テックゲート転職</a> をチェック！</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together">
<a href="https://it-bokenki.com/2025/07/03/drizzle/" title="Drizzleとは？TypeScriptで型安全にSQL・マイグレーションを管理する方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/07/1-1-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/1-1-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/07/1-1-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/07/1-1-160x90.png 160w, https://it-bokenki.com/wp-content/uploads/2025/07/1-1-376x212.png 376w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Drizzleとは？TypeScriptで型安全にSQL・マイグレーションを管理する方法</div><div class="blogcard-snippet internal-blogcard-snippet">Drizzle ORMを使って、TypeScriptで型安全にSQLやマイグレーションを管理する方法をわかりやすく解説。初期設定からスキーマ定義、リレーション設定まで丁寧に紹介！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div>



<h2 class="wp-block-heading"><span id="toc1">Gitのクローンには3種類ある</span></h2>



<p>GitHubで<strong>リポジトリを自分のPCにクローン（コピー）</strong>するため、「Code」ボタンを押すと次の3つの接続方法が表示されます。</p>



<figure class="wp-block-image aligncenter size-full is-resized has-custom-border"><img loading="lazy" decoding="async" width="530" height="132" src="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-14.07.35.png" alt="GitHubのHTTPS・SSH・CLIの違いとは？接続方法の選び方をわかりやすく解説！" class="wp-image-4268" style="border-width:1px;width:430px;height:auto" srcset="https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-14.07.35.png 530w, https://it-bokenki.com/wp-content/uploads/2025/07/スクリーンショット-2025-07-03-14.07.35-300x75.png 300w" sizes="auto, (max-width: 530px) 100vw, 530px" /></figure>



<figure class="wp-block-table"><table><thead><tr><th>種類</th><th>URL例</th><th>特徴</th></tr></thead><tbody><tr><td><strong>HTTPS</strong></td><td>https://github.com/ユーザー名/リポジトリ.git</td><td>手軽だがpush時に認証必要</td></tr><tr><td><strong>SSH</strong></td><td>git@github.com:ユーザー名/リポジトリ.git</td><td>初期設定必要だが以降は楽</td></tr><tr><td><strong>GitHub CLI</strong></td><td>gh repo clone ユーザー名/リポジトリ</td><td>CLI使用者向けの先進的な方法</td></tr></tbody></table></figure>



<p><span class="keyboard-key">&#x1f4cc; 例えるなら…</span></p>



<ul class="wp-block-list">
<li><strong>HTTPS</strong>：玄関で名前とパスワードを言わないと入れない（毎回認証が必要）</li>



<li><strong>SSH</strong>：合鍵を持っていればそのまま入れる（1回設定すれば楽）</li>



<li><strong>GitHub CLI</strong>：スマートスピーカー付きの玄関。音声コマンドだけで開け閉めできる（コマンドひとつでPRやIssueの操作も完了）</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">HTTPSの特徴</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git clone https://github.com/ユーザー名/リポジトリ.git</code></pre></div>



<p><span class="keyboard-key">&#x1f513;&#xfe0f; 特徴</span></p>



<p>認証が手軽で誰でも使えるが、push時にtoken入力（認証）が必要<br>※保存済みなら省略可</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x2714; 使い方</span></p>



<p>① GitHubで<strong>HTTPSのURLをコピーして貼り付け</strong></p>



<p>② パスワードを求められたら、<strong>ユーザー名・トークンを貼り付け</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git clone https://github.com/ユーザー名/リポジトリ.git

＞ Username for &#39;https://github.com&#39;: ユーザー名
＞ Password for &#39;https://github.com&#39;: tokenの内容</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc3">push時に認証を求められないパターン</span></h3>



<p><span class="keyboard-key">&#x1f50e; パターン1</span>：<strong>すでに SSH 接続に切り替わっている</strong></p>



<p><code>git remote -v</code> を実行して、下記が表示されたら既に<strong>SSH接続</strong>を使っているという意味です。<br>なので <strong><code>git push</code> しても token やパスワードを聞かれない</strong>のが正しい挙動です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git remote -v

＞ origin  git@github.com:ユーザー名/リポジトリ.git (fetch)
＞ origin  git@github.com:ユーザー名/リポジトリ.git (push)</code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p><span class="keyboard-key">&#x1f50e; パターン2</span>：<strong>HTTPSだけど、token を保存済み</strong></p>



<p>もし以前に HTTPS で push したときに token を保存していたら、Macの「キーチェーン」などに保存されていて、聞かれないこともあります。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc4">SSHの特徴</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git clone git@github.com:ユーザー名/リポジトリ.git</code></pre></div>



<p><span class="keyboard-key">&#x1f513;&#xfe0f; 特徴</span></p>



<ul class="wp-block-list">
<li>初回のみ、SSH鍵を作成してGitHubに登録</li>



<li>pushもpullも認証無しでスムーズ</li>



<li>CI/CDや自動化との相性も高い</li>
</ul>



<p><span class="keyboard-key">&#x2714; 使い方</span></p>



<p>① <strong>SSH鍵（鍵ペア）を作る</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ssh-keygen -t ed25519 -C &quot;メールアドレス&quot;</code></pre></div>



<p>どこの階層（ディレクトリ）でも実行してOK<br><code>~/.ssh/id_ed25519</code>（秘密鍵）と <code>~/.ssh/id_ed25519.pub</code>（公開鍵）が生成されます。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<p>② <strong>公開鍵をGitHubに登録</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cat ~/.ssh/id_ed25519.pub</code></pre></div>



<ol class="wp-block-list">
<li>上記のコマンドで、公開鍵の中身を確認してコピー</li>



<li>GitHubにログイン</li>



<li>右上のアイコンをクリック → <strong>Settings（設定）</strong></li>



<li>左メニューから <strong>SSH and GPG keys</strong> を選択</li>



<li><strong>[New SSH key]</strong> ボタンをクリック</li>



<li><code>cat</code> コマンドで表示された公開鍵を貼り付けて保存</li>
</ol>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">GitHub CLIの特徴</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>gh repo clone ユーザー名/リポジトリ</code></pre></div>



<p><span class="keyboard-key">&#x1f513;&#xfe0f; 特徴</span></p>



<ul class="wp-block-list">
<li>GitHub公式CLIツール</li>



<li>PR作成やIssue管理もコマンドだけでOK</li>



<li>SSHとHTTPSの接続設定も対話形式で簡単に切り替えられる</li>
</ul>



<p><span class="keyboard-key">&#x2714; 使い方</span></p>



<p>公式手順はこちらをご確認ください：<a class="" href="https://cli.github.com/">https://cli.github.com/</a></p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">結局どれを使えばいい？</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>シーン</th><th>おすすめ</th></tr></thead><tbody><tr><td>勉強用、お試し利用</td><td><strong>HTTPS</strong></td></tr><tr><td>本格的に開発したい</td><td><strong>SSH</strong></td></tr><tr><td>PR管理もやりたい、CLI感覚で使いたい</td><td><strong>GitHub CLI</strong></td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc7">トークン保存済みHTTPSとSSHの違いってあるの？</span></h2>



<p>たしかに、トークンを保存していれば<br><code>git push</code> 時に毎回パスワードを入力する必要はなく、操作感は SSH と似ています。</p>



<p>でも、それでも <strong>SSH を使うべき理由</strong>があります。</p>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc8">HTTPSよりSSHを選ぶメリット</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>SSH</th><th>HTTPS（トークン保存済み）</th></tr></thead><tbody><tr><td>毎回の認証</td><td>&#x2705;&#xfe0f; 不要（鍵で認証）</td><td>&#x1f53c; 省略可（保存時のみ）</td></tr><tr><td>トークンの有効期限</td><td>&#x2705;&#xfe0f; なし（鍵は手動で管理）</td><td>&#x1f53c; あり（通常は90日など）</td></tr><tr><td>再認証の必要性</td><td>&#x2705;&#xfe0f; 基本なし</td><td>&#x274c;&#xfe0f; 期限切れ後に必要</td></tr><tr><td>自動化（CI/CD）での使用</td><td>&#x2705;&#xfe0f; 簡単（秘密鍵を渡すだけ）</td><td>&#x1f53c; 環境変数やGitHub Tokenが必要</td></tr><tr><td>接続の安定性</td><td>&#x2705;&#xfe0f; 高い</td><td>&#x1f53c; GitHubのポリシーに左右される</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc9">結論</span></h3>



<p>見た目は似ていても、<strong>安定性・自動化・セキュリティの面でSSHの方が圧倒的におすすめ</strong>です。<br>特に、チーム開発やCI/CDの導入が視野にあるなら、最初からSSHに慣れておくのがベストです。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/07/03/github-https-ssh-cli/">GitHubのHTTPS・SSH・CLIの違いとは？接続方法の選び方をわかりやすく解説！</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/07/03/github-https-ssh-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【初心者向け】Networkタブの使い方をやさしく解説｜APIの見方や通信トラブル対処まで</title>
		<link>https://it-bokenki.com/2025/06/16/f12-network-tab/</link>
					<comments>https://it-bokenki.com/2025/06/16/f12-network-tab/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Mon, 16 Jun 2025 00:23:06 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=3371</guid>

					<description><![CDATA[<p>未経験でも気軽に！サブスク型プログラミングスクール【Freeks】 Networkタブとは？ Webページがサーバーとどんな通信をしているのかを確認できるタブです。 &#x1f50d; 確認できる内容 Networkタブ [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/06/16/f12-network-tab/">【初心者向け】Networkタブの使い方をやさしく解説｜APIの見方や通信トラブル対処まで</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>Networkタブ</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>エラーがでたとき、焦っちゃうよ<br>みんなどうやって解決してるんだろう&#8230;</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>ボタンを押しても何が起きてるのか分からない</li>



<li>API通信や送信データを確認したい</li>



<li>JavaScriptでエラーが出てないのに動かない理由を知りたい</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BXQOH">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www20.a8.net/svt/bgt?aid=250611125612&#038;wid=001&#038;eno=01&#038;mid=s00000025904002005000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=457GS5+A4DB02+5JVK+BXQOH" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BX3J6">未経験でも気軽に！サブスク型プログラミングスクール【Freeks】</a></p>



<p class="has-text-align-center"></p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-default">
<a href="https://it-bokenki.com/2025/06/13/devtools/" title="F12で開く開発者ツール（DevTools）の使い方｜初心者でもできるエラー調査と表示確認" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/06/２行-2-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/２行-2-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-2-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-2-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">F12で開く開発者ツール（DevTools）の使い方｜初心者でもできるエラー調査と表示確認</div><div class="blogcard-snippet internal-blogcard-snippet">F12キーで開く開発者ツール（DevTools）の使い方を初心者向けに解説。HTML/CSSの確認、API通信、エラー調査の基本がまるっとわかります。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc1">Networkタブとは？</span></h2>



<p><strong>Webページがサーバーとどんな通信をしているのかを確認できるタブ</strong>です。</p>



<p><span class="keyboard-key">&#x1f50d; 確認できる内容</span></p>



<ul class="wp-block-list">
<li>どのURLにリクエストを送っているか</li>



<li>送った内容（リクエストボディ）</li>



<li>サーバーから返ってきた内容（レスポンス）</li>



<li>ステータスコード（200 OK / 404 Not Found など）</li>



<li>通信にかかった時間</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">Networkタブ関連の用語まとめ</span></h2>



<figure class="wp-block-table aligncenter is-style-regular"><table><thead><tr><th>確認項目</th><th>意味／使い道</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>通信したファイル名やAPIのURL</td></tr><tr><td><strong>Status</strong></td><td>HTTPステータスコード (200 OK, 404 etc.)</td></tr><tr><td><strong>Headers</strong></td><td>送信/受信したヘッダ情報</td></tr><tr><td><strong>Timing</strong></td><td>どのプロセスに時間がかかったかを確認</td></tr><tr><td><strong>Payload</strong></td><td>POSTなどで送ったデータ</td></tr><tr><td><strong>Initiator</strong></td><td>どのコードがリクエストを起こしたかを表示</td></tr><tr><td><strong>Preview</strong></td><td>受け取ったデータを見やすく表示</td></tr><tr><td><strong>Response</strong></td><td>受け取ったデータを生で表示（見づらい&#8230;）</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc3">Initiatorタブの読み取り例</span></h3>



<p>DevTools の「Network」タブでリクエストを選ぶと、右側の「Initiator」欄に次のような情報が表示されることがあります。</p>



<p><span class="keyboard-key">例</span>：</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>l7 @ main.821f6781acf946b1.js:4</code></pre></div>



<p><span class="keyboard-key">どういう意味？</span></p>



<ul class="wp-block-list">
<li><code>main.821f6781acf946b1.js</code>の <strong>4行目</strong>にある <code>l7</code>という関数がリクエストの発火元</li>



<li><code>l7</code>は意味のわからないランダムな名前に変えられてる名前なので意味は読めない</li>



<li><strong>ファイル名 + 行番号</strong>が第一手がかり</li>
</ul>



<p><span class="keyboard-key">&#x1f6e0; 実務での使い方</span></p>



<ul class="wp-block-list">
<li>無駄なAPIが呼ばれている原因の特定</li>



<li>どのイベントが通信を起こしているかを調査</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">Timingタブの読み取り例</span></h3>



<p>このタブでは、1つの通信に<strong>どの工程でどれだけ時間がかかったか</strong>を見られます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="612" src="https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-15-14.25.47-1024x612.png" alt="" class="wp-image-3418" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-15-14.25.47-1024x612.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-15-14.25.47-300x179.png 300w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-15-14.25.47-768x459.png 768w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-15-14.25.47.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><br><span class="keyboard-key">例</span>：今回の通信は 約0.5秒（561ミリ秒）かかっています</p>



<ul class="wp-block-list">
<li><strong>Initial connection（接続開始）: 367.61ms</strong><br>→ サーバーとつなぐための準備。ネットが遅かったり、回線が混んでると長くなる。</li>



<li><strong>SSL: 183.11ms</strong><br>→ サイトがHTTPSだと、暗号化するための「手続き時間」がここにかかる。</li>



<li><strong>Waiting for server response: 192.04ms</strong><br>→ サーバーが応答を返すまでの待ち時間。処理が遅いとここが長くなる。</li>
</ul>



<p><span class="keyboard-key">&#x1f9e0; ポイント</span></p>



<ul class="wp-block-list">
<li>合計が長い＝表示が遅い原因がある</li>



<li>どこに時間がかかっているかを見れば、原因が「ネットか？サーバーか？」が分かる</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">JavaScriptでエラーが出ていないのに動かない理由は？</span></h2>



<p> <code>console.log()</code> では何も出てないのに画面が止まっている場合、<strong>通信エラー</strong>や<strong>バックエンドからの空返答</strong>が原因かもしれません。<br>→ Networkタブで通信内容・レスポンスをチェックすることで、<strong>画面が更新されない理由</strong>を特定できます。</p>



<p><span class="keyboard-key">&#x1f9e8; こんなエラー遭遇したら&#8230;</span></p>



<ul class="wp-block-list">
<li>ボタンを押しても動かない</li>



<li>エラーが出ないのに動作しない</li>
</ul>



<p><span class="keyboard-key">&#x1f575;&#xfe0f;&#x200d;&#x2642;&#xfe0f;ココを確認</span></p>



<ul class="wp-block-list">
<li>Networkタブで通信が起きてるか</li>



<li>Statusは200か？</li>



<li>Responseの中身は何が帰ってきてる？</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-together is-style-default">
<a href="https://it-bokenki.com/2025/06/15/ssg-ssr/" title="SSGとSSRの違いとは？" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/06/1行-1-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/1行-1-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/06/1行-1-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/06/1行-1-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">SSGとSSRの違いとは？</div><div class="blogcard-snippet internal-blogcard-snippet">SSGとSSRの違いを初心者向けにやさしく解説。用途別の使い分けや特徴、向いているケースを具体例で紹介します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div><p>The post <a href="https://it-bokenki.com/2025/06/16/f12-network-tab/">【初心者向け】Networkタブの使い方をやさしく解説｜APIの見方や通信トラブル対処まで</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/06/16/f12-network-tab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>F12で開く開発者ツール（DevTools）の使い方｜初心者でもできるエラー調査と表示確認</title>
		<link>https://it-bokenki.com/2025/06/13/devtools/</link>
					<comments>https://it-bokenki.com/2025/06/13/devtools/#respond</comments>
		
		<dc:creator><![CDATA[てんハロ運営者]]></dc:creator>
		<pubDate>Fri, 13 Jun 2025 11:29:05 +0000</pubDate>
				<category><![CDATA[開発ツール（Dev Tools）]]></category>
		<guid isPermaLink="false">https://it-bokenki.com/?p=3148</guid>

					<description><![CDATA[<p>未経験でも気軽に！サブスク型プログラミングスクール【Freeks】 F12の開発者ツール（DevTools）とは？ Webサイトの構造や動作を確認・調査・デバッグするための機能がまとめられたツールです。 多くのブラウザ（ [&#8230;]</p>
<p>The post <a href="https://it-bokenki.com/2025/06/13/devtools/">F12で開く開発者ツール（DevTools）の使い方｜初心者でもできるエラー調査と表示確認</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>どもども<br>今回は「<strong>開発者ツール（DevTools）</strong>」について解説します。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/5-1-150x150.png" alt="バグヲ" class="speech-icon-image"/></figure><div class="speech-name">バグヲ</div></div><div class="speech-balloon">
<p>ボタン押しても…動かない！？<br>エラーも出てないし、もうお手上げだよ〜！</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>こんなあなたにピッタリな記事&#x1f447;</p>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>Web開発を始めたばかりの方</li>



<li>タブごとの役割と初心者向けの使い方</li>



<li>よくあるトラブルと確認すべきポイント</li>
</ul>



<p>がまぁまぁわかります！</p>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BXQOH">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www20.a8.net/svt/bgt?aid=250611125612&#038;wid=001&#038;eno=01&#038;mid=s00000025904002005000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=457GS5+A4DB02+5JVK+BXQOH" alt=""></div>



<p class="has-text-align-center"><a href="https://px.a8.net/svt/ejp?a8mat=457GS5+A4DB02+5JVK+BX3J6">未経験でも気軽に！サブスク型プログラミングスクール【Freeks】</a></p>



<figure class="wp-block-embed aligncenter is-type-wp-embed is-provider-it wp-block-embed-it"><div class="wp-block-embed__wrapper">
<a href="https://it-bokenki.com/2025/06/16/f12-network-tab/" title="【初心者向け】Networkタブの使い方をやさしく解説｜APIの見方や通信トラブル対処まで" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/06/２行-8-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/２行-8-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-8-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-8-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【初心者向け】Networkタブの使い方をやさしく解説｜APIの見方や通信トラブル対処まで</div><div class="blogcard-snippet internal-blogcard-snippet">F12キーで開く「Networkタブ」の基本を初心者向けに解説。通信状況の確認、APIのエラー調査、画面が動かない原因の特定に役立つ見方を紹介します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
</div></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc1">F12の開発者ツール（DevTools）とは？</span></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="60" src="https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-1024x60.png" alt="F12キーで見るWebの裏側｜フロントエンドもバックエンドも使える開発者ツール（DevTools）完全ガイド" class="wp-image-3205" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-1024x60.png 1024w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-300x18.png 300w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-768x45.png 768w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-1536x90.png 1536w, https://it-bokenki.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-13-19.09.55-2048x120.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Webサイトの構造や動作を確認・調査・デバッグするための機能</strong>がまとめられたツールです。</p>



<p>多くのブラウザ（Chrome、Edge、Firefoxなど）で、<strong>キーボードの「F12」キー</strong>を押すことで起動できます。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">よく使うDevToolsのタブまとめ</span></h2>



<h3 class="wp-block-heading"><span id="toc3">フロントエンドエンジニア向けのタブと活用例</span></h3>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>タブ名</th><th>役割</th><th>活用例</th></tr></thead><tbody><tr><td><strong><span class="marker">Elements</span></strong></td><td>HTML構造の確認・変更</td><td>・要素構造確認<br>・クラスの確認<br>・ボタンが押せない原因調査</td></tr><tr><td><strong><span class="marker">Styles / Computed</span></strong><br>（Elementsタブの配下）</td><td>CSSの確認・変更</td><td>・スタイルの確認<br>・スタイル競合や未反映の原因調査</td></tr><tr><td><strong><span class="marker">Console</span></strong></td><td>JSエラー＆ログ</td><td>・JavaScriptエラーの確認<br>・console.log() 出力の確認<br>・関数テスト</td></tr><tr><td><strong><span class="marker">Device Mode</span></strong><br>（&#x1f4f1;アイコン）</td><td>レスポンシブ表示切替</td><td>・スマホ表示確認<br>・モバイル検証の必須機能</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=3T8UQ0+HV0XE+3GWO+6KMIP">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www23.a8.net/svt/bgt?aid=230520456030&#038;wid=001&#038;eno=01&#038;mid=s00000016188001104000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www17.a8.net/0.gif?a8mat=3T8UQ0+HV0XE+3GWO+6KMIP" alt=""></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading has-text-align-left"><span id="toc4">バックエンドエンジニア向けのタブと活用例</span></h3>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>タブ名</th><th>役割</th><th>活用例</th></tr></thead><tbody><tr><td><strong><span class="marker">Network</span></strong></td><td>通信・APIレスポンス確認<br>（サイトがどんなデータを読み込んでいるかを見る）</td><td>・ボタンを押しても動かないとき、サーバーに正しく送れているか確認する<br>・Web API（外部のデータ）と通信している内容をチェックしたい<br>・どの画像やCSSが読み込まれているかを見たい</td></tr><tr><td><strong><span class="marker">Application</span></strong></td><td>Cookie・Storage・Token確認<br>（ログイン情報や保存されたデータを見る）</td><td>・ログイン状態がうまくいかないとき、保存された「ログイン情報（Cookieやトークン）」を確認する<br>・ページに保存されているデータ（localStorageなど）を見たいとき</td></tr><tr><td><strong><span class="marker">Privacy and　Security</span></strong></td><td>SSLや認証状態確認<br>（サイトの安全性をチェックする）</td><td>・URLが「https」なのに鍵マークが出ないとき<br>・セキュリティ関連のエラーが出ているときにチェックする</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">どちらにも役立つ便利タブ</span></h3>



<p>フロントエンド・バックエンドのどちらの立場でも使える、<strong>一歩進んだ開発者向けタブ</strong>をまとめました。<br>デバッグ力やパフォーマンス改善の精度がグッと上がります。</p>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>タブ名</th><th>役割</th><th>活用例</th></tr></thead><tbody><tr><td><span class="marker"><strong>Sources</strong></span></td><td>ブレークポイントデバッグ</td><td>・ボタンを押しても動かないとき、変数に何が入っているか確かめたい<br>・「ページ遷移がうまくいかない」などのバグを詳しく調べたい（SPA開発時によく使う）</td></tr><tr><td><span class="marker"><strong>Performance</strong></span></td><td>表示速度やCPU負荷の分析</td><td>・ページがカクカクする、表示が遅いなどの原因を調べたい<br>・どの操作に時間がかかっているかを見たい（例：スクロール、画像表示）</td></tr><tr><td><strong><span class="marker-under"><span class="marker">Memory</span></span></strong></td><td>メモリ使用量の分析</td><td>・SPA（シングルページアプリケーション）で画面遷移後にメモリが解放されていない場合<br>　・長時間使うWebアプリで、次第に動作が重くなる原因を調べたいとき</td></tr><tr><td><span class="marker"><strong>Lighthouse</strong></span></td><td>SEO・パフォーマンス診断</td><td>・「スマホに対応しているか？」「表示スピードは速いか？」などをレポート形式で教えてくれる<br>・SEOやアクセシビリティの基準を満たしているか調べたい</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-popular is-style-default">
<a href="https://it-bokenki.com/2025/06/11/typescript-optional-null/" title="【TypeScript】date?: Date | null の意味をやさしく解説！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-bokenki.com/wp-content/uploads/2025/06/２行-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-bokenki.com/wp-content/uploads/2025/06/２行-320x180.png 320w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-120x68.png 120w, https://it-bokenki.com/wp-content/uploads/2025/06/２行-160x90.png 160w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【TypeScript】date?: Date | null の意味をやさしく解説！</div><div class="blogcard-snippet internal-blogcard-snippet">TypeScriptのdate?: Date | nullの意味を初心者向けにやさしく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-bokenki.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-bokenki.com</div></div></div></div></a>
<p></p>
</div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">トラブル別 DevTools早見表（初心者向け）</span></h2>



<p>よくあるトラブルごとに開くべきタブとチェックポイントをまとめ、さらにフロントエンド／バックエンドの視点での活用例もあわせて紹介します。</p>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>確認したいこと</th><th>タブ</th><th>チェックポイント</th></tr></thead><tbody><tr><td>ボタンを押しても何も起きない</td><td><span class="marker"><strong>Console / Network</strong></span></td><td>JavaScriptエラーが出ていないか（Console）<br>API通信が発生しているか（Network）</td></tr><tr><td>外部APIと通信しているか見たい</td><td><span class="marker"><strong>Network</strong></span></td><td>通信のURL、送信データ、返ってきたレスポンス</td></tr><tr><td>ログイン状態がうまく保持されない</td><td><span class="marker"><strong>Application</strong></span></td><td>Cookie や localStorage に正しく保存されているか</td></tr><tr><td>ページが重い・表示が遅い</td><td><span class="marker"><strong>Performance</strong></span></td><td>読み込みや描画に時間がかかっていないか</td></tr><tr><td>スマホで表示が崩れる</td><td><span class="marker"><strong>Device Mode</strong></span><br>（&#x1f4f1;アイコン）</td><td>スマホ表示でCSSが崩れていないか</td></tr><tr><td>通信がhttpsなのに鍵マークが出ない</td><td><span class="marker"><strong>Privacy and Security</strong></span></td><td>SSL証明書のエラーや混在コンテンツ（http）がないか</td></tr><tr><td>JavaScriptの中身を途中で止めて確認したい</td><td><span class="marker"><strong>Sources</strong></span></td><td>ブレークポイントを使って変数の中身を確認</td></tr><tr><td>サイトの品質・SEO・表示速度を改善したい</td><td><span class="marker"><strong>Lighthouse</strong></span></td><td>自動で改善ポイントを診断してくれる</td></tr></tbody></table></figure>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="text-align: center;"><a rel="nofollow" href="https://px.a8.net/svt/ejp?a8mat=3T911P+F006GI+51FE+NVHCX">
<img loading="lazy" decoding="async" border="0" width="300" height="250" alt="" src="https://www22.a8.net/svt/bgt?aid=230528653907&#038;wid=001&#038;eno=01&#038;mid=s00000023513004010000&#038;mc=1"></a>
<img loading="lazy" decoding="async" border="0" width="1" height="1" src="https://www14.a8.net/0.gif?a8mat=3T911P+F006GI+51FE+NVHCX" alt=""></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc7">まとめ</span></h2>



<ul class="wp-block-list">
<li>F12キーを押すだけで開発者ツールが使える！</li>



<li>HTML/CSSの表示、JavaScriptのエラー、API通信の確認が簡単にできる</li>



<li>初心者はまず「Console」「Network」「Application」の3つをマスターしよう！</li>
</ul>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-bokenki.com/wp-content/uploads/2023/05/名称未設定のデザイン-1-1-150x150.png" alt="てんハロ運営者" class="speech-icon-image"/></figure><div class="speech-name">てんハロ運営者</div></div><div class="speech-balloon">
<p>おつかれさまでした！</p>
</div></div><p>The post <a href="https://it-bokenki.com/2025/06/13/devtools/">F12で開く開発者ツール（DevTools）の使い方｜初心者でもできるエラー調査と表示確認</a> first appeared on <a href="https://it-bokenki.com">てんハロ｜未経験エンジニアのIT学習ログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://it-bokenki.com/2025/06/13/devtools/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
