Docker Desktop for MacにKubernetesを統合して、Railsアプリケーションをデプロイするチュートリアル
Docker Desktop for Macを使用して、ローカルのKubernetes環境にRailsアプリケーションをデプロイする方法を紹介します。
目次
1. 環境の準備
- Docker Desktop for Macを公式サイトからダウンロードしてインストールします。
- Dockerの設定からKubernetesを有効化します。
-
kubectl
コマンドが動作することを確認します。
kubectl version
2. Railsアプリケーションの作成
新しいRailsアプリケーションを作成します (既存のアプリケーションを使用しても構いません):
rails new my-rails-app
cd my-rails-app
3. Docker化
- アプリケーションのルートに
Dockerfile
を作成します:
FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /my-rails-app
COPY Gemfile Gemfile.lock ./
RUN gem install bundler && bundle install
COPY . ./
CMD ["rails", "server", "-b", "0.0.0.0"]
- 同じくアプリケーションのルートに
docker-compose.yml
を作成します:
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/my-rails-app
ports:
- "3000:3000"
4. イメージのビルド
Docker Composeを使用してアプリケーションのDockerイメージをビルドします。
docker-compose build
5. Kubernetesのデプロイメントとサービスの作成
- アプリケーションのルートに
k8s-deployment.yml
ファイルを作成し、以下の内容を追加します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-rails-app
spec:
replicas: 2
selector:
matchLabels:
app: my-rails-app
template:
metadata:
labels:
app: my-rails-app
spec:
containers:
- name: my-rails-app
image: my-rails-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
- アプリケーションのルートに
k8s-service.yml
ファイルを作成し、以下の内容を追加します:
apiVersion: v1
kind: Service
metadata:
name: my-rails-app
spec:
selector:
app: my-rails-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
- 作成したマニフェストを用いてKubernetesにアプリケーションをデプロイします:
kubectl apply -f k8s-deployment.yml
kubectl apply -f k8s-service.yml
6. アクセス
Docker Desktop for
MacのKubernetesはローカル開発用に設計されています。LoadBalancerタイプのサービスを使用する場合、ブラウザからhttp://localhost
に直接アクセスすることでRailsアプリケーションを表示できます。
7. トラブルシューティング
7.1. PodのImagePullBackOffエラーの解決
問題:
PodのステータスがImagePullBackOff
となり、KubernetesがDockerイメージをプルする際に問題が発生していました。
解決策:
-
kubectl describe pod <POD_NAME>
コマンドを使用してPodの詳細なログを調査します。 - ログには、イメージ
my-rails-app:latest
のプルに失敗したことが示されています。 - これはローカルのDockerイメージであり、Kubernetesがそのイメージを見つけることができなかった原因です。
-
docker images
を使用して、ローカルで利用可能なDockerイメージをリストアップします。 - イメージ名のミスマッチを確認します。実際のイメージ名は
my-rails-app-web
であるため、k8s-deployment.yml
のイメージ名を適切に修正する必要があります。 - 更新された
k8s-deployment.yml
を再適用して、Podが正常に起動することを確認します。
この方法で、ImagePullBackOff
エラーを解決しました。同様の問題が発生した場合、ローカルのDockerイメージ名とKubernetesのDeployment設定のイメージ名が一致していることを確認してください。
これで、Docker Desktop for MacのローカルKubernetes環境上にRailsアプリケーションをデプロイする手順が完了しました。