カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

Docker 1 独学エンジニアとチュートリアル

そろそろ開発環境を作ろう
Docker初め

これだけだとまだ使い方が分からん

目次

独学エンジニア レッスン2 開発環境を整えよう

https://dokugaku-engineer.com/course/serverside

Dockerの利点

  • メンバー間の開発環境を統一
  • 本番環境と開発環境を統一

Dockerの基本

イメージからコンテナを生成

Dockerイメージ

  • テンプレ
  • 設定(OS、アプリ)

Dockerコンテナ

  • 実行環境(OS、アプリが動く)

Dockerの操作

操作概要

  1. イメージを用意
    • 自分で作る
    • ネットなどから持ってくる
  2. イメージからコンテナを生成
  3. コンテナを起動

操作コマンド

  1. イメージを取得

     docker image pull
    
  2. イメージをビルド

     docker image build
    
  3. コンテナを生成

     docker container create
    
  4. コンテナを起動

     docker container start
    
  5. コンテナを停止

     docker container stop
    
  6. コンテナを削除

     docker container rm
    

3生成と4起動は以下で同時に行える

docker container run

4起動と5停止は以下で同時に行える

docker container restart

複数のコンテナを管理

Docker Compose

ymlファイルを記入してコマンドで
全コンテナの生成と起動ができる

一つのコンテナには一つの役割を持たせる(ベストプラクティス)

コンテナを使った開発では、一つのコンテナに一つの役割を持たせるという原則があります。これは「マイクロサービスアーキテクチャ」とも呼ばれ、アプリケーションを小さな独立したサービスに分割する設計思想です。

一つのコンテナに一つの役割を持たせることの利点は以下の通りです。

  1. 独立性: それぞれのコンテナが独立して動作するため、他のコンテナの影響を受けにくく、問題が発生した場合でも他のコンテナに影響を与えにくいです。
  2. 柔軟性: 各コンテナが役割に特化しているため、それぞれのコンテナを独立してスケーリングや更新が可能です。これにより、リソース効率が向上し、開発・運用が容易になります。
  3. 再利用性: 役割ごとにコンテナを分けることで、他のプロジェクトやアプリケーションで再利用しやすくなります。これにより、開発効率が向上します。
  4. 管理の容易さ: 一つのコンテナが一つの役割を担当することで、コンテナの管理が容易になります。また、役割ごとにコンテナを分けることで、開発チーム間のコミュニケーションも改善されます。

この原則に従うことで、アプリケーション全体の構造が明確になり、開発、テスト、デプロイメントが効率化され、アプリケーションの信頼性や保守性が向上します。

コマンド

  1. ビルド

     docker-compose build
    
  2. 生成・起動

     docker-compose up
    
  3. 停止

     docker-compose stop
    
  4. 削除

     docker-compose rm
    

その他コマンド

  • コマンドを実行

      docker-compose exec
    
  • 一覧表示

      docker-compose ps
    
  • ログ表示

      docker-compose logs
    
  • 削除

      docker system prune
    

チュートリアル Get started

part1 概要

https://docs.docker.com/get-started/

  • イメージをコンテナとしてビルドして実行します。
  • Docker Hub を使用してイメージを共有します。
  • データベースで複数のコンテナーを使用して Docker アプリケーションをデプロイします。
  • Docker Compose を使用してアプリケーションを実行します。

part2 アプリをコンテナ化

https://docs.docker.com/get-started/02_our_app/

Getting-started リポジトリのクローンを作成

git clone https://github.com/docker/getting-started.git

コンテナイメージをビルド

  1. appフォルダ内にDockerfileを作成

     cd getting-started/app 
    
     touch Dockerfile
    
  2. Dockerfileに以下を記入

     # syntax=docker/dockerfile:1
    
     FROM node:18-alpine
     WORKDIR /app
     COPY . .
     RUN yarn install --production
     CMD ["node", "src/index.js"]
     EXPOSE 3000
    
  3. ビルド

     docker build -t getting-started .
    

コンテナでアプリを実行

  1. アプリを実行

     docker run -dp 3000:3000 getting-started
    
  2. アプリにアクセス

    WEBブラウザで「http://localhost:3000」にアクセス
    アプリが表示される
    やったぜ

コンテナの確認

docker ps

何故、dockerチュートリアルは、getting-started/app 内でDockerfileを作成している?

Dockerチュートリアルでgetting-started/appディレクトリ内にDockerfileを作成している理由は、Dockerfileとアプリケーションのソースコードが同じディレクトリにあることが一般的だからです。Dockerfileは、コンテナイメージをビルドする際の手順を記述したファイルであり、アプリケーションのソースコードと関連リソースが格納されているディレクトリを基準にしています。

Dockerfileをアプリケーションのディレクトリ内に配置することで、Dockerイメージをビルドする際に、アプリケーションのソースコードと関連ファイルを簡単にコピーしてコンテナイメージに含めることができます。また、Dockerfileとアプリケーションのソースコードが同じディレクトリにあることで、プロジェクトの構成が分かりやすくなり、他の開発者がプロジェクトを理解しやすくなります。

Dockerfileをgetting-started/appディレクトリに作成することで、チュートリアルは、アプリケーションのソースコードとコンテナイメージのビルド手順を一元管理し、プロジェクトの構成をシンプルかつ直感的に保っています。

Dockerfileの中身の説明

このDockerfileの各行の説明は次の通りです。

  1. # syntax=docker/dockerfile:1: これはDockerfileのsyntax parser directiveです。Dockerが使用するDockerfileの構文バージョンを指定します。この行はオプションで、省略された場合、デフォルトの構文バージョンが使用されます。

  2. FROM node:18-alpine: この行は、ベースイメージとしてnode:18-alpineを指定しています。node:18-alpineは、Node.jsバージョン18がプリインストールされた軽量なAlpine Linuxベースのイメージです。このイメージは、アプリケーションの実行環境を提供します。

  3. WORKDIR /app: この行は、Dockerコンテナ内の作業ディレクトリを/appに設定しています。以降のコマンドは、このディレクトリを基準に実行されます。

  4. COPY . .: この行は、Dockerfileと同じディレクトリにあるすべてのファイルとディレクトリを(.は現在のディレクトリを指します)、コンテナ内の作業ディレクトリ(/app)にコピーしています。

  5. RUN yarn install --production: この行は、コンテナ内でyarn install --productionコマンドを実行して、アプリケーションの依存関係をインストールしています。--productionフラグは、開発用の依存関係を除外し、本番用の依存関係のみをインストールすることを指定します。

  6. CMD ["node", "src/index.js"]: この行は、コンテナが起動されたときに実行されるデフォルトのコマンドを指定しています。この場合、node src/index.jsコマンドが実行され、アプリケーションが起動します。

  7. EXPOSE 3000: この行は、コンテナがリッスンするポート番号を指定しています。この例では、ポート3000が指定されており、アプリケーションはこのポートで待ち受けます。この設定により、コンテナが他のサービスやホストマシンと通信できるようになります。

このDockerfileは、Node.jsアプリケーションのコンテナイメージを作成するための手順を定義しています。Dockerfileがあるディレクトリでdocker buildコマンドを実行することで、イメージがビルドされます。