そろそろ開発環境を作ろう
Docker初め
これだけだとまだ使い方が分からん
目次
独学エンジニア レッスン2 開発環境を整えよう
https://dokugaku-engineer.com/course/serverside
Dockerの利点
- メンバー間の開発環境を統一
- 本番環境と開発環境を統一
Dockerの基本
イメージからコンテナを生成
Dockerイメージ
- テンプレ
- 設定(OS、アプリ)
Dockerコンテナ
- 実行環境(OS、アプリが動く)
Dockerの操作
操作概要
- イメージを用意
- 自分で作る
- ネットなどから持ってくる
- イメージからコンテナを生成
- コンテナを起動
操作コマンド
イメージを取得
docker image pull
イメージをビルド
docker image build
コンテナを生成
docker container create
コンテナを起動
docker container start
コンテナを停止
docker container stop
コンテナを削除
docker container rm
3生成と4起動は以下で同時に行える
docker container run
4起動と5停止は以下で同時に行える
docker container restart
複数のコンテナを管理
Docker Compose
ymlファイルを記入してコマンドで
全コンテナの生成と起動ができる
一つのコンテナには一つの役割を持たせる(ベストプラクティス)
コンテナを使った開発では、一つのコンテナに一つの役割を持たせるという原則があります。これは「マイクロサービスアーキテクチャ」とも呼ばれ、アプリケーションを小さな独立したサービスに分割する設計思想です。
一つのコンテナに一つの役割を持たせることの利点は以下の通りです。
- 独立性: それぞれのコンテナが独立して動作するため、他のコンテナの影響を受けにくく、問題が発生した場合でも他のコンテナに影響を与えにくいです。
- 柔軟性: 各コンテナが役割に特化しているため、それぞれのコンテナを独立してスケーリングや更新が可能です。これにより、リソース効率が向上し、開発・運用が容易になります。
- 再利用性: 役割ごとにコンテナを分けることで、他のプロジェクトやアプリケーションで再利用しやすくなります。これにより、開発効率が向上します。
- 管理の容易さ: 一つのコンテナが一つの役割を担当することで、コンテナの管理が容易になります。また、役割ごとにコンテナを分けることで、開発チーム間のコミュニケーションも改善されます。
この原則に従うことで、アプリケーション全体の構造が明確になり、開発、テスト、デプロイメントが効率化され、アプリケーションの信頼性や保守性が向上します。
コマンド
ビルド
docker-compose build
生成・起動
docker-compose up
停止
docker-compose stop
削除
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
コンテナイメージをビルド
appフォルダ内にDockerfileを作成
cd getting-started/app touch Dockerfile
Dockerfileに以下を記入
# syntax=docker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] EXPOSE 3000
ビルド
docker build -t getting-started .
コンテナでアプリを実行
アプリを実行
docker run -dp 3000:3000 getting-started
アプリにアクセス
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の各行の説明は次の通りです。
# syntax=docker/dockerfile:1: これはDockerfileのsyntax parser directiveです。Dockerが使用するDockerfileの構文バージョンを指定します。この行はオプションで、省略された場合、デフォルトの構文バージョンが使用されます。
FROM node:18-alpine: この行は、ベースイメージとしてnode:18-alpineを指定しています。node:18-alpineは、Node.jsバージョン18がプリインストールされた軽量なAlpine Linuxベースのイメージです。このイメージは、アプリケーションの実行環境を提供します。
WORKDIR /app: この行は、Dockerコンテナ内の作業ディレクトリを/appに設定しています。以降のコマンドは、このディレクトリを基準に実行されます。
COPY . .: この行は、Dockerfileと同じディレクトリにあるすべてのファイルとディレクトリを(.は現在のディレクトリを指します)、コンテナ内の作業ディレクトリ(/app)にコピーしています。
RUN yarn install --production: この行は、コンテナ内でyarn install --productionコマンドを実行して、アプリケーションの依存関係をインストールしています。--productionフラグは、開発用の依存関係を除外し、本番用の依存関係のみをインストールすることを指定します。
CMD ["node", "src/index.js"]: この行は、コンテナが起動されたときに実行されるデフォルトのコマンドを指定しています。この場合、node src/index.jsコマンドが実行され、アプリケーションが起動します。
EXPOSE 3000: この行は、コンテナがリッスンするポート番号を指定しています。この例では、ポート3000が指定されており、アプリケーションはこのポートで待ち受けます。この設定により、コンテナが他のサービスやホストマシンと通信できるようになります。
このDockerfileは、Node.jsアプリケーションのコンテナイメージを作成するための手順を定義しています。Dockerfileがあるディレクトリでdocker buildコマンドを実行することで、イメージがビルドされます。