本ページはプロモーションが含まれています

Docker

TomcatをDockerで起動する手順!環境を汚さない構築法

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

昔の私は、新しい技術を触るたびに自分のPCをゴミ箱のように汚していました。Javaのバージョンを切り替えるたびに環境変数の設定で1日を溶かし、やっと動いたと思ったら別のアプリが動かなくなる。そんな不毛な時間に絶望していた時期が私にもあります。

この記事は、過去の自分と同じように「環境構築で消耗したくない」と考えているあなたに向けて書きました。私は数年前から全ての開発環境をDockerへ移行しましたが、控えめに言っても人生が変わりました。

この記事を読めば、あなたのPCを綺麗な状態に保ったまま、わずか数分でTomcatを立ち上げられるようになります。単にコマンドを書き写すだけでなく、なぜその操作が必要なのかという仕組みまで理解できるはずです。もう二度と「私の環境では動くのに」なんていう悲しいセリフを吐かなくて済む未来を手に入れましょう。

なぜTomcatをDockerで起動するのかを最初に整理する

ローカル環境を汚さずに開発を進めることは、エンジニアにとって最も重要な「身だしなみ」だと言えます。かつての私は「直接インストールしたほうが早い」と豪語していましたが、それは大きな間違いでした。直接インストールを繰り返すと、OSの深いところに不要なファイルが蓄積され、動作が重くなる原因を作ります。

Dockerを使う最大の理由は、OSから独立した「隔離空間」でTomcatを動かせる点にあります。これによって、古いプロジェクトで必要なJava 8と、最新のJava 21を共存させるような無茶な運用も、コンテナを分けるだけで解決します。物理的なPCの環境は常にクリーンなまま、必要なときだけ必要なバージョンのサーバーを呼び出す。この機動性こそが、現代の開発スタイルにおいて欠かせない要素なのです。

また、チーム開発でのメリットも見逃せません。誰かが作ったDockerfileを共有すれば、新しく入ったメンバーも数秒で全く同じ環境を再現できます。「手順書通りにやったのに動かない」という、あの不毛なチャットのやり取りをこの世から消し去ることができるのです。合理性とメンテナンス性を追求するなら、もはやDockerを使わない選択肢はありません。

ローカルに直接Tomcatを入れると起きがちな問題

ローカルに直接Tomcatを入れると、アンインストールが非常に面倒だという問題に直面します。インストーラーやZIP解凍で配置したファイルは、レジストリや隠しフォルダに設定を残していくことがよくあります。

また、Javaのバージョン競合はプログラミング初心者が最初にぶつかる大きな壁です。Tomcatの特定のバージョンが特定のJavaにしか対応していない場合、OS全体のJavaを書き換える必要が出てきます。これを繰り返すと、OSの環境変数が「秘伝のタレ」のように複雑化し、最終的にOSの再インストールが必要になることさえあります。

DockerでTomcatを動かすと何が楽になるのか

Dockerを使えば、コマンド一つでTomcat環境を丸ごと捨てられるのが最高に気持ちいいです。実験的に設定をいじくり回して壊してしまっても、コンテナを削除して作り直せば、1秒で初期状態に戻ります。

この「失敗してもすぐにやり直せる」という安心感は、学習効率を飛躍的に高めてくれます。さらに、本番環境もDockerであれば、自分のPCで動いたものがサーバーでも確実に動くという保証が得られます。環境の差異に怯えながらデプロイ作業をするストレスから、あなたは永遠に解放されるのです。

TomcatをDockerで動かす全体像をざっくり理解する

DockerでTomcatを動かす仕組みは、よく「引越し用のコンテナ」に例えられます。Tomcatという家具が入った箱を、自分のPCという土地の上にポンと置くようなイメージです。このとき、箱の中の家具(Tomcat)に外からアクセスするためには、箱の壁に「穴(ポート)」を開ける必要があります。

全体像としては、まず「イメージ」と呼ばれるテンプレートを用意し、それを元に「コンテナ」という実体を作ります。イメージはレシピ本、コンテナは実際に出来上がった料理だと考えると分かりやすいでしょう。私たちはDocker Hubという世界最大のレシピサイトから、公式が用意したTomcatのイメージをダウンロードして利用します。

Dockerイメージ・コンテナ・ポートの関係

Dockerイメージは実行に必要な全てのファイルが詰まった静かな塊です。これをdocker runコマンドで実行すると、メモリ上で動き出す「コンテナ」に進化します。

ここで重要なのがポートの設定です。コンテナは内部で8080番ポートを使って待ち構えていますが、外の世界(あなたのPCのブラウザ)からは直接見えません。そのため、PCの8080番とコンテナの8080番を繋ぐトンネルを掘る設定を行います。これをポートフォワーディングと呼び、この設定を忘れるとブラウザで「接続拒否」の画面を見て絶望することになります。

今回の記事でやること・やらないこと

この記事では、Tomcatの公式イメージを取得し、コンテナとして起動するまでの最短ルートを解説します。また、独自のWebアプリ(WARファイル)をコンテナに組み込んで動かす、実践的な手順までを網羅します。

逆に、データベース(MySQLなど)との連携や、複雑なネットワーク構築については扱いません。まずは「Tomcat単体がDocker上で元気に動いている状態」を作ることに集中しましょう。一度に全てを学ぼうとするとパンクしますので、まずは基礎の土台をガッチリと固めることが上達の近道です。

事前準備として必要な環境を整える

まずは道具が揃っているか確認しましょう。何事も準備が8割です。Dockerさえ動けば、あとはどうにでもなります。もし、まだDocker Desktopをインストールしていない場合は、公式サイトからダウンロードして、クジラのアイコンがタスクバーで泳いでいる状態にしてください。

ここで注意したいのが、Dockerのバージョンです。あまりに古すぎると最新のイメージが動かないことがありますが、2024年以降のバージョンであれば問題ありません。また、Windowsユーザーの方はWSL 2が有効になっているかも確認しておきましょう。これが有効でないと、Dockerの動作が極端に重くなったり、そもそも起動しなかったりしてストレスが溜まります。

Dockerがインストールされているか確認する

ターミナル(WindowsならPowerShellやコマンドプロンプト)を開いて、以下のコマンドを打ち込んでみてください。

docker --version

これでバージョン番号が表示されれば準備完了です。もし「コマンドが見つかりません」と言われたら、パスが通っていないか、インストールが完了していません。PCを再起動すると直ることも多いので、まずは焦らずに再起動を試してみるのが賢明な判断です。

Tomcat公式Dockerイメージの選び方

Docker Hubには無数のTomcatイメージがありますが、基本的には「Official Image」と書かれたものを選びましょう。タグと呼ばれるバージョン指定にもコツがあります。

何も考えずにlatest(最新版)を使うのは、プロの現場ではあまり推奨されません。なぜなら、ある日突然バージョンが上がって、昨日まで動いていたコードが動かなくなるリスクがあるからです。例えばtomcat:10-jdk17のように、TomcatのバージョンとJavaのバージョンが明示されているタグを選ぶのが、安定性を重視する大人の選択です。

DockerでTomcatを最小構成で起動してみる

それでは、実際にTomcatを動かしてみましょう。細かい設定は後回しにして、まずは「動いた!」という成功体験を味わうことが大切です。以下のコマンドは、Docker界における「Hello World」のようなものです。

ターミナルにコマンドを1行打ち込むだけで、世界中で使われているWebサーバーが自分のPCで動き出します。この手軽さを知ってしまうと、もう重たいインストーラーを実行していた頃には戻れません。ネットワーク環境にもよりますが、イメージのダウンロードを含めても数分で完了するはずです。

docker runコマンドでTomcatを即起動する

以下のコマンドをコピーして、ターミナルで実行してください。

docker run -it --rm -p 8080:8080 tomcat:10

ここで使っているオプションの意味を軽く説明します。-itはコンテナのログを画面に出すため、--rmはコンテナを止めたら自動で削除するための設定です。-p 8080:8080が先ほど説明したポートのトンネル設定です。初回実行時はイメージのダウンロードが始まりますので、コーヒーでも飲みながらゆっくり待ちましょう。

ブラウザでTomcatの起動確認をする

ログに「Server startup in XXX ms」と表示されたら、ブラウザを開いて http://localhost:8080 にアクセスしてみてください。

最近のTomcatイメージは、セキュリティ上の理由で初期状態では「404 Not Found」が表示されることがあります。「えっ、失敗?」と思うかもしれませんが、実はこれが正常な動作である場合が多いです。Tomcatの猫のキャラクターが表示されなくても、サーバー自体が反応していれば、Docker上での起動には成功しています。このあたりの「ちょっと不親切な仕様」も、Tomcatの愛嬌だと思って受け入れましょう。

Dockerfileを使ってTomcatを管理しやすくする

先ほどのdocker runコマンドは手軽ですが、毎回長いオプションを打つのは面倒ですよね。そこで登場するのが「Dockerfile」です。これはコンテナの構成をテキストファイルに書き留めておける、いわば「設計図」のようなものです。

Dockerfileを使うことで、どのバージョンのTomcatを使い、どのファイルをどこに配置するのかをコードとして管理できます。これを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 8080

FROMでベースとなるイメージを指定します。RUNの行は、先ほどブラウザで404が出た問題を解決するための魔法の言葉です。最近のイメージではサンプルアプリが別フォルダに隔離されているので、それを本来の場所に戻してあげています。

あわせて読む

イメージをビルドしてコンテナを起動する流れ

設計図ができたら、それを元に「自分専用のイメージ」を作ります。以下のコマンドでビルドを行いましょう。

docker build -t my-tomcat .

末尾の「.(ドット)」を忘れないように注意してください。ビルドが終わったら、今度は自分のイメージを指定して起動します。

docker run -p 8080:8080 my-tomcat

これで、毎回長いオプションを指定しなくても、自分好みにカスタマイズされたTomcatが立ち上がります。一度作ってしまえば、あとは使い回すだけ。この圧倒的な効率の良さが、Dockerを使い続ける最大の理由です。

Webアプリ(war)をTomcatコンテナで動かす

サーバーが動くだけでは面白くありませんよね。自分の作ったWebアプリ(WARファイル)を載せてこそ本番です。Dockerを使えば、アプリの配備(デプロイ)もDockerfileの中で完結します。

従来の方法では、Tomcatのインストールディレクトリを探し出し、webappsフォルダに手動でファイルを放り込んでいました。しかしDockerなら、ビルド時にファイルをコピーするよう指示するだけです。これにより、「デプロイ手順書」という名の古いドキュメントをシュレッダーにかけることができます。

warファイルをTomcatに配置する方法

やり方はとても簡単です。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化の隠れた恩恵です。

Tomcat×Dockerでつまずきやすいポイント

Dockerを使っていると、必ずと言っていいほど壁にぶつかります。特に「起動しているはずなのに繋がらない」というトラブルは、初心者の登竜門です。私も最初は「Dockerなんて全然便利じゃないじゃないか!」と画面に向かって毒づいたことがありますが、原因はいつも単純な設定ミスでした。

トラブルが起きたときは、感情的にならずに一歩引いて「通信の経路」を想像してみることが大切です。自分のPCからコンテナまで、データがどこで止まっているのかを一つずつ確認していけば、必ず解決策は見つかります。ここでは、私が過去に何度も経験した「あるある」な原因を紹介します。

ポートが開かない・接続できないときの原因

最も多い原因は、-pオプションの指定ミスです。8080:8080と書くべきところを逆にしてしまったり、あるいは他のソフトがすでに8080番ポートを使っていたりすることがあります。

Windowsだと、以前インストールしたTomcatがサービスとして常駐していて、ポートを占有しているパターンがよくあります。もしエラーで起動できない場合は、docker run -p 9000:8080 のように、左側の数字を変えて試してみてください。これでアクセスできれば、原因はポートの競合で確定です。

コンテナがすぐ停止する場合に見るべき点

docker runをした直後にコンテナが終了してしまう場合は、Tomcat自体がエラーで落ちています。よくあるのが、メモリ不足やWARファイルの不正です。

まずは docker logs [コンテナID] を実行して、エラーメッセージを読みましょう。英語のメッセージが並んでいて面食らうかもしれませんが、一番下の数行に答えが書いてあることがほとんどです。また、Dockerfileの記述ミスで実行権限が足りない場合もあります。コンテナは「やるべきことがなくなると死ぬ」という性質を持っているので、異常終了したときは必ずその理由を教えてくれているはずです。

TomcatをDockerで起動する方法のまとめ

ここまで、TomcatをDockerで動かす方法を一通り解説してきました。最初はコマンドや設定ファイルに戸惑うかもしれませんが、一度この快適さを知ると、もう直接インストールする環境構築には戻れなくなるはずです。

Dockerは単なるツールではなく、あなたの「開発に対する姿勢」を変えてくれる存在です。環境を使い捨てにする勇気を持つことで、新しい技術への挑戦がぐっと気楽になります。「壊してもいいんだ」という安心感こそが、エンジニアとしての成長を加速させる一番のスパイスになります。

DockerでTomcatを使うときの考え方の整理

Dockerを使う上で大切なのは、コンテナを「ペット」ではなく「家畜」のように扱うことです。名前をつけて大切に育てるのではなく、調子が悪くなったらすぐに新しいものと取り替える。この潔さが、システムの安定性と運用の楽さに繋がります。

Dockerfileを資産として育て、いつでもどこでも同じ環境を再現できるようにしておくこと。これが、これからの時代を生き抜くエンジニアに求められるスキルです。あなたのPCは、もう二度と「謎のファイル」で溢れかえることはありません。

  • この記事を書いた人
  • 最新記事

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Docker