皆さま、こんにちは!h.serizawaです。
私はプライベートでOCI上に人狼ゲームをはじめとした複数のゲームが遊べるゲームサーバーを構築・運用しています。
今回はそのゲームサーバーを題材に、コンテナ技術(Docker)を使ってOCIからAWSへ移植してみました。
「コンテナって何がいいの?」「クラウドをまたいで動くって本当?」という疑問を、実際に手を動かしながら解説していきます。
目次
コンテナとは何か
コンテナを一言で表すと、「アプリとその動作に必要な環境をひとまとめにしたパッケージ」です。現環境をそのままコピーして、別環境(クラウドやサーバ、PC)でも動かすことができる技術です。
仮想マシンとの違いをざっくり整理するとこうなります。
| 比較項目 | 仮想マシン(VM) | コンテナ |
|---|---|---|
| 起動時間 | 数分 | 数秒 |
| サイズ | GBオーダー(OS込み) | MBオーダー |
| 移植性 | 環境に依存しやすい | どこでも同じように動く |
| ホストOSとの関係 | ゲストOSを丸ごと仮想化 | ホストOSのカーネルを共有 |
コンテナの最大の強みは「移植性」です。OCI上でビルドしたコンテナイメージをAWSに持っていって、そのまま起動できる。今回はそれを実際のゲームサーバーで行います。
今回やること
OCIで動いているNode.jsのゲームサーバー(インスタンス)をDockerコンテナ化し、そのイメージをAWS EC2でも動かします。
まず現在のサーバーの状態です。PM2というプロセスマネージャーで管理して稼働中です。
| 項目 | OCI(元の環境) | AWS(移植先) |
|---|---|---|
| インスタンス | VM.Standard.E2.1.Micro | EC2 t3.micro |
| OS | Ubuntu 22.04 LTS | Amazon Linux 2023 |
| アーキテクチャ | AMD x86_64 | AMD x86_64 |
| アプリ管理 | PM2 | Docker |
ポイントは2つあります。
・AMD x86_64アーキテクチャを選ぶこと。
・OSをあえて変えること。
OCI側はUbuntu、AWS側はAmazon Linux 2023と異なるOSを使うことで、「OSが違っても同じコンテナが動く」というコンテナの移植性を確認します。
Step 1:OCI上にDockerをインストールする
まず既存のOCIゲームサーバーにDockerを追加します。Ubuntu 22.04にはDockerが標準搭載されていないため、公式インストールスクリプトを使います。既存のPM2やサーバーには影響しません。
sudo apt-get update
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ubuntu
exit
# 再ログイン後
docker --version
補足
sudo usermod -aG docker ubuntu でubuntuユーザーをdockerグループに追加しています。
これにより以降のdockerコマンドをsudoなしで実行できます。
設定を反映するため、一度ログアウトして再接続が必要です。
Step 2:Dockerfileと.dockerignoreを作成する
Dockerfileはコンテナイメージの設計図です。ゲームサーバーのディレクトリに2つのファイルを追加するだけです。
Dockerfileの作成
vi /home/ubuntu/werewolf/Dockerfile
以下の内容を入力します。
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE XXXX
CMD ["node", "server.js"]
Dockerfileの定義項目
| 内容 | 意味 |
|---|---|
FROM node:20-alpine |
Node.js 20の軽量ベースイメージを使用(実際の環境に合わせてv20を指定) |
WORKDIR /app |
コンテナ内の作業ディレクトリを指定 |
COPY package*.json ./ |
依存関係ファイルを先にコピー(ビルドキャッシュ活用で高速化) |
RUN npm install --production |
本番用パッケージのみインストール(開発用を除外して軽量化) |
COPY . . |
アプリ全体をコピー |
EXPOSE XXXX |
使用するポートXXXXを宣言 |
CMD ["node", "server.js"] |
コンテナ起動時に実行するコマンド |
補足
package*.json を先にCOPYして npm install を実行しているのは、Dockerのレイヤーキャッシュを活用するためです。
パッケージに変更がない限り npm install のレイヤーがキャッシュされるため、2回目以降のビルドが大幅に速くなります。
.dockerignoreの作成
vi /home/ubuntu/werewolf/.dockerignore
以下の内容を入力します。
node_modules/
npm-debug.log
.git/
補足
node_modules/ はDockerfile内の npm install で自動生成されるため、ホスト側のものをコンテナに持ち込む必要はありません。
除外することでビルド時間の短縮とイメージサイズの削減ができます。
.git/ を除外することで開発履歴が本番イメージに混入するのを防ぎます。
Step 3:イメージをビルドしてOCIで動作確認
docker build コマンドでDockerfileからイメージを生成します。
cd /home/ubuntu/werewolf/
docker build -t werewolf:latest .
docker images | grep werewolf
OCI上で起動して動作確認します。実際のポートはPM2のサーバーが使用中のため、テスト用にホスト側ポートを変えて起動します(コンテナ内部は実際の使用ポートのまま)。
docker run -d \
--name werewolf-container \
-p XXXX:XXXX \
--restart unless-stopped \
werewolf:latest
docker ps
docker logs werewolf-container
補足
-p XXXX:XXXX は「ホスト側ポート → コンテナ内ポート」のマッピングです。
既存のPM2で動いているゲームサーバーを止めずにテストできます。
docker ps で「Up」状態、docker logs に「人狼サーバー起動」と表示されればOKです。
Step 4:Docker Hubにアップロードして移植準備
OCI上でビルドしたイメージをDocker Hub(パブリックなコンテナレジストリ)にアップロードします。Docker Hubに置くことで、インターネットにアクセスできるどのサーバーからでも docker pull できるようになります。
まず https://hub.docker.com/ にアクセスしてアカウントを作成します(「Sign Up」から登録)。
アカウント作成後、OCIサーバーのターミナルからログインします。ターミナルにワンタイムコードとURLが表示されるので、ブラウザでURLにアクセスしてコードを入力すると認証が完了します。
docker login
補足
ターミナルにワンタイムコードとURLが表示されます。
ブラウザでそのURLにアクセスしてコードを入力すると認証が完了し、「Login Succeeded」と表示されます。
続いてイメージにタグを付けてDocker HubへPushします。
docker tag werewolf:latest your-username/werewolf:latest
docker push your-username/werewolf:latest
補足
your-username の部分はご自身のDocker Hubユーザー名に置き換えてください。
docker tag でDocker Hubのリポジトリ名に対応したタグを付け、docker push でアップロードします。
補足
⚠️ Docker Hubのパブリックリポジトリはインターネット上に公開されます。
ソースコードを公開したくない場合は検証後にリポジトリを削除するか、有料プランのプライベートリポジトリのご利用をご検討ください。
Step 5:AWS EC2で同じイメージを起動する
セキュリティグループの作成
AWSコンソールからセキュリティグループを作成し、SSHとゲームサーバーのポートを開放します。
EC2インスタンスの起動
以下の表に記載したパラメータでEC2インスタンスを作成します。
| 項目 | 値 |
|---|---|
| AMI | Amazon Linux 2023 |
| インスタンスタイプ | t3.micro |
| キーペア | 新規作成(.pem形式) |
| セキュリティグループ | 上記で作成したもの |
| ストレージ | 8GiB gp3(無料枠内) |
| パブリックIPの割り当て | 有効化 |
補足
OCI側と同じAMD x86_64アーキテクチャを選択することで、プラットフォームの違いによるコンテナの動作不具合を排除します。
OSはあえてAmazon Linux 2023(OCI側はUbuntu)を選択。OSが異なってもコンテナが動くことを実証するのが今回のポイントです。
EC2へのSSH接続
chmod 400 ~/path/to/your-key.pem
ssh -i ~/path/to/your-key.pem ec2-user@18.181.184.137
補足
.pem キーファイルのパーミッションを400(オーナーのみ読み取り可)に変更しないとSSH接続がエラーになります。
ec2-user はAmazon Linux 2023のデフォルトユーザー名です。

DockerのインストールとコンテナのPull・起動
Amazon Linux 2023ではパッケージマネージャーがaptではなくdnfです。これがOCI(Ubuntu)との違いの一つですが、コンテナ側は関係ありません。
sudo dnf install -y docker
sudo systemctl start docker
sudo usermod -aG docker ec2-user
exit
# 再ログイン後
docker --version
補足
Amazon Linux 2023ではDockerサービスはインストール後に手動で起動する必要があります(sudo systemctl start docker)。
ec2-user をdockerグループに追加して sudo なしでdockerコマンドを実行できるようにします。
グループ変更を反映するため、一度ログアウトして再接続してください。
docker run -d \
--name werewolf-container \
-p XXXX:XXXX \
--restart unless-stopped \
your-username/werewolf:latest
docker ps
docker logs werewolf-container
補足
docker run コマンドはイメージがローカルにない場合、自動的にDocker Hubからpullします。
ブラウザでアクセスして動作確認します。
http://[EC2のパブリックIP]:[ポート番号]/werewolf.html
Dockerfileを書き直す必要も、npm install を再実行する必要もありません。OCI(Ubuntu)上でビルドしたイメージが、OSの異なるAWS(Amazon Linux 2023)でそのまま動きました。
まとめ
今回はOCI上で運用中のゲームサーバーをコンテナ化してAWSへの移植を通じて、コンテナ技術の基礎をご紹介しました。
| ポイント | 内容 |
|---|---|
| コンテナの移植性 | OCIでビルドしたイメージがOSの異なるAWSでもそのまま動く |
| 既存環境への影響 | DockerはPM2と共存可能。運用中のサーバーを止めずに検証できる |
| Dockerfileの役割 | アプリの実行環境をコードで定義。どのクラウドでも再現できる |
ここまで読んでいただき、ありがとうございました。
今回はプライベートで運用しているゲームサーバーを題材に、OCIからAWSへのコンテナ移植に挑戦しました。「既存のサーバーを止めずにコンテナ化したい」「クラウドをまたいで同じアプリを動かしたい」といった場面での参考にしていただければと思います。
コンテナ技術を活用したクラウド移植を検討する際の一例としてご参考になれば幸いです。
最後まで読んでいただき、ありがとうございました。







