アルファテックブログ

Docker初心者必見!プロキシ環境での構築方法まとめ

カバー

はじめに

「試してみたいソフトウェアを見つけたので、どこかにサーバーを立てて使い勝手を試したい」
そんなとき、どうしますか?

今回は、Apache Superset というデータ可視化ツールを社内のチーム内で試すことになりました。 はじめは社内にある個人の作業端末に構築していましたが、サーバーを稼働させるとマシンの動作が重くなり他の業務に支障があるため、共有の環境を新しく立てることにしました。 そこで、Azureの仮想マシンを用いて、サーバーを構築することにしました。
この記事で利用するAzureの仮想ネットワークには以下の特徴があります。

ネットワーク概略図

  • VPN接続しているオンプレミスネットワークからのみアクセス可能
  • インターネットへのアクセスはプロキシ経由

このネットワークにサーバーを構築しようとしましたが、サービスのインストール手順を実施するだけではうまくいきませんでした。 そこでこの記事では、インターネットへはプロキシ経由でアクセスする、プライベートな試用サーバーを構築する方法を紹介します。

Apache Superset について

この記事で試用するソフトウェアの例として取り上げる Apache Superset について簡単に紹介し、構築が完了したときの構成を示していきます。

Apache Superset (以下、Superset)は、オープンソースのデータ探索・可視化プラットフォームです。 折れ線グラフ、円グラフ、地理空間チャートなど、さまざまなチャートをノーコードで作成し、それらを組み合わせてダッシュボードを作成できます。多くのデータベースと連携可能で、データベースに直接SQLクエリを実行する機能もあります。

Superset ダッシュボード

Superset のドキュメントによると1、構築方法は大きく分けて3パターンあります。

  • Docker Compose
    • Kubernetes よりシンプルにお試し環境や開発環境を作成
  • Kubernetes
    • プロダクション環境を構築する際のベストプラクティス
  • PyPI
    • コンテナ関連知識は不要だが、Superset 内部コンポーネントをメンテナンスする必要あり

この記事では社内の限られたメンバーで Superset を試すのが目的なので、Docker Compose を使用して構築をおこないます。
Supersetはapp, worker, worker-beat, db, cacheの5つのコンテナによって動作します。構築が完了したときの構成は以下の図のようになります。

したがって、以下の流れで構築していきます。

  • 仮想マシンを作成する
  • ネットワーク設定をする
  • 依存パッケージをインストールする
  • Superset をインストールする
  • 接続確認する

仮想マシンを作成する

Azure portal から仮想マシンを作成します。

  • イメージ:Ubuntu Pro 24.04 LTS -x64 Gen2
  • サイズ:Standard_D2s_v3 -2 vcpu数, 8GiBのメモリ

インスタンスのリージョンおよびネットワークについては、オンプレミスネットワークへ接続可能なものを選択します。
なお実際に検証はしていませんが、イメージにUbuntu Server 24.04 LTSを選択しても問題ないと思います。

ネットワーク設定をする

仮想マシン作成直後の設定ではDNSサーバーは168.63.129.16に設定されています。このIPアドレスはAzure上の名前解決のための機能を提供しています。2

今回作成した仮想マシンはオンプレミスネットワークに接続していますが、168.63.129.16はオンプレミスネットワークについて名前解決をおこなえません。その結果、オンプレミスネットワークにあるHTTPプロキシの名前解決ができずインターネットに接続できません。
そのため、オンプレミスネットワークについて名前解決できるDNSサーバーを参照するように設定変更します。こうすることで、オンプレミスネットワークにあるHTTPプロキシを名前解決できるようになり、プロキシを経由してインターネットに接続できるようになります。

DNS設定変更の図解

Azure portal で、仮想マシンに紐づいているネットワークインターフェイスの設定画面に入ります。
DNSサーバーのラジオボタンは「カスタム」を選び、DNSサーバーのIPアドレスを入力し保存します。

DNSサーバーの設定

依存パッケージをインストールする

仮想マシンにDockerとGitをインストールします。

Terminal window
export http_proxy="http://[プロキシサーバーのホスト名]:[ポート番号]"
export https_proxy="http://[プロキシサーバーのホスト名]:[ポート番号]"
sudo -E apt update # -E : 環境変数を引き継ぐオプション
# これはDockerのインストールに失敗する
# sudo -E apt install docker git

今回のUbuntuイメージでは、Gitはすでにインストールされていました。
Dockerは初期状態のリポジトリからはインストールできないため、公式サイトのインストール手順を参考に、以下の手順でリポジトリを追加してインストールします。3

Terminal window
# GPGキーを保存するディレクトリを作成
sudo install -m 0755 -d /etc/apt/keyrings
# GPGキーを取得
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 公式のDockerリポジトリを追加
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# パッケージリストを更新
sudo -E apt update
# Dockerをインストール
sudo -E apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# sudoなしでDockerを実行できるよう、ユーザをdockerグループに追加
sudo usermod -aG docker $USER
# グループを反映させるため、新しいログインセッションを開く(切断して再接続)
exit

Superset をインストールする

これからDocker上に Superset のイメージをビルドしていきます。 Superset のリポジトリを、バージョンを指定してクローンします。今回は以下の手順46.0.0を指定します。

Terminal window
# Superset のリポジトリをクローンする
git clone --depth=1 https://github.com/apache/superset.git
# バージョンを指定する
export TAG=6.0.0
# 指定したバージョンのタグをcheckoutする
cd superset
git fetch --depth=1 origin tag $TAG
git checkout $TAG

クローンしたリポジトリ内のdocker-compose-image-tag.ymlを使用してDocker ComposeでSupersetを実行しようとすると、コンテナイメージの参照に失敗します。

Terminal window
# コンテナをビルドし起動しようとする
docker compose -f docker-compose-image-tag.yml up
! Image postgres:16 Interrupted 0.1s
! Image apachesuperset.docker.scarf.sh/apache/superset:6.0.0 Interrupted 0.1s
! Image redis:7 Interrupted 0.1s
Error response from daemon: failed to resolve reference "apachesuperset.docker.scarf.sh/apache/superset:6.0.0": failed to do request: Head "https://apachesuperset.docker.scarf.sh/v2/apache/superset/manifests/6.0.0": dial tcp: lookup apachesuperset.docker.scarf.sh on 127.0.0.53:53: server misbehaving

Dockerが事前に設定したDNSサーバーとプロキシを認識できていないため、これらを設定する必要があります。
以下のような/etc/docker/daemon.jsonファイルを作成することで、DNS設定をおこないます。 x.x.x.xy.y.y.yはそれぞれDNSプライマリ/セカンダリIPアドレスです。

/etc/docker/daemon.json
{ "dns": ["x.x.x.x","y.y.y.y"] }

プロキシ設定は、/etc/systemd/system/docker.service.dディレクトリを作成し、以下のような/etc/systemd/system/docker.service.d/http-proxy.confファイルを作成することでおこないます。

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://[プロキシサーバーのホスト名]:[ポート番号]"
Environment="HTTPS_PROXY=http://[プロキシサーバーのホスト名]:[ポート番号]"
Environment="NO_PROXY=localhost,127.0.0.1,::1"

docker サービスを再起動して、設定を反映させます。

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart docker

再びDocker ComposeでSupersetを実行しようとすると、Dockerイメージのビルド中にインターネット接続できずに起動が失敗します。

Terminal window
docker compose -f docker-compose-image-tag.yml up
(前略)
superset_init | × Failed to build `apache-superset @ file:///app`
superset_init | tq▶ Failed to resolve requirements from `build-system.requires`
superset_init | tq▶ No solution found when resolving: `setuptools>=40.9.0`, `wheel`
superset_init | tq▶ Failed to fetch: `https://pypi.org/simple/wheel/`
superset_init | tq▶ Request failed after 3 retries
superset_init | tq▶ error sending request for url (https://pypi.org/simple/wheel/)
superset_init | tq▶ client error (Connect)
superset_init | tq▶ dns error
superset_init | mq▶ failed to lookup address information: Temporary failure in name
superset_init | resolution
Container superset_init Error service "superset-init" didn't complete successfully: exit 1
Container superset_init Error service "superset-init" didn't complete successfully: exit 1
Container superset_init Error service "superset-init" didn't complete successfully: exit 1
superset_init exited with code 1
service "superset-init" didn't complete successfully: exit 1

このため、Dockerビルド実行時にプロキシを使うように設定をおこないます。 docker-compose-image-tag.yml内に以下の記載があるため、docker/.env-localを作成することで環境変数を設定できることがわかります。

superset/docker-compose-image-tag.yml
superset-init:
image: *superset-image
container_name: superset_init
command: ["/app/docker/docker-init.sh"]
env_file:
- path: docker/.env # default
required: true
- path: docker/.env-local # optional override
required: false

docker/.env-localを以下のように作成することで、ビルド中にプロキシを使うように設定します。

superset/docker/.env-local
HTTP_PROXY=http://[プロキシサーバーのホスト名]:[ポート番号]
HTTPS_PROXY=http://[プロキシサーバーのホスト名]:[ポート番号]
NO_PROXY=localhost,127.0.0.1,::1

あらためてdocker compose upを実行します。

Terminal window
docker compose -f docker-compose-image-tag.yml up

しばらく待ち、以下のようなログが繰り返し表示されるようになったらビルドは完了しています。

superset_app | 127.0.0.1 - - [28/Jan/2026:02:15:31 +0000] "GET //health HTTP/1.1" 200 2 "-" "curl/7.88.1"

起動しているコンテナを以下のコマンドで確認します。superset_appなど5つのコンテナが起動していることが確認できます。イメージ名から、指定したバージョンがインストールできていることを確認できます。

Terminal window
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eeafdfc8958 apachesuperset.docker.scarf.sh/apache/superset:6.0.0 "/app/docker/docker-…" 23 minutes ago Up 17 minutes 8088/tcp superset_worker_beat
62727bebcd5c apachesuperset.docker.scarf.sh/apache/superset:6.0.0 "/app/docker/docker-…" 23 minutes ago Up 17 minutes (healthy) 8088/tcp superset_worker
d5ed86e12504 apachesuperset.docker.scarf.sh/apache/superset:6.0.0 "/app/docker/docker-…" 23 minutes ago Up 17 minutes (healthy) 0.0.0.0:8088->8088/tcp, [::]:8088->8088/tcp superset_app
9f0f75d40d8c postgres:16 "docker-entrypoint.s…" 24 minutes ago Up 23 minutes 5432/tcp superset_db
18ceda164aed redis:7 "docker-entrypoint.s…" 24 minutes ago Up 23 minutes 6379/tcp superset_cache

「意図しないバージョンのコンテナが起動していたので、docker compose upをやり直したい」といった場合は以下のコマンドでコンテナおよびイメージをすべて削除できます。
私が実施した際は環境変数TAGが未設定の状態でdocker compose upを実行してしまい、タグが付いていない最新のバージョンで起動していたのでやり直しました……。

Terminal window
# やり直したい場合(注:コンテナおよびイメージがすべて削除されます)
docker compose down --rmi all --volumes

接続確認する

オンプレミス環境の端末からブラウザでhttp://(仮想マシンのIPアドレス):8088にアクセスします。
以下のようなログイン画面が表示されたら構築完了です。おつかれさまでした。

Superset ログイン画面

まとめ

オンプレミスネットワークに接続した Azure の仮想マシンにて、Docker Compose を用いた Superset サーバー構築ができました。構築時のポイントをまとめると次のようになります。

  • 必要に応じて、ホストOSのDNS設定をオンプレのサーバーに変更し、リポジトリアクセスのためのプロキシ設定をする
  • Docker にもDNS設定やプロキシ設定をする  
  • Docker ビルドの際に、イメージ取得時にインターネットアクセスがあるため、プロキシ設定をする

また、ビルド中に一時ファイルのアンマウントに失敗することがありました。これはホストにインストールされたセキュリティソフトの影響とみられ、セキュリティソフトを一時的に停止した状態でビルドをおこなうことで成功しました。

ビルド中にプロキシを使う設定が必要であることを特に見落としやすく、今回の構築を通した学びとなりました。 Superset サーバーに限らず、Docker Compose を用いた他の構築にも応用できるはずです。

この記事が、プロキシ環境下でサーバー構築する際に少しでもお役に立てれば幸いです。

参考リンク

Footnotes

  1. Installation Methods

  2. 168.63.129.16 の DNS 機能について - Japan Azure IaaS Core Support Blog

  3. Ubuntu | Docker Docs

  4. Docker Compose Option #4 - boot up an official release


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。