Open6

Docker導入する。with Terraform ,Azure

oo

前提

  • docker desktopをインストール済み
    • GUIを使わないとしても機能がPCにインストールされる

フロー

  1. DockerFile作る
  2. compose.yamlを作る

知識

* Q: Dockerって便利すぎじゃない?どうしてnodeとかの環境用意できるの?
    * A:Docker Hubから引っ張ってきている。
oo
# 開発環境全体を定義する

services:
  app:
    build:
      # コンテナを起動する設定
      # compose.ymlと同じディレクトリにあるDockerfileでコンテナをビルドする
      context: .
    ports:
      # 左側の値がhttp://localhost:XXXXの数値
      - "12000:3000"
    volumes:
      # 「現在のディレクトリ」と「コンテナ内の/app/ディレクトリ」が同期される
      # コンテナはエディタとリアルタイムで同期している
      - .:/app
      # ホストのnode_modulesをコンテナの/app/node_modulesと同期
      # (git cloneした他の人がプロジェクトをダウンロードした場合に、ホストのnode_modulesとコンテナのnode_modulesが異なるため)
      - node_modules:/app/node_modules

    command:
      # コンテナ起動時に実行するコマンド
      sh -c "npm run dev"
    environment:
      #typescriptでのホットリロード設定
      - WATCHPACK_POLLING=true
volumes:
  node_modules:

# Dockerfileではアプリケーションの実行環境を定義する

# ベースイメージ
FROM node:20.11.1

# コンテナ内のディレクトリを/appに移動する
# 作業ディレクトリの設定
WORKDIR /app

# 依存関係のインストール
# 現在のディレクトリのpackage.jsonをコンテナ内のディレクトリ(現在は/appディレクトリ)にコピーします。
COPY ./package.json ./

# コンテナ内のディレクトリ(/app)でnpm installを実行します。
RUN npm install

# run devなどはcompose.yamlに任せる
oo
  1. Build your container: docker build -t nextjs-docker .
    Run your container: docker run -p 3000:3000 nextjs-docker
oo

TerraformでAzure Container Registry (ACR) の作成と検証

terraform/azure/acrディレクトリ

terraform/azure/acr/main.tf
# main.tf
provider "azurerm" {
  features {}
}

variable "resource_group_name" {
  description = "MySQL Flexible Serverを作成するAzureリソースグループ"
  type        = string
  default     = "organization-project-environment-rg" 
}

variable "location" {
  description = "リソースをデプロイするAzureリージョン"
  type        = string
  default     = "japaneast"
}


resource "azurerm_container_registry" "acr" {
  name                     = "organizationprojectenvironmentacr"  # ACRの名前。ハイフンは使えない。全て小文字に
  resource_group_name    = var.resource_group_name
  location               = var.location
  sku                     = "Basic"
  admin_enabled            = true  # 管理者アカウントを有効にする

      tags = { # タグ付けする
        organization = "organization"
        environment = "environment"
        project     = "project" # 全て小文字
      }
}

output "container_registry_login_server" {
  description = "The login server URL for the Azure Container Registry" # 説明文
  value = azurerm_container_registry.acr.login_server
}

Dockerレジストリの名前には大文字を使用できないため、すべて小文字で指定する必要があります。

organizationprojectenvironmentacrこの部分がorganizationProjectEnvironmentAcr.azurecr.io/Dockerイメージ名:latest .ここで、レジストリ名になる。

Terraform の初期化:

main.tf ファイルを作成した後、terraform/azure/acrで、Terraform を初期化します。

terraform init

Terraform の検証

terraform plan -out=tfplan

terraform plan の結果をファイルに保存し、そのファイルを使用して terraform apply を実行する

Terraformの適用

初期化が完了したら、ACR を作成するために Terraform を適用します。

terraform apply tfplan

プロンプトが表示されたら、yes と入力してリソースの作成を確認します。

プロジェクトルートディレクトリ

Docker イメージのビルドとプッシュ

ACR が正常に作成されたら、Docker イメージをビルドして ACR にプッシュします。

# Azure CLIにログイン
az login

# ACRにログイン
az acr login --name organizationProjectEnvironmentAcr

# Dockerイメージのビルド
docker build -t organizationprojectenvironmentacr.azurecr.io/Dockerイメージ名:latest .

# ACRにプッシュ
docker push organizationprojectenvironmentacr.azurecr.io/Dockerイメージ名:latest

latestはタグ
Dockerイメージ名にはorganization-project-environmentを入れる