TomcatをDockerで起動すれば、ローカル環境を一切汚さずに数分でWebサーバーを立ち上げられます。この記事では、docker runによる即起動からDockerfileでの管理、WARファイルのデプロイまでを3ステップで解説します。
「Javaのバージョン切り替えで丸一日消えた」「アンインストールしたのに残骸が消えない」——そんな経験がある方こそ、Docker化の恩恵を実感できるはずです。コマンドをコピペしながら進めれば、初心者でもTomcatが動く環境を手に入れられます。
TomcatをDocker化するメリットとは
ローカル環境を汚さずに開発を進めることは、エンジニアにとって最も重要な「身だしなみ」だと言えます。かつての私は「直接インストールしたほうが早い」と豪語していましたが、それは大きな間違いでした。直接インストールを繰り返すと、OSの深いところに不要なファイルが蓄積され、動作が重くなる原因を作ります。
Dockerを使う最大の理由は、OSから独立した「隔離空間」でTomcatを動かせる点にあります。コンテナの隔離性により、古いプロジェクトで必要なJava 8と、最新LTSのJava 25を共存させるような無茶な運用も、コンテナを分けるだけで解決します。物理的なPCの環境は常にクリーンなまま、必要なときだけ必要なバージョンのサーバーを呼び出す。この機動性こそが、現代の開発スタイルにおいて欠かせない要素なのです。
また、チーム開発でのメリットも見逃せません。誰かが作ったDockerfileを共有すれば、新しく入ったメンバーも数秒で全く同じ環境を再現できます。「手順書通りにやったのに動かない」という、あの不毛なチャットのやり取りをこの世から消し去ることができるのです。合理性とメンテナンス性を追求するなら、もはやDockerを使わない選択肢はありません。
ローカルに直接Tomcatを入れると起きがちな問題
ローカルに直接Tomcatを入れると、アンインストールが非常に面倒だという問題に直面します。インストーラーやZIP解凍で配置したファイルは、レジストリや隠しフォルダに設定を残していくことがよくあります。
また、Javaのバージョン競合はプログラミング初心者が最初にぶつかる大きな壁です。Tomcatの特定のバージョンが特定のJavaにしか対応していない場合、OS全体のJavaを書き換える必要が出てきます。これを繰り返すと、OSの環境変数が「秘伝のタレ」のように複雑化し、最終的にOSの再インストールが必要になることさえあります。
DockerでTomcatを動かすと何が楽になるのか
Dockerを使えば、コマンド一つでTomcat環境を丸ごと捨てられるのが最高に気持ちいいです。実験的に設定をいじくり回して壊してしまっても、コンテナを削除して作り直せば、1秒で初期状態に戻ります。
この「失敗してもすぐにやり直せる」という安心感は、学習効率を飛躍的に高めてくれます。さらに、本番環境もDockerであれば、自分のPCで動いたものがサーバーでも確実に動くという保証が得られます。環境の差異に怯えながらデプロイ作業をするストレスから、あなたは永遠に解放されるのです。
DockerでTomcatを動かす仕組み|イメージ・コンテナ・ポートの関係
DockerでTomcatを動かす仕組みは、よく「引越し用のコンテナ」に例えられます。Tomcatという家具が入った箱を、自分のPCという土地の上にポンと置くようなイメージです。このとき、箱の中の家具(Tomcat)に外からアクセスするためには、箱の壁に「穴(ポート)」を開ける必要があります。
全体像としては、まず「イメージ」と呼ばれるテンプレートを用意し、それを元に「コンテナ」という実体を作ります。イメージはレシピ本、コンテナは実際に出来上がった料理だと考えると分かりやすいでしょう。私たちはDocker Hubという世界最大のレシピサイトから、公式が用意したTomcatのイメージをダウンロードして利用します。
Dockerイメージ・コンテナ・ポートの関係
Dockerイメージは実行に必要なすべてのファイルが詰まった静かな塊です。これをdocker runコマンドで実行すると、メモリ上で動き出す「コンテナ」に進化します。
ここで重要なのがポートの設定です。コンテナは内部で8080番ポートを使って待ち構えていますが、外の世界(あなたのPCのブラウザ)からは直接見えません。そのため、PCの8080番とコンテナの8080番を繋ぐトンネルを掘る設定を行います。これをポートフォワーディングと呼び、この設定を忘れるとブラウザで「接続拒否」の画面を見て絶望することになります。
この記事では、Tomcatの公式イメージを取得してコンテナとして起動し、WARファイルをデプロイするまでを解説します。データベース連携や複雑なネットワーク構築は扱いませんので、まずはTomcat単体をDocker上で動かすことに集中しましょう。
TomcatをDockerで動かす事前準備
まずは道具が揃っているか確認しましょう。何事も準備が8割です。Dockerさえ動けば、あとはどうにでもなります。もし、まだDocker Desktopをインストールしていない場合は、公式サイトからダウンロードして、クジラのアイコンがタスクバーで泳いでいる状態にしてください。
ここで注意したいのが、Dockerのバージョンです。あまりに古すぎると最新のイメージが動かないことがありますが、2025年以降のバージョンであれば問題ありません。また、Windowsユーザーの方はWSL 2が有効になっているかも確認しておきましょう。これが有効でないと、Dockerの動作が極端に重くなったり、そもそも起動しなかったりしてストレスが溜まります。
Dockerがインストールされているか確認する
ターミナル(WindowsならPowerShellやコマンドプロンプト)を開いて、以下のコマンドを打ち込んでみてください。
docker --versionこれでバージョン番号が表示されれば準備完了です。もし「コマンドが見つかりません」と言われたら、パスが通っていないか、インストールが完了していません。PCを再起動すると直ることも多いので、まずは焦らずに再起動を試してみるのが賢明な判断です。
Tomcat公式Dockerイメージの選び方
Docker Hubには無数のTomcatイメージがありますが、基本的には「Official Image」と書かれたものを選びましょう。タグと呼ばれるバージョン指定にもコツがあります。
何も考えずにlatest(最新版)を使うのは、プロの現場ではあまり推奨されません。なぜなら、ある日突然バージョンが上がって、昨日まで動いていたコードが動かなくなるリスクがあるからです。例えばtomcat:10-jdk17やtomcat:11-jdk21のように、TomcatのバージョンとJavaのバージョンが明示されているタグを選ぶのが、安定性を重視する大人の選択です。
docker runでTomcatを即起動する手順
それでは、実際にTomcatを動かしてみましょう。細かい設定は後回しにして、まずは「動いた!」という成功体験を味わうことが大切です。以下のコマンドは、Docker界における「Hello World」のようなものです。
ターミナルにコマンドを1行打ち込むだけで、世界中で使われているWebサーバーが自分のPCで動き出します。この手軽さを知ってしまうと、もう重たいインストーラーを実行していた頃には戻れません。ネットワーク環境にもよりますが、イメージのダウンロードを含めても数分で完了するはずです。
TomcatをDockerで即起動するコマンド
以下のコマンドをコピーして、ターミナルで実行してください。
docker run -it --rm -p 8080:8080 tomcat:10ここで使っているオプションの意味を軽く説明します。-itはコンテナにターミナルを接続してログをリアルタイムで表示するため、--rmはコンテナを止めたら自動で削除するための設定です。-p 8080:8080が先ほど説明したポートのトンネル設定です。初回実行時はイメージのダウンロードが始まりますので、コーヒーでも飲みながらゆっくり待ちましょう。なお、JDKバージョンも指定したい場合はtomcat:10-jdk17やtomcat:11-jdk21のようにタグを変更してください。
ブラウザでTomcatの起動確認をする
ログに「Server startup in XXX ms」と表示されたら、ブラウザを開いて http://localhost:8080 にアクセスしてみてください。
最近のTomcatイメージは、セキュリティ上の理由で初期状態では「404 Not Found」が表示されることがあります。「えっ、失敗?」と思うかもしれませんが、これは正常な動作です。Tomcatの猫のキャラクターが表示されなくても、サーバー自体が反応していれば、Docker上での起動には成功しています。
この404はTomcat 10以降でセキュリティ強化のためデフォルトアプリがwebapps.distに隔離されたことが原因です。後述のDockerfileセクションで、この問題を解決するコマンドを紹介しています。
DockerfileでTomcat環境を管理する方法
先ほどのdocker runコマンドは手軽ですが、毎回長いオプションを打つのは面倒ですよね。そこで登場するのが「Dockerfile」です。これはコンテナの構成をテキストファイルに書き留めておける、いわば「設計図」のようなものです。
Dockerfileを使うことで、どのバージョンのTomcatを使い、どのファイルをどこに配置するのかをコードとして管理できます。DockerfileをGitなどのバージョン管理システムに入れておけば、チームメンバー全員が同じ設計図をもとに環境を構築できます。設定を「記憶」に頼るのではなく「記録」に残す。これがエンジニアとしての生産性を高めるための第一歩です。
DockerfileでTomcatを定義する基本構成
プロジェクト用のフォルダを作成し、その中に Dockerfile という名前のファイル(拡張子なし)を作成してください。中身は以下のように記述します。
FROM tomcat:10-jdk17
LABEL maintainer="your-name"
# デフォルトで入っているwebapps.distをwebappsにコピーする(404対策)
RUN cp -av /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/
EXPOSE 8080FROMでベースとなるイメージを指定します。RUNの行は、先ほどブラウザで404が出た問題を解決するための魔法の言葉です。最近のイメージではサンプルアプリが別フォルダに隔離されているので、それを本来の場所に戻してあげています。
イメージをビルドしてコンテナを起動する流れ
設計図ができたら、それを元に「自分専用のイメージ」を作ります。以下のコマンドでビルドを行いましょう。
docker build -t my-tomcat .末尾の「.(ドット)」を忘れないように注意してください。ビルドが終わったら、今度は自分のイメージを指定して起動します。
docker run -p 8080:8080 my-tomcatこれで、毎回長いオプションを指定しなくても、自分好みにカスタマイズされたTomcatが立ち上がります。一度作ってしまえば、あとは使い回すだけ。この圧倒的な効率の良さが、Dockerを使い続ける最大の理由です。
WARファイルをTomcatコンテナにデプロイする手順
サーバーが動くだけでは面白くありませんよね。自分の作ったWebアプリ(WARファイル)を載せてこそ本番です。Dockerを使えば、アプリの配備(デプロイ)もDockerfileの中で完結します。
従来の方法では、Tomcatのインストールディレクトリを探し出し、webappsフォルダに手動でファイルを放り込んでいました。しかしDockerなら、ビルド時にファイルをコピーするよう指示するだけです。これにより、「デプロイ手順書」という名の古いドキュメントをシュレッダーにかけることができます。
WARファイルをDockerコンテナに配置する手順
やり方はとても簡単です。Dockerfileに1行追加するだけ。あなたのプロジェクトで生成された sample.war がカレントディレクトリにあると仮定します。
FROM tomcat:10-jdk17
COPY sample.war /usr/local/tomcat/webapps/このCOPY命令によって、コンテナが起動したときにはすでにアプリが配置された状態になります。コンテナを起動するたびにデプロイ作業をする必要はありません。コンテナそのものが、あなたのアプリを含んだ「完成品」になるわけです。
アプリが正しくデプロイされたか確認する
イメージをビルドし直してコンテナを起動したら、ブラウザで http://localhost:8080/sample/(WARファイルの名前がsampleの場合)にアクセスしましょう。
もし画面が表示されない場合は、コンテナのログを確認してください。Javaのクラスが見つからない、あるいは設定ファイルのパスが間違っているなどのエラーが出ているはずです。Dockerならログがターミナルに垂れ流されるので、わざわざ深い階層にあるログファイルを開きに行く手間も省けます。不具合の特定が早くなるのも、Docker化の隠れた恩恵です。
Docker ComposeでTomcatを管理する方法
ここまでの手順ではdocker runコマンドを直接実行してきましたが、プロジェクトが大きくなると毎回オプションを指定するのは煩雑です。Docker Composeを使えば、起動設定をYAMLファイルに書いておくだけで、コマンド一発でTomcat環境を立ち上げられます。
docker-compose.ymlの書き方
プロジェクトのルートに docker-compose.yml を作成し、以下のように記述します。
services:
tomcat:
image: tomcat:10-jdk17
container_name: my-tomcat
ports:
- "8080:8080"
volumes:
- ./webapps:/usr/local/tomcat/webappsportsはポートフォワーディング、volumesはホスト側のフォルダをコンテナ内にマウントする設定です。volumesを指定しておけば、ホスト側のwebappsフォルダにWARファイルを置くだけで、コンテナを再ビルドせずにデプロイできます。
起動は以下のコマンドです。-dはバックグラウンド実行のオプションです。
docker compose up -d停止する場合は以下を実行します。コンテナの削除まで一括で行ってくれます。
docker compose downdocker runとDocker Composeの使い分け
「どちらを使えばいいの?」と迷ったときは、目的で判断しましょう。Tomcat単体をサッと動かして動作確認したいならdocker runで十分です。一方、WARのデプロイ設定を固定化したい場合や、将来的にMySQLなど他のコンテナと連携させる予定があるならDocker Composeを選んでおくと拡張しやすくなります。
Tomcat×Dockerのよくあるトラブルと解決策
Dockerを使っていると、必ずと言っていいほど壁にぶつかります。特に「起動しているはずなのに繋がらない」というトラブルは、初心者の登竜門です。私も最初は「Dockerなんて全然便利じゃないじゃないか!」と画面に向かって毒づいたことがありますが、原因はいつも単純な設定ミスでした。
トラブルが起きたときは、感情的にならずに一歩引いて「通信の経路」を想像してみることが大切です。自分のPCからコンテナまで、データがどこで止まっているのかを一つずつ確認していけば、必ず解決策は見つかります。ここでは、私が過去に何度も経験した「あるある」な原因を紹介します。
ポートが開かない・接続できないときの原因
最も多い原因は、-pオプションの指定ミスです。8080:8080と書くべきところを逆にしてしまったり、あるいは他のソフトがすでに8080番ポートを使っていたりすることがあります。
Windowsだと、以前インストールしたTomcatがサービスとして常駐していて、ポートを占有しているパターンがよくあります。もしエラーで起動できない場合は、docker run -p 9000:8080 のように、左側の数字を変えて試してみてください。これでアクセスできれば、原因はポートの競合で確定です。
もう一つ見落としがちなのが、ファイアウォールやセキュリティソフトによるブロックです。特にWindowsでは、Docker Desktopのインストール直後にWindows Defenderファイアウォールがコンテナへの通信を許可していないケースがあります。「ポート設定は合っているのに繋がらない」というときは、ファイアウォールの設定を確認してみてください。
コンテナがすぐ停止する場合に見るべき点
docker runをした直後にコンテナが終了してしまう場合は、Tomcat自体がエラーで落ちています。よくあるのが、メモリ不足やWARファイルの不正です。
まずは docker logs [コンテナID] を実行して、エラーメッセージを読みましょう。英語のメッセージが並んでいて面食らうかもしれませんが、一番下の数行に答えが書いてあることがほとんどです。また、Dockerfileの記述ミスで実行権限が足りない場合もあります。コンテナは「やるべきことがなくなると死ぬ」という性質を持っているので、異常終了したときは必ずその理由を教えてくれているはずです。
ログが長くて読みきれないときは、Caused by:というキーワードを探してください。Javaのスタックトレースでは、この行が根本原因を示しています。最後のCaused by:から読み始めるのが、トラブルシュート最速の近道です。
よくある質問(FAQ)
Q: DockerのTomcatはどのバージョンを選ぶべき?
A: 本番利用や学習用途を問わず、tomcat:10-jdk17のようにTomcatとJavaのバージョンが明示されたタグを選ぶのが安全です。latestは予告なくバージョンが変わるリスクがあるため、安定性を重視するなら避けましょう。
Q: Docker上のTomcatでログはどこに出る?
A: docker logs [コンテナID]コマンドで標準出力のログを確認できます。ホスト側にログファイルを残したい場合は、-vオプションやdocker-compose.ymlのvolumesで/usr/local/tomcat/logsをマウントしてください。
Q: Docker ComposeとDockerfileの違いは?
A: Dockerfileは「イメージの設計図」で、どのOSにどのソフトを入れるかを定義します。Docker Composeは「コンテナの起動設定」で、ポートやボリュームなどの実行時オプションをまとめて管理するものです。両者は併用するのが一般的です。
TomcatをDockerで起動する方法のまとめ
ここまで、TomcatをDockerで動かす方法を一通り解説してきました。最初はコマンドや設定ファイルに戸惑うかもしれませんが、一度この快適さを知ると、もう直接インストールする環境構築には戻れなくなるはずです。
Dockerは単なるツールではなく、あなたの「開発に対する姿勢」を変えてくれる存在です。環境を使い捨てにする勇気を持つことで、新しい技術への挑戦がぐっと気楽になります。「壊してもいいんだ」という安心感こそが、エンジニアとしての成長を加速させる一番のスパイスになります。
コンテナは「ペット」ではなく「家畜」のように扱い、調子が悪くなったらすぐに新しいものと取り替える。Dockerfileを資産として育て、いつでもどこでも同じ環境を再現できるようにしておく。この潔さと再現性こそが、これからの時代を生き抜くエンジニアに求められるスキルです。




