前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。
私は普段、MacOSで開発をしています。今回は「外部環境の構築方法」を3種類に分けてまとめました。それぞれの方法のメリット・デメリット・特徴についてもまとめているので参考にしてみてください。
この記事を書いたきっかけは、以下の記事を読んで「他にも方法があるのではないか?」と思ったためです。(開発環境構築の理解を深めるきっかけとして、非常に参考になった記事でした)
ベストな回答に辿り着くために、いろいろな方法を調べてみて比較・検討するようにしています。
結論
開発環境と稼働環境を揃えるために、以下のいずれかが推奨される。
- 同じUnix系OSを使用する: MacOSとLinuxの組み合わせが推奨されます。
- Dockerなどのコンテナ技術を利用する: コンテナを使えば、OSの違いを吸収し、一貫性を保つことができます。
- 仮想マシンの利用: 仮想マシンを使うことで、完全に一致した環境を構築できます。
これらの方法を採用することで、開発と稼働環境の違いによる問題を最小限に抑えることができます。
一つずつ順番に解説していきます。
1. 同じUnix系OSを使用する
メリット
- 一貫性: 開発環境と稼働環境が同じOSであるため、動作の違いや依存関係の問題が発生しにくい。
- デバッグの容易さ: 環境が同じであるため、環境依存のバグの再現が容易。
- パフォーマンス: OSのオーバーヘッドが少なく、ネイティブに近いパフォーマンスが得られる。
デメリット
- 柔軟性の欠如: 異なるOS環境での動作確認が難しい。
- コスト: 専用のサーバーを用意する場合、コストがかかることがある。
特徴
- シンプルさ: 環境構築が比較的シンプルであり、直接サーバーにデプロイするだけで済むことが多い。
- 同一性: 同じコマンドやツールが使えるため、開発と運用のギャップが小さい。
具体的な実行手順
概要
MacOSと同じUnix系OS(例:Linux)を使用することで、開発環境と稼働環境の一貫性を保ちます。
手順
1.Linuxサーバーの準備:
- サーバーを購入またはセットアップします。ここでは、Ubuntuを例にします。
- サーバーにSSHでログインします。
ssh username@server_address
2.必要なソフトウェアのインストール:
- Pythonや必要なツールをインストールします。
sudo apt update sudo apt install python3 python3-venv python3-pip
3.プロジェクトの配置:
- プロジェクトファイルをサーバーに転送します。
scp -r /path/to/your/project username@server_address:/path/to/destination
4.仮想環境の作成と依存関係のインストール:
- サーバー上で仮想環境を作成し、依存関係をインストールします。
cd /path/to/destination python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5.アプリケーションの実行:
- アプリケーションを実行して動作確認を行います。bashコードをコピーする
python your_script.py
python your_script.py
2. Dockerなどのコンテナ技術を利用する
メリット
- 一貫性: Dockerイメージを使うことで、開発環境と稼働環境を完全に一致させることができる。
- ポータビリティ: コンテナをどの環境でも動かすことができるため、移行が容易。
- 依存関係の管理: すべての依存関係をコンテナ内で管理できるため、ホスト環境に依存しない。
デメリット
- リソース消費: コンテナオーバーヘッドにより、ネイティブ環境よりも若干のパフォーマンス低下がある。
- 複雑さ: Dockerの知識と設定が必要で、学習コストがかかる。
特徴
- 分離: 各サービスを独立したコンテナで実行できるため、マイクロサービスアーキテクチャに向いている。
- スケーラビリティ: コンテナオーケストレーションツール(例: Kubernetes)を使ってスケールアウトが容易。
具体的な実行手順
概要
Dockerを使用して、開発環境と同じコンテナを稼働環境で実行します。
手順
1.Dockerのインストール:
- MacOSとLinuxサーバーの両方にDockerをインストールします。
- MacOS:
brew install --cask docker
- Ubuntu:
sudo apt update sudo apt install docker.io
2.Dockerfileの作成:
- プロジェクトディレクトリに
Dockerfile
を作成します。 - 例:
FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD ["python", "your_script.py"]
3.Dockerイメージのビルド:
- ローカル環境でDockerイメージをビルドします。
docker build -t my_web_app .
4.Dockerイメージのテスト:
- ローカル環境でDockerコンテナを実行してテストします。
docker run -d -p 8000:8000 my_web_app
5.Dockerイメージのプッシュ:
- Docker Hubなどのリポジトリにイメージをプッシュします。
docker login docker tag my_web_app username/my_web_app docker push username/my_web_app
6.サーバー上でDockerコンテナを実行:
- サーバー上でDockerイメージをプルして実行します。
ssh username@server_address sudo docker pull username/my_web_app sudo docker run -d -p 8000:8000 username/my_web_app
3. 仮想マシンの利用
メリット
- 一貫性: 仮想マシンイメージを使うことで、開発環境と稼働環境を完全に一致させることができる。
- 分離: 各環境を独立した仮想マシンで実行できるため、環境の干渉がない。
デメリット
- リソース消費: 仮想マシンはホストOSのリソースを多く消費するため、パフォーマンスが低下することがある。
- 複雑さ: 仮想マシンの管理と設定が必要で、学習コストがかかる。
特徴
- フルOS環境: コンテナとは異なり、完全なOS環境を提供するため、特定のOS機能が必要な場合に有用。
- 分離度の高さ: 各仮想マシンは完全に分離されているため、セキュリティ面での利点がある。
具体的な実行手順
概要
仮想マシン(VM)を使って、開発環境と同じ環境を稼働環境に構築します。
手順
1.仮想マシンの準備:
- Vagrantを使用して仮想マシンを準備します。ローカルマシンにVagrantとVirtualBoxをインストールします。
brew install --cask vagrant virtualbox
2.Vagrantfileの作成:
- プロジェクトディレクトリに
Vagrantfile
を作成します。 - 例:
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.network "forwarded_port", guest: 8000, host: 8000 config.vm.synced_folder ".", "/vagrant" config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get install -y python3 python3-venv python3-pip cd /vagrant python3 -m venv venv source venv/bin/activate pip install -r requirements.txt SHELL end
3.仮想マシンの起動とプロビジョニング:
- Vagrantを使って仮想マシンを起動し、プロビジョニングを行います。
vagrant up vagrant ssh
4.アプリケーションの実行:
- 仮想マシン内でアプリケーションを実行します。
cd /vagrant source venv/bin/activate python your_script.py
5.同じ設定でサーバー上に仮想マシンをセットアップ:
- サーバー上でも同様にVagrantを使って仮想マシンをセットアップします。サーバーにVagrantとVirtualBoxをインストールし、同じ
Vagrantfile
を使って仮想マシンを起動します。
まとめ
ここで、もう一度それぞれの方法のまとめをしておきましょう。
- 同じUnix系OSを使用する
シンプルで直接的な方法で、一貫性が高いが柔軟性に欠ける。 - Dockerなどのコンテナ技術を利用する
高い一貫性とポータビリティを提供し、マイクロサービスやスケーラビリティに適しているが、リソース消費と技術的な複雑さがある。 - 仮想マシンの利用
フルOS環境を提供し、高い分離度と一貫性を持つが、リソース消費と管理の複雑さがある。
私は現在、主にDockerを利用した方法を採用していますが、それ以外にもさまざまな方法があることが分かりました。
自分自身のリソースと環境に応じて使い分けていこうと思います。
今後もこの調子でbot開発の状況や学びをまとめていきます。