Help us understand the problem. What is going on with this article?

VSCode Remote Containersで.NET Core + MySQL + Elasticsearchの開発環境構築

現在参画しているプロジェクトにて、全文検索機能の要件があったため、既存の構成+Elasticsearchの環境構築をしてみました。
今回は開発環境構築の部分についてご紹介しようと思います。

はじめに

今回ご紹介するのはあくまで開発環境用の最小構築であり、運用環境の構築にそのまま転用できる内容ではないことを予めご了承ください。

環境

  • MacBook Pro 10.15.7
  • VSCode 1.50.1
  • Docker 19.03.13
  • Docker For Mac 2.4.0.0
  • Docker image version
    • mysql:8.0
    • sebp/elk:oss-792
    • mcr.microsoft.com/dotnet/core/sdk:3.1

ソースコード

https://github.com/t-ash0410/asp.net-core-sample

ディレクトリ構成

root/
├ .devcontainer/
 ├ db/
  ├ init/
  └ create_db.sql
   └ my.conf
 ├ devcontainer.json
 └ docker-compose.yml

create_db.sqlとmy.confに関しての説明は割愛します。

docker-compose.yml

docker-compose.yml
version: '3'

services:
  dotnet_db:
    image: mysql:8.0
    container_name: dotnet_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: password
    volumes:
      - "db_data:/var/lib/mysql"
      - "./db/my.conf:/etc/mysql/my.conf"
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --skip-character-set-client-handshake

  dotnet_elk:
    image: sebp/elk:oss-792
    container_name: dotnet_elk
    ports: 
      - "5601:5601"
      - "9200:9200"

  dotnet_web:
    image: mcr.microsoft.com/dotnet/core/sdk:3.1
    container_name: dotnet_web
    ports:
      - "8080:8080"
    environment:
      DB_CONNECTION_STRING: "server=dotnet_db;port=3306;uid=root;pwd=password;database=asp_net_sample"
      ELASTIC_SEARCH_SERVER: "http://dotnet_elk:9200"
    volumes:
      - "../:/dotnet-app"
    command: /bin/bash -c "while sleep 1000; do :; done"

volumes:
  db_data:
    driver: local

各項目について

image
作成するコンテナのイメージを指定
 
container_name
作成するコンテナ名を指定
 
ports
公開するポートを指定
今回の形式は ホストマシンのポート:コンテナのポート での指定となります。
 
environment
環境変数の宣言
 
volumes
ボリュームのマウント

相対パス:絶対パスの形式は、ホストマシン上の相対パスをコンテナ上の絶対パスにマウントしています。
この場合に指定する相対パスはdocker-compose.ymlが配置してあるディレクトリからの相対パスである必要があります。

volumesに定義したkey:絶対パスの形式は、volumesに定義されたkeyに該当するdata volumeをコンテナ上の絶対パスにマウントしています。
 
command
コンテナのセットアップ完了後に実行されるコマンドを指定  

devcontainer.json

devcontainer.json
{
    "name": "books app",
    "dockerComposeFile": [
      "docker-compose.yml"
    ],
    "workspaceFolder": "/dotnet-app",
    "service": "dotnet_web",
    "extensions": [
        "ms-dotnettools.csharp",
        "jmrog.vscode-nuget-package-manager",
        "ms-azuretools.vscode-docker",
        "p1c2u.docker-compose"
    ],
    "settings": {
      "editor.tabSize": 2,
      "files.insertFinalNewline": true,
      "files.trimFinalNewlines": true,
      "terminal.integrated.shell.linux": "/bin/bash"
    },
    "shutdownAction": "none"
}

各項目について

name
作成するアプリケーション名を指定
 
dockerComposeFile
dockerコンテナの作成に使用するdocker-composeファイルを指定
 
workspaceFolder
ワークスペースの展開先ディレクトリを指定
 
service
vscodeで接続するserviceの指定
 
extensions
開発時に利用するvscodeのextensionを指定
 
settings
vscodeの格設定を指定
 
shutdownAction
vscode終了時のコンテナに対するアクションを記述
noneの場合、vscodeが終了後もコンテナが起動したままとなります。  

起動確認

  1. vscodeを開く
  2. command + shift + P
  3. >Remote-Containers: Rebuild and Reopen in Container
  4. 正常に立ち上がれば成功

link

公式ドキュメント

docker-compose
ASP.NET Core向けのDocker イメージ
elk-docker
Developing inside a Container using Visual Studio Code Remote Development

参考にさせていただいた記事

【2020年1月】令和だし本格的にVSCodeのRemote Containerで、爆速の"開発コンテナ"始めよう
DockerでMySQLを使ってみる
初めてのElasticsearch with Docker

続き

アプリケーションコードについて

AWS上で環境構築してみた

その他番外編的に書こうと思ってるやつ

  • CircleCIを利用した.NET Coreアプリの自動デプロイ
  • Docker Composeを利用したELKスタック環境構築
  • Elasticsearchの部分をCloudsearchに置き換える
ashicom
時間があるときに試してみたことなどをつらつらと投稿しています。投稿した記事がどこかの誰かの役に立てば幸いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away