Bot 環境構築・インフラ

仮想通貨botの開発記録#90(2024/8/22)「【Docker】デプロイメントの方法を見越したpythonの環境構築」

2024年8月22日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

Yodaka

今回は、複数のbotを外部環境で稼働させるために必要な環境構築についての備忘録です。

「外部サーバーを使って複数のbotを同時に稼働させたい」場合にどのような環境構築をするのが良いのかを調べました。

参考

1.【Mac大手術】ぐちゃぐちゃだったPythonの環境構築をやり直した話【さよならAnaconda】

→私と同じような状況の方が書いたweb記事。具体的な手順がまとめられている。

2.【2022最新版】M1MacにPythonの環境構築|通常のインストール方法、Dockerを使う方法も解説

→環境構築の概要をざっくり掴むために観た動画。体系的で分かりやすい。

3.Docker Desktop for Windows/Macでつくるクリーンな開発環境構築入門(Python版)

→専門的な内容に踏み込んだ書籍。実践的になコードやプロジェクトが紹介されているので、手を動かしながら学ぶのに適している。

4.Docker&仮想サーバー完全入門 Webクリエイター&エンジニアの作業がはかどる開発環境構築ガイド

→図解が多いのでイメージを掴みやすい書籍。目的に応じたDockerの使い方の解説が充実している。

5.【Docker入門】初心者向け!Dockerの基本を学んでコンテナ型の仮想環境を作ろう!

→Dockerの説明・インストールからコマンドライン・ターミナルでの実行を実演まで見せてくれる動画。おさらいにも適している。また、Dockerfileの作成についても具体的な実演がある。

6.Dockerコンテナ開発・環境構築の基本 impress top gearシリーズ

→これもDockerを体系的に理解するのに役立った書籍。タイトルには「基本」とあるが、コンテナのオーケストレーションまで解説する内容の本なので実際は応用までカバーしている。 この本で概要を掴んで、実装に必要な技術はDocsや別の本で学ぶのが良い。

7.初心者は何を使えばいい?【Pythonの仮想環境を比較】〜オススメを紹介 〜

→目的別の仮想環境の比較を解説している動画。環境ごとに実演もあるので、どの環境を使うのか迷っているときに参考になる。

8.DockerでPython実行環境を作ってみる
→ソースコードも紹介されていて実演しながら技術を身につけることができる。YouTubeに動画もあるので手を動かして学ぶのに適している。

関連記事
仮想通貨botの開発記録#77(2024/6/25)「MacOS利用Botterのための外部環境構築【基本編3種】」

続きを見る

作成したプログラムを外部環境で稼働させる方法

Pythonで作成した自動取引プログラムを外部環境で稼働させるためには、いくつかの選択肢があります。これらの選択肢は、プログラムの安定性、スケーラビリティ、管理のしやすさなどを考慮して選ぶことが重要です。以下に、具体的な方法をいくつか挙げます:

1. 仮想プライベートサーバー(VPS)

仮想プライベートサーバー(VPS)を使用することは、自動取引プログラムを外部環境で稼働させる一般的な方法です。VPSは専用サーバーと同様の機能を提供しますが、物理的なサーバーを他のユーザーと共有する点が異なります。

  • 利点: 安価でありながら高い制御が可能。rootアクセスが可能で、好きなように環境をカスタマイズできます。
  • 実装: VPSプロバイダー(例:Amazon EC2, DigitalOcean, Linode等)を選択し、Python環境をセットアップします。必要なライブラリや依存関係をインストールし、プログラムをデプロイします。

2. コンテナ化(Docker)

Dockerを利用してアプリケーションをコンテナとしてパッケージ化し、任意の環境で簡単にデプロイすることができます。

  • 利点: 環境の一貫性が保たれ、ローカルでのテスト環境と本番環境が一致します。また、複数のコンテナを並行して稼働させることが容易になります。
  • 実装: Dockerfileを作成し、必要な依存関係とアプリケーションを含めます。このイメージをビルドし、任意のサーバー(またはクラウドサービス)にデプロイします。

3. クラウドプラットフォーム

AWS, Google Cloud, Azureなどのクラウドプラットフォームを使用すると、スケーラビリティと管理の利便性が向上します。

  • 利点: オートスケーリング、監視、セキュリティ対策など、多くの管理機能を利用できます。
  • 実装: クラウドプロバイダーのマネージドサービス(AWSのEC2やLambda、Google CloudのApp Engineなど)を利用してアプリケーションをデプロイします。これらのサービスは通常、セットアップが簡単で、広範なドキュメントが提供されています。

4. サーバーレスアーキテクチャ

サーバーレスアーキテクチャを利用すると、インフラストラクチャの管理から解放され、コードの実行に集中できます。

  • 利点: スケーラビリティが高く、実行した分だけ課金されるためコスト効率が良いです。
  • 実装: AWS LambdaやGoogle Cloud Functionsなどのサービスを利用してPythonスクリプトをデプロイします。これらのプラットフォームは自動でスケーリングを行い、高負荷時にも対応可能です。

5. 専用ハードウェア

特定の要件に基づいて専用ハードウェアを購入し、その上でプログラムを運用する方法もあります。

  • 利点: 物理的なリソースへの完全な制御が可能で、高いパフォーマンスを実現できます。
  • 実装: ハードウェアを購入し、必要なソフトウェアとネットワーク環境を構築します。

どの方法を選択するかは、予算、必要な制御のレベル、プログラムの複雑さ、必要なリソースなどによって異なります。プログラムの稼働を効率的に管理するためには、これらの選択肢を検討し、最も適した方法を選ぶことが重要です。

Yodaka

色々と調べてみるとDockerを使う方法が良さそうです。

将来のデプロイメント方法に合わせた環境構築

ローカル開発環境を構築する際は、将来のデプロイメント方法に合わせて環境を設定することが重要です。特に、自動取引プログラムを含むアプリケーション開発においては、デプロイメントに際して発生する環境依存の問題を避けるために、開発環境と本番環境をできるだけ一致させることが望まれます。以下に、適切なローカル開発環境の構築方法を紹介します。

1. Dockerを使用した開発環境

Dockerを利用することで、アプリケーションの依存関係をコンテナ内に完全に包含し、どのような環境でも同じ設定でアプリケーションを実行できるようになります。これにより、ローカル開発環境と本番環境間の差異を最小限に抑えることが可能です。

  • 実装方法:
    1. Dockerをインストールします。
    2. Dockerfileを作成し、必要なPythonバージョン、ライブラリ、その他の依存関係を定義します。
    3. Dockerイメージをビルドし、そのイメージからコンテナを起動して開発を行います。
    4. Docker Composeを使用して、複数のサービス(例えばデータベースやバックエンドサーバー)を一緒に起動することができます。

2. Python仮想環境

Pythonの virtualenvvenv を使用して、プロジェクトごとに独立したPython環境を作成します。これにより、システム全体のPythonインストールを汚染することなく、プロジェクト固有のライブラリと依存関係を管理できます。

  • 実装方法:
    1. Pythonをインストールします。
    2. virtualenv(またはPython 3の venv)を使用して新しい環境を作成します。
    3. 作成した仮想環境をアクティベートし、必要なパッケージをインストールします。
    4. IDE(例えばPyCharmやVSCode)に仮想環境を設定して開発を行います。

3. クラウドベースの開発環境

AWS Cloud9、Google Cloud Shell、GitHub CodespacesなどのクラウドベースのIDEを使用すると、クラウド上に開発環境を直接設定し、どこからでもアクセスして開発を行うことができます。

  • 利点:
    • ハードウェアの制限から解放され、インターネット接続があればどこでも開発を続けられます。
    • 本番環境と同じクラウドプラットフォーム上に開発環境を構築することで、環境間の違いをさらに減らすことができます。

4. バージョン管理の統合

Gitなどのバージョン管理システムを使用して、コードの変更を追跡し、複数の開発者と協力して作業を進めることができます。また、CI/CDパイプライン(GitHub Actions、GitLab CIなど)を統合することで、コードのテストとデプロイメントを自動化します。

これらの手段を適切に組み合わせることで、効果的かつ効率的な開発プロセスを構築することが可能です。自動取引プログラムのような複数のアプリケーションを並行して開発・運用する場合、これらの方法は特に有効です。

プログラミング言語のバージョン管理

プログラミング言語のバージョン管理とは、特定のプログラミング言語の異なるバージョンを効率的に管理し、使用するための仕組みです。プログラミングプロジェクトにおいて、使用する言語のバージョンがプロジェクトの動作や互換性に大きな影響を及ぼすため、この管理は非常に重要です。以下は、プログラミング言語のバージョン管理の主な目的とツールについて説明します。

主な目的

  1. 互換性の確保:
    • 異なるプロジェクトやライブラリが特定の言語の特定のバージョンに依存することが多いため、複数のプロジェクトを並行して進める場合、それぞれのプロジェクトに適した言語のバージョンを使用する必要があります。
  2. 環境の一貫性:
    • 開発、テスト、本番環境で同じ言語のバージョンを使用することで、予期せぬエラーや動作の不一致を防ぎます。
  3. 新旧バージョンの並行利用:
    • 新しいバージョンの言語には新機能や改善が含まれていることが多いですが、既存のコードベースが古いバージョンに依存している場合、新旧のバージョンを並行して利用することが可能になります。

主なツール

  1. pyenv:
    • Pythonのバージョンを管理するためのツールで、複数のPythonバージョンをインストールし、プロジェクトごとに異なるバージョンを指定して使用することができます。
  2. nvm (Node Version Manager):
    • Node.jsのバージョンを管理するツールで、同様に複数のNode.jsバージョンを管理し、使い分けることができます。
  3. rbenv:
    • Ruby言語のバージョンを管理するためのツールで、異なるRubyバージョンをプロジェクトごとに容易に切り替えることができます。

プログラミング言語のバージョン管理ツールを使うことで、開発者はプロジェクトのニーズに合わせて適切な言語バージョンを選択し、より効率的に作業を進めることができます。

仮想環境の管理

仮想環境の管理とは、プログラミングプロジェクトに必要なライブラリや依存関係をプロジェクトごとに隔離して管理する技術です。これにより、異なるプロジェクト間での依存関係の競合を防ぎ、各プロジェクトが必要とする特定のライブラリのバージョンを維持することができます。以下にその主な目的と利点、そしてよく使用されるツールについて説明します。

主な目的

  1. 依存関係の隔離:
    • 各プロジェクトが必要とするライブラリやパッケージを独立した環境にインストールすることで、他のプロジェクトの設定に影響を与えることなく、必要なバージョンを使用できます。
  2. 環境の再現性:
    • 仮想環境を使用することで、開発環境をそのまま他のマシンやチームメンバーと共有でき、どこでも同じ環境を再現することが可能です。
  3. バージョン管理との組み合わせ:
    • プロジェクトのバージョン管理システムと連携させ、どの環境設定で開発やテストが行われたかを記録できます。

利点

  • 競合の回避:
    • 異なるプロジェクトで異なるバージョンのライブラリが必要な場合、それぞれのプロジェクトで独自の仮想環境を設定することで、依存関係の競合を避けられます。
  • 安定した開発環境:
    • 新しいライブラリやアップデートを試す際に、メインの開発環境を汚染せずに済みます。
  • 移植性と共有の容易さ:
    • 環境設定をファイルで管理し、そのファイルを使って他の開発者やテスト環境で同じ設定を簡単に再現できます。

主なツール

  1. Python - virtualenv / venv:
    • Pythonのプロジェクトでよく使用される仮想環境管理ツール。virtualenvは多機能で広範囲なサポートを提供し、venvはPython 3.3以降で標準ライブラリとして提供されています。
  2. JavaScript - npm, yarn:
    • node_modules フォルダを利用してプロジェクトごとに依存関係を管理します。npmyarn はこれらの依存関係をプロジェクトローカルにインストールし管理します。
  3. Ruby - bundler:
    • Rubyの依存関係を管理するためのツールで、Gemfile に記述された依存関係をプロジェクトごとにインストールし管理します。

仮想環境の管理は、特に複数のプロジェクトを同時に開発する場合や、他の開発者と協力してプロジェクトを進める際に非常に重要です。これにより、開発プロセスがより効率的かつ安全に行われます。

Dockerを使って環境構築するメリット

Dockerを使って環境構築を行うことには多くのメリットがあります。Dockerはコンテナ技術を利用して、アプリケーションを軽量で、移植可能かつ一貫性のある環境内で実行することを可能にします。以下は、Dockerを使用することの主な利点です。

1. 環境の一貫性

  • 再現性:Dockerはアプリケーションとその依存関係をコンテナという単位で包んで実行します。このため、開発環境、テスト環境、本番環境間での動作が一貫し、環境依存の問題が大幅に削減されます。

2. 移植性

  • どこでも実行:DockerコンテナはLinux、Windows、MacOSなど、どんなDockerがインストールされているOS上でも実行可能です。これにより、"ローカルで動いたけど本番環境では動かない" という問題を避けることができます。

3. 環境の分離とセキュリティ

  • 分離された実行環境:各コンテナは他のコンテナやホストOSから隔離されて動作します。これにより、アプリケーション間のリソース干渉を防ぎ、セキュリティを向上させます。

4. スケーラビリティと柔軟性

  • 簡単なスケーリング:Dockerを使えば、同一アプリケーションのコンテナを複数実行して負荷分散や冗長化を容易に実施できます。また、コンテナの起動と停止が迅速にできるため、リソースの調整も柔軟に行えます。

5. 開発の効率化

  • 簡素化された設定:Dockerfileというスクリプトファイルに環境構築の手順を記述することで、新しい開発メンバーがプロジェクトに参加したときの環境構築が非常に簡単になります。
  • CI/CDパイプラインとの統合:Dockerは多くのCI/CDツールと連携可能で、ビルドやテスト、デプロイのプロセスを自動化しやすくなります。

6. 資源の効率的な利用

  • 軽量性:Dockerコンテナは仮想マシンよりも軽量で、少ないリソースで多くのコンテナを実行できます。これにより、システムリソースをより効率的に利用できます。

これらの利点により、Dockerは現代のソフトウェア開発において非常に重要なツールとなっています。アプリケーションの開発から運用まで、多くの課題を効率的に解決できるため、広く採用されています。

補足

【dockerイメージDockerコンテナの違い】

DockerイメージDockerコンテナは、Dockerを理解する上で非常に重要な概念ですが、それぞれ異なる役割を持っています。簡単に言えば、Dockerイメージはコンテナを作成するためのテンプレートであり、Dockerコンテナはそのテンプレートから実行される実体です。

1. Dockerイメージ (Docker Image)

  • 定義: Dockerイメージは、ソフトウェアが動作するために必要なファイルや設定をすべて含んだ自己完結型のテンプレートです。これには、アプリケーションのコード、ランタイム、ライブラリ、環境変数、設定ファイルなどが含まれます。
  • 役割: イメージは実行される前の「静的」な状態です。イメージは読み取り専用であり、それ自体は実行されません。イメージを使ってコンテナが作成されます。
  • 作成方法: イメージは通常、Dockerfileというテキストファイルを使って作成します。Dockerfileには、イメージを構築する手順が記述されています。

2. Dockerコンテナ (Docker Container)

  • 定義: Dockerコンテナは、Dockerイメージから作成され、実際に実行されているインスタンスです。コンテナはイメージを基にした「動的」な実体で、分離された環境でアプリケーションを実行します。
  • 役割: コンテナは実際に稼働するプロセスやアプリケーションを含んでおり、イメージに基づいて起動された後は、独立して動作します。コンテナ内での変更(ファイルの生成やデータの保存など)は、コンテナ内でのみ影響があります。
  • 特徴: コンテナは軽量で、他のコンテナやホストシステムから隔離された環境で動作します。複数のコンテナが同じイメージから作成されても、それぞれのコンテナは独立して動作します。

3. イメージとコンテナの違いのまとめ

  • Dockerイメージは、コンテナを作成するための「設計図」や「テンプレート」です。静的で、実行はされません。
  • Dockerコンテナは、そのイメージから作成され、実際に稼働する実行環境です。動的で、実際に動作しているプロセスやアプリケーションを含みます。

例え

イメージを「ソフトウェアのインストールディスク」に例えるなら、コンテナは「インストールされたソフトウェアが動作しているコンピュータ」です。イメージはそのソフトウェアを配布するためのもので、コンテナはそのソフトウェアを実際に動作させる場所です。

レンタルサーバーを利用した環境構築

レンタルサーバーを利用してDockerで環境構築を再現することは可能ですが、その可否はレンタルサーバーの提供する機能とポリシーに依存します。以下に、Dockerをレンタルサーバーで利用する際の考慮点とステップを説明します。

考慮点

  1. サーバーの種類:
    • 一般的な共有ホスティング環境では、Dockerの使用が許可されていないことが多いです。これは、セキュリティやリソースの共有の問題からです。
    • VPS(Virtual Private Server)や専用サーバーのように、より制御が可能な環境では、Dockerのインストールと実行が許可されていることが一般的です。
  2. サーバーの管理権限:
    • Dockerをインストールして運用するには、サーバーのrootアクセス権限が必要です。レンタルサーバーがこのレベルのアクセスを提供しているか確認する必要があります。
  3. サーバーのOS:
    • DockerはLinuxベースのOSで最もよく使用されますが、Windows Serverでも利用できます。レンタルサーバーのOSがDockerに対応しているか確認しましょう。

実装ステップ

  1. 環境の確認:
    • 使用しているレンタルサーバーがDockerのインストールと実行をサポートしているか、プロバイダに確認します。
  2. Dockerのインストール:
    • 管理権限がある場合、サーバーにDockerをインストールします。Linuxサーバーの場合、通常はパッケージマネージャを通じてインストールできます。
  3. Dockerイメージの構築:
    • ローカル環境でDockerイメージを作成し、そのイメージをレンタルサーバーにデプロイします。Dockerfileを用いてアプリケーションとその依存関係をコンテナ化します。
  4. コンテナの運用:
    • デプロイしたDockerイメージからコンテナを起動し、アプリケーションが適切に動作するかテストします。必要に応じて、ポートフォワーディングやボリュームマウントなどの設定を行います。
  5. 継続的な管理:
    • コンテナの状態監視、アップデート管理、セキュリティ対策など、運用面でも注意が必要です。

Dockerをレンタルサーバーで利用することは技術的に可能ですが、プロバイダのポリシー、サーバーの種類、および管理者権限の有無が重要な要因となります。これらの要件が満たされれば、Dockerを活用して効率的かつ一貫性のある開発環境をレンタルサーバー上に構築することが可能です。

まとめ

今回はデプロイメントの方法を見越したpythonの環境構築について調べたことをまとめました。

Yodaka

bot開発の効率を高めるために環境面の設計を考え直すことは定期的に行なっていきたいです。

今後もこの調子で開発の状況をまとめていきます。

-Bot, 環境構築・インフラ