1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GCEでDocker環境を作る

Last updated at Posted at 2025-09-27

作成日:2025年9月28日(日)

1.はじめに

会社で生成AIを推進するために様々な検証を行っていますが、会社のルールに従うには多くの手続きが必要です。セキュリティ面や権利問題などの企業倫理を遵守するのは当然ですが、簡単な検証でもプロセスを踏まなければならないことにストレスを感じています。

普段は個人のLinux上のDocker環境で、セキュリティや権利問題をクリアできそうなソフトウェアを検証していますが、NAPT環境でのLinux運用も手間がかかります。

検証は運用コストを低減するためにクラウドネイティブ開発が原則です。AKS(Azure Kubernetes Service)やEKS(Amazon Elastic Kubernetes Service)などを利用したいところですが、これらはマルチコンテナを構成する際にkubectlなどの独自YAMLが必要となり、短時間での検証には向いていません。

そこで、GCE(Google Compute Engine)の無料枠を活用してLinux環境を構築し、Docker Composeを導入することにしました。

2.GCEとは

GCE(Google Compute Engine)はGoogleが提供するIaaS(Infrastructure as a Service)です。クラウド上に仮想マシンを構築でき、多様なOSやスペックから選択できます。GCEの大きな特徴は永久無料枠があることで、小規模な仮想コンピュータを無料で利用できます。

今回はこの永久無料枠を活用して、Ubuntu-24.04にDocker環境を構築します。

新規アカウント向けの無料特典として、特定のリージョンでe2-microインスタンス1台を毎月の利用制限内で無料で使用できます。

Google Compute Engineの永久無料枠

2.1. GCEの永久無料枠の条件

No 項目 条件
1 リージョン オレゴン( us-west1)、アイオワ(us-central1)、サウスカロライナ(us-east1)のいづれか
2 マシンタイプ e2-micro(2 vCPU、1コア、1GBメモリ)
3 ストレージ 標準永続ディスク 30GB
4 ネットワーク 北米から外向きデータ転送が1GB/月まで(中国・豪州は除外)
5 外部IP 1つは永久無料枠
6 稼働時間 720時間(30日の月の場合)
インスタンスを2つ作成しても720時間を越えなければ永久無料枠

2.2. 留意点

  • リージョンを間違えないこと(東京は無料になりません)
  • マシンタイプはe2-micro(非プリエンプティブルインスタンス(プロビジョニングモデルが標準))
  • OSはLinux(Windowsなどの有料OSイメージを使用しない)
  • 標準永続ディスクは30GB/月以内(2台作る場合15GB/台)
  • 稼働時間は月内総時間720時間/月以内(2台作る場合360時間/台も可能)
  • バックアップはCloud Storageの無料枠5GB/月から消費され超えると課金される
  • ネットワーク外向き転送は1GB/月以内

3.GCEインスタンスの作成

GCE(Google Cloud Engine)インスタンスは「VMを作成」メニューか「VMインスタンス」から作成します。

No 大項目 中項目 小項目 条件 備考
1 マシンの構成 - リージョン 以下の米国リージョンのいづれか
オレゴン(米国西海岸): us-west1
アイオワ(米国中央部): us-central1
サウスカロライナ(米国東海岸): us-east1
日本から物理的に距離が近い、米国西海岸にあるオレゴン(us-west1)が低遅延での接続が期待できるためオレゴンを推奨
2 - ゾーン リージョンでオレゴンを選ぶとゾーンは4択となります。
指定なし
us-west1-a
us-west1-b
us-west1-c
3 - マシンタイプ e2-micro(2 vCPU、1コア、1GBメモリ)
vCPU:0.25~2.0 vCPUの共有コア
メインメモリ:1GB
メインメモリ1GBは心もとないですが、ストレージを使った、仮想メモリを使用してメモリ容量は拡張できます。
4 OSとストレージ オペレーティングシステムとストレージ オペレーティングシステム Ubuntu
5 バージョン Ubuntu 24.04 LTS Minimal 沢山の中から選ぶので少しややこしいですが、LTS(Long Term Support)=つまり長期間安定的にサポートするものの最新を選択するのがお薦めです。また、永久無料枠ではストレージ容量が30GBに制限されるので、できるだけサイズが小さなものMinumalを選択します。
2025年9月23日時点ではUbuntu 24.04 LTS Minimalとなります。
6 ブートディスクの種類 標準永続ディスク 「標準永続ディスク」のみ無料となります。デフォルトは「バランス永続ディスク」になっているので、変更します。
7 サイズ 30GB デフォルトでは10GBとなっているので、永久無料枠の最大の30GBに変更します。
8 データ保護 - データをバックアップする バックアップなし バックアッププランを選択するとCloud Storageの無料枠5GB/月が消費され、30GBのバックアップを行うとCloud Storageに課金が発生するため、「バックアップなし」を選びます
9 ネットワーキング - ファイアウォール 以下の2つの項目をチェックします
☑HTTP トラフィックを許可する
☑HTTPS トラフィックを許可する
HTTPトラフィックはテスト用に開放し、後ほど、NginxでSSLを有効にしたら、HTTPSのみを残しHTTPは削除します。
この設定はOSのファイアウォール設定で変更できます。
10 オブザーバビリティ - Opsエージェント ☑モニタリングとロギング用のOpsエージェントをインストールする -
11 セキュリティ - - デフォルトのまま -
12 詳細 - 削除からの保護 デフォルトのまま -
13 予約 デフォルトのまま -
14 自動化 デフォルトのまま -
15 メタデータ デフォルトのまま -
16 データ暗号化 デフォルトのまま -
17 VMプロビジョニング モデル デフォルトのまま
標準
こちらをSpotにしてしまうと非プリエンプティブルインスタンスではなくなり永久無料枠から外れます。

上記のパラメタを設定すると「月間予測」が表示されます。
ここまでの設定で月間予測が$7.31とか$6.11等と表示されますが、こちらは無料枠を加味していない月間予測です。
本当に無料になっているか心配ですが、以下の設定になっていれば請求されることはありません。
正直、ここはかなり不安ですが請求画面を定期的に閲覧して確認しましょう。

リージョン:us-west1(オレゴン)
マシンタイプ:e2-micro
ブートディスク:Ununtu 24.04 LTS Minimal
ブートディスクの種類:標準永続ディスク
ブートディスクの容量:30GB

インスタンスを作成するボタンをクリックします。

しばらくするとインスタンスが作成され、名前をクリックするとブラウザからSSH接続できるようになります。

4.GCEへTeraTermから接続

流れとしては①TeraTermでSSH鍵の生成、②GCEに公開鍵を設定、③TeraTermスクリプトの作成です。

①SSH鍵生成
 TeraTeamで[設定]⇒[SSH鍵生成]を選択し、ED25519を選び「生成」ボタンをおします。

②パスフレーズ・コメントの入力
 鍵のパスフレーズを入力し、コメントに「portfolio997」などのユーザ名を記述します。

※注意:コメントと書いてありますがユーザ名です。

③公開鍵を保存します。
id_ed25519.pubという名前で指定したフォルダにファイルが生成されます。

④秘密鍵を保存します。

id_ed25519という名前で指定したフォルダにファイルが生成されます。

4.2. id_ed25519.pubをGCEインスタンスにアップロード

Google Cloudコンソールに接続してVMインスタンスから対象のVMを開き「編集」ボタンを押して「SSH認証鍵」に生成したid_ed25519.pubの内容を貼り付けます。

Google Cloudコンソールで公開鍵を設定すると、authorized_keysファイルが作られます。

portfolio997@instance-20250922-213313:~$ ls -l ~/.ssh/authorized_keys 
-rw------- 1 portfolio997 portfolio997 112 Sep 23 01:14 /home/portfolio997/.ssh/authorized_keys
portfolio997@instance-20250922-213313:~$ 

4.3. TeraTeamスクリプトの作成

次に以下のようなTeraTermスクリプトを作成して、GCP_ubuntu-24.04_ssh.ttlなどの名前で保存します。

; Tera Term Macro Script
; 自動接続用

hostname = '<IPアドレス>'
username = 'portfolio997'
passphrase = '<ed25519鍵生成時のパスフレーズ>'
privatekey = 'C:\Users\portf\Downloads\potofo-sshkey\ed25519\id_ed25519' ; 秘密鍵です。id_ed25519.pub(公開鍵)ではありません。

; SSH接続を開く
cmdline = '/ssh2 /auth=publickey /user='
strconcat cmdline username
strconcat cmdline ' /keyfile='
strconcat cmdline privatekey
strconcat cmdline ' /passwd='
strconcat cmdline passphrase
strconcat cmdline ' '
strconcat cmdline hostname

connect cmdline

; プロンプトの表示を待機(最大10秒)
timeout = 10
wait 'portfolio997@instance-20250922-213313:~$'

; 表示されたら sudo su - を送信
sendln 'sudo su -'

TeraTermスクリプトを実行すればローカルPCからGCEインスタンスに接続できます。

5.仮想メモリの設定

GCEを永久無料枠で作成した関係で、メモリは1GiB、ストレージは30GiBの容量しかありません。
実際にtopコマンド、dfコマンドで確認すると以下のようにメモリは958MiB利用中、ストレージは2.5GiB利用中となっています。

このままではマルチコンテナを動作させるのにメモリが不足するので、4GiB程度の仮想メモリを作成します。

top - 01:45:51 up  2:47,  4 users,  load average: 0.00, 0.04, 0.02
Tasks: 123 total,   1 running, 122 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    **958.5 total**,    **186.5 free**,    431.5 used,    494.0 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    527.0 avail Mem
root@instance-20250922-213313:~# df -h --total
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  2.5G   26G   9% /
tmpfs           480M     0  480M   0% /dev/shm
tmpfs           192M  1.1M  191M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
efivarfs         56K   24K   27K  48% /sys/firmware/efi/efivars
/dev/sda16      881M   48M  772M   6% /boot
/dev/sda15      105M  6.2M   99M   6% /boot/efi
tmpfs            96M  8.0K   96M   1% /run/user/1001
total            30G  2.5G   28G   9% -
root@instance-20250922-213313:~#

5.1. 仮想メモリの確認

仮想メモリは「swapon —show」コマンドで確認できるので、確認してみます。
以下のようにデフォルトではなにも設定されていないことが分かります。

root@instance-20250922-213313:~# swapon --show
root@instance-20250922-213313:~#

5.2. 仮想メモリファイルの作成

「fallocate -l 4G /swapfile」コマンドで/swapfileに4GiBの仮想メモリファイルを作成します。
一般ユーザから仮想メモリファイルを壊されてはいけないので、/swapfileはrootのRead/Write可能(chmod 600 /swapfile)に設定しておきます。
ストレージから4GiB減ったことが確認できます。

root@instance-20250922-213313:~# fallocate -l 4G /swapfile
root@instance-20250922-213313:~# ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Sep 23 01:51 /swapfile
root@instance-20250922-213313:~# chmod 600 /swapfile
root@instance-20250922-213313:~# df -h --total
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  6.5G   22G  23% /
tmpfs           480M     0  480M   0% /dev/shm
tmpfs           192M  1.1M  191M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
efivarfs         56K   24K   27K  48% /sys/firmware/efi/efivars
/dev/sda16      881M   48M  772M   6% /boot
/dev/sda15      105M  6.2M   99M   6% /boot/efi
tmpfs            96M  8.0K   96M   1% /run/user/1001
total            30G  6.5G   24G  22% -
root@instance-20250922-213313:~#

5.3. スワップの割り当て

作成した仮想メモリファイルをスワップ(仮想メモリ)として設定します。

root@instance-20250922-213313:~# mkswap /swapfile
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=a4fd5a42-d5c2-4789-844b-eae5cd1b3468
root@instance-20250922-213313:~# swapon /swapfile
root@instance-20250922-213313:~# 

5.4. メモリの確認

topコマンドでメモリの割り当てとスワップ容量を確認します。
スワップに4096MiB(4GiB)の容量がアサインされたことがわかります。

top - 02:08:15 up  3:09,  4 users,  load average: 0.00, 0.00, 0.00
Tasks: 123 total,   1 running, 122 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    958.5 total,    257.9 free,    424.6 used,    429.5 buff/cache
MiB Swap:   **4096.0 total**,   4096.0 free,      0.0 used.    533.9 avail Mem

6.Dockerのインストール

Ubuntu 24.04 LTS minimalのデストリビューションはdockerをサポートしていますので、aptコマンドでそのままインストールすることもできますが、最新版を導入するためにはDockerのGPGキーをインストールして、Dockerのリポジトリから最新版を導入する必要があります。
ここでは最新版の導入方法を記載します。

6.1. OSのアップデート

パッケージインストールの前にOSを最新状態にします。

root@instance-20250922-213313:~# apt update
Hit:1 http://us-west1.gce.archive.ubuntu.com/ubuntu noble InRelease
Hit:2 http://us-west1.gce.archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:3 http://us-west1.gce.archive.ubuntu.com/ubuntu noble-backports InRelease
Hit:4 https://packages.cloud.google.com/apt google-cloud-ops-agent-noble-2 InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
9 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@instance-20250922-213313:~#

6.2. 依存パッケージをインストール

公式GPGキーのダウンロードに必要な依存パッケージをインストールします。

root@instance-20250922-213313:~# apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ca-certificates is already the newest version (20240203).
ca-certificates set to manually installed.
curl is already the newest version (8.5.0-2ubuntu10.6).
curl set to manually installed.
The following additional packages will be installed:
  appstream dirmngr gir1.2-packagekitglib-1.0 gpg gpg-agent gpgconf iso-codes libappstream5 libcurl3t64-gnutls libduktape207 libglib2.0-bin libglib2.0-data
  libgstreamer1.0-0 libksba8 libpackagekit-glib2-18 libpolkit-agent-1-0 libpolkit-gobject-1-0 libstemmer0d libunwind8 libxmlb2 packagekit packagekit-tools
  pinentry-curses polkitd python3-software-properties sgml-base shared-mime-info xml-core
 
... 中略 ...

Created symlink /etc/systemd/user/sockets.target.wants/pk-debconf-helper.socket → /usr/lib/systemd/user/pk-debconf-helper.socket.
Setting up packagekit-tools (1.2.8-2ubuntu1.2) ...
Setting up software-properties-common (0.99.49.3) ...
Processing triggers for dbus (1.14.10-4ubuntu4.1) ...

6.3. GPGキーをダウンロード

Docker公式のGPGキーをダウンロードします。

root@instance-20250922-213313:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK
root@instance-20250922-213313:~#

6.4. Dockerリポジトリを追加

lsb_releaseでアーキテクチャを調べて、Dockerリポジトリを登録します。

途中で継続するかキャンセルするかを「Press [ENTER] to continue or Ctrl-c to cancel.」というメッセージで質問されますのでEnterキーを押します。

root@instance-20250922-213313:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Repository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu noble stable'
Description:
Archive for codename: noble components: stable
More info: https://download.docker.com/linux/ubuntu
Adding repository.
Press [ENTER] to continue or Ctrl-c to cancel.
Adding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-noble.list

... 中略 ...

Fetched 5105 kB in 3s (2000 kB/s)
Reading package lists... Done
W: https://download.docker.com/linux/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
root@instance-20250922-213313:~#

6.5. Dockerのインストール

Dockerコミュニティエディション、CLI、コンテナデーモンをインストールします。
途中で継続するかを「Do you want to continue? [Y/n]」というメッセージで質問されますので’y’キー入力してEnterキーを押します。

root@instance-20250922-213313:~# apt update
Hit:1 http://us-west1.gce.archive.ubuntu.com/ubuntu noble InRelease
Hit:2 http://us-west1.gce.archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:3 http://us-west1.gce.archive.ubuntu.com/ubuntu noble-backports InRelease
Hit:4 https://download.docker.com/linux/ubuntu noble InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Hit:6 https://packages.cloud.google.com/apt google-cloud-ops-agent-noble-2 InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
9 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: https://download.docker.com/linux/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
root@instance-20250922-213313:~# apt install docker-ce docker-ce-cli containerd.io
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  docker-buildx-plugin docker-ce-rootless-extras docker-compose-plugin git git-man iptables less liberror-perl libgdbm-compat4t64 libgdbm6t64 libip4tc2
  libip6tc2 libjansson4 libnetfilter-conntrack3 libnfnetlink0 libnftables1 libnftnl11 libperl5.38t64 libslirp0 nftables perl perl-modules-5.38 pigz
  slirp4netns
Suggested packages:
  cgroupfs-mount | cgroup-lite docker-model-plugin git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn
  firewalld gdbm-l10n perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libtap-harness-archive-perl
The following NEW packages will be installed:
  containerd.io docker-buildx-plugin docker-ce docker-ce-cli docker-ce-rootless-extras docker-compose-plugin git git-man iptables less liberror-perl
  libgdbm-compat4t64 libgdbm6t64 libip4tc2 libip6tc2 libjansson4 libnetfilter-conntrack3 libnfnetlink0 libnftables1 libnftnl11 libperl5.38t64 libslirp0
  nftables perl perl-modules-5.38 pigz slirp4netns
0 upgraded, 27 newly installed, 0 to remove and 9 not upgraded.
Need to get 118 MB of archives.
After this operation, 510 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://us-west1.gce.archive.ubuntu.com/ubuntu noble/main amd64 libip4tc2 amd64 1.8.10-3ubuntu2 [23.3 kB]

6.6. バージョン確認

正しくインストールできるとDockerのバージョン28.4.0がインストールされます。(2025/9/23時点)

root@instance-20250922-213313:~# docker --version
Docker version 28.4.0, build d8eb465
root@instance-20250922-213313:~# docker compose version
Docker Compose version v2.39.4
root@instance-20250922-213313:~#

6.7. Dockerの動作確認

Docker Compose環境が正しく構築できたかを確認するためにPlantUML Serverを動かしてみます。

①/docker/plantuml-server/docker-compose.yml
PlantUML Serverを起動するためのdocker-compose.ymlファイルを以下のように作成します。

version: '3.7'

services:
  plantuml-server:
    image: plantuml/plantuml-server
    ports:
      - 80:8080

②docker composeの実行

docker-compose.ymlファイルがおいてあるフォルダでdocker compose up -d コマンドでPlantUML Serverを実行します。
初回はdockerイメージファイルをダウンロードするため、少し時間が掛ります。

root@instance-20250922-213313:/docker/plantuml-server# docker compose up -d

③Web確認

http://<外部IP>にアクセスするとPlantUML Serverが表示されます。

7.静的外部IPの割り当て

GCEでは外部IPが無料で利用できますが、こちらはエフェメラルとしてインスタンス起動時に一時的に割り当てられるIPアドレスです。
外部IPでもインターネット通信は可能ですが、ドメインに割り当てたり、サーバ証明書を設定する際には固定の静的外部IPアドレスが必要です。

外部IP(エフェメラル)は静的外部IP(Static)にオンライン中に昇格できるので、以下のメニューか実施します。

[VPCネットワーク]⇒[IPアドレス]でアクセスタイプが「外部」になっている外部IPの右端の三点リーダから「静的IPアドレスに昇格」を選択し
IPアドレスの昇格ダイヤログで名前を付与します。

外部IPの種類が「エフェメラル」から「静的」に変更されたことが確認できます。
グローバルIP

8.AWS route 53でのドメイン割り当て

ドメインの維持にはAWSのRoute 53が比較的安価でお勧めです。.netドメインなどは年間17.00USDで維持できます。
AWS route 53で新規ドメインの払い出し方法は割愛しますが、「Route 53」を検索して、「ドメインを登録」から簡単に作成できます。
今回は既に作成済みのドメインにAレコードを追加します

①Aレコードの作成

②DNS名でアクセス
 先ほどDockerで構築したPlantUML Serverにドメイン名でアクセスできることを確認します。

9.nginxのインストール

コンテナアプリを扱う場合、サーバー証明書の設定がコンテナごとに異なる問題があります。この解決策として、Nginxコンテナをフロントに配置し、バックエンドに本来のサービスを置くことで、Nginx側でサーバー証明書を一元管理できます。
この方法により、バックエンドサービスが変更されてもHTTPS通信設定はそのまま利用できます。

手順としては、まずnginxをポート80で動作させてLet's Encryptの.well-known/acme-challengeへのアクセスを許可し、その後ポート443の設定を有効にします。

📁/docker/nginx
 ┗📁certbot-www
  ┗📁.well-known
   ┗📁acme-challenge
 ┗📁letsencrypt
 ┗📁nginx
  ┗nginx.conf
 ┗do_run.sh
 ┗do_subscribe.sh
 ┗do_renew.sh
 ┗docker-compose.yml
 ┗nginx.conf
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./letsencrypt:/etc/letsencrypt
      - ./certbot-www:/var/www/certbot

    extra_hosts:
      - "host.docker.internal:host-gateway"
  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./letsencrypt:/etc/letsencrypt
      - ./certbot-www:/var/www/certbot
    # ふだんは起動不要(初回取得や更新時に都度実行)
    entrypoint: ["true"]
    # 更新時
    # docker compose run --rm certbot \
    #  certonly --webroot -w /var/www/certbot \
    #  -d potofo.net -d www.potofo.net \
    #  --email nagura@d6.dion.ne.jp --agree-tos --no-eff-email
docker compose run --rm \
  --entrypoint certbot \
  certbot \
  certonly --webroot -w /var/www/certbot \
  -d potofo.net -d www.potofo.net \
  --email nagura@d6.dion.ne.jp --agree-tos --no-eff-email
docker compose up -d nginx
docker compose run --rm certbot renew --webroot -w /var/www/certbot && docker compose exec nginx nginx -s reload
user                    nginx;
worker_processes        auto;

events { worker_connections  1024; }

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile      on;

    server {
        listen          80;
        server_name     potofo.net;

        location ^~ /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }
    #server {
    #    listen 443 ssl;
    #    server_name potofo.net www.potofo.net;

    #    ssl_certificate     /etc/letsencrypt/live/potofo.net/fullchain.pem;
    #   ssl_certificate_key /etc/letsencrypt/live/potofo.net/privkey.pem;

        # 推奨の最低限
    #    ssl_protocols TLSv1.2 TLSv1.3;
    #    ssl_prefer_server_ciphers on;

        # ここにアプリの配信設定
    #    root /usr/share/nginx/html;
    #    index index.html;

    #    location / {
    #        proxy_pass http://host.docker.internal:8080;

    #        proxy_set_header Host              $host;
    #        proxy_set_header X-Real-IP         $remote_addr;
    #        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    #        proxy_set_header X-Forwarded-Proto $scheme;

    #       proxy_http_version 1.1;
    #        proxy_set_header Upgrade    $http_upgrade;
    #        proxy_set_header Connection $connection_upgrade;
    #    }
    #}

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
}
root@instance-20250922-213313:/docker/nginx/certbot-www# mkdir .well-known
root@instance-20250922-213313:/docker/nginx/certbot-www# mkdir .well-known/acme-challenge

9.1. nginxを起動

10.Let's Encryptでサーバ証明書発行

HTTP通信によるWebサーバとWebブラウザ間の接続は可能ですが、セキュリティ面で安全ではありません。特にインターネット経由の接続では、認証時にパスワードが暗号化されずに平文で送信され、通信が監視されると情報漏洩のリスクが高まります。

この問題を解決するため、Let's Encryptという認証機関からサーバ証明書を発行し、その正当性を保証してもらいます。

サーバ証明書の導入により、WebサーバとWebブラウザ間でHTTPS通信が可能になり、データが暗号化されます。ただし、Let's Encryptは無料である代わりに、証明書の有効期限が3ヶ月と短く、定期的な更新が必要です。

最近は証明書を自動的に更新するプログラムも利用できるので、そちらを活用するのが良いでしょう。

Let’s Encryptでのサーバ証明書発行の流れ

①certbotのインストール
 Let’s Encrypyの公式クライアントであるcertbotをインストールします

apt update
apt install certbot

②サーバ証明書の発行

docker compose run --rm \
  --entrypoint certbot \
  -v "$PWD/letsencrypt:/etc/letsencrypt" \
  -v "$PWD/certbot-www:/var/www/certbot" \
  certbot \
  certonly --webroot -w /var/www/certbot \
  -d potofo.net -d www.potofo.net \
  --email nagura@d6.dion.ne.jp --agree-tos --no-eff-email

③サーバ証明書の確認

 /docker/nginx/letsencrypt/liveフォルダが作成されていれば成功です。

参考:https://chatgpt.com/share/e/68d253fc-76f8-800c-b113-83b4c0118986

11.nginxで443ポートの起動

./letsencrypt/liveフォルダにサーバー証明書が作成されたら、nginx.confの443を有効にしてdocker compose up -dします。

①nginx.confで443を有効化

user                    nginx;
worker_processes        auto;

events { worker_connections  1024; }

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile      on;

    server {
        listen          80;
        server_name     potofo.net;

        location ^~ /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }
    server {
        listen 443 ssl;
        server_name potofo.net www.potofo.net;

        ssl_certificate     /etc/letsencrypt/live/potofo.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/potofo.net/privkey.pem;

        # 推奨の最低限
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        # ここにアプリの配信設定
        root /usr/share/nginx/html;
        index index.html;

        location / {
            proxy_pass http://host.docker.internal:8080;

            proxy_set_header Host              $host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_http_version 1.1;
            proxy_set_header Upgrade    $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
}

12.まとめ

GCEを利用したDocker環境の構築手順について詳細に解説してきました。Google Cloudの無料枠を活用し、GCEインスタンスを作成してSSH接続の設定やDockerのインストール、Nginxの導入までを順を追って説明しています。この手順に従えば、クラウド上に安全で柔軟なDocker環境を構築でき、様々なアプリケーションをデプロイして検証することが可能になります。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?