Laravel + Vue.js + AWS + Docker + CircleCI
分からないことリスト
- コンテナとイメージって何がどう違うん?
Dockerとは
- コンテナと呼ばれる仮想化のための技術
- 最近ではデファクトスタンダード
スナップショット
- 特定の環境or状況のスナップショット(=スクショ)をコードで管理して、それの名前を「イメージ」と呼ぶ。
- ある言語のバージョンが変わると、「特定の環境」から変わるから別のイメージが採用される
- そのスナップショットは「Dockerfile」と呼ばれるファイルで管理する
タグ
- バージョンみたいなやつ
Dockerfile
- イメージを管理するファイル
- このファイルを復元すると、その環境(=スナップショット)を再現することができるようになる
- DockerfileをDocker Hubにアップロードすることで誰にでも用意に配布ができる
- 先頭の
FROM ○○○
でベースとなるイメージを読み込む- その上に
COPY
やRUN
を重ねて自分個人の環境(=イメージ)を作成する
- その上に
-
ENV
コマンドを用いると、Docker内で使用できる環境変数を定義できる -
USER
コマンドを用いると、Dockerイメージを起動するときにログインするユーザーを指定できる -
CMD
コマンドを使用すると、Docker起動時にデフォルトで実行されるコマンドを定義できる
Dockerfileで使われるコマンド
- 独自の言語(≒DSL)が使われている
- コマンドは以下
- FROM
- COPY
- ENV
- WORKDIR
- RUN
- ADD
- ARGS
- CMD
- ONBUILD
- LABEL
- ENTRYPOINT
- STOPSIGNAL
- MAINTAINER
- VOLUME
- HEALTHCHECK
- EXPOSE
- USER
- SHELL
Docker Container
Docker ImageがスナップショットだとしたらDocker Containerはその「スナップショットから起動したプロセス」です。
-
docker run
を実行するとDockerイメージを元にしてDockerコンテナが作成され、隔離された環境が作成される - めちゃ素人の感覚だけど、Dockerイメージはオブジェクト指向で言うとクラスで、Dockerコンテナがインスタンスって感じか
- コンテナ内のプロセスはホストマシンや他のコンテナと隔離されて実行される
まとめ
- コンテナは隔離された環境で実行される
- Dockerコンテナは1つのコマンドを実行してプロセスを実行する
- 1コンテナ1プロセスの意識が大切
Dockerコンテナの5つの状態
- Image
- Dockerイメージの状態
- RUNNING
- Dockerコンテナが起動している状態
- STOPPED
- コンテナが終了した状態
- PAUSE
- コンテナが停止した状態
- ユーザーが明示的に指定しない限り、この状態へは遷移しない
- DELETED
- コンテナが削除された状態
- ユーザーが明示的に指定しない限り、この状態へは遷移しない
DockerでNetworkを使う
- コンテナは1つに対して1つのプロセスが稼働している
- 「nginxとphp-fpm」のように複数のプロセスを協調させて動かすときはネットワークを使ってお互いを通信させるのが推奨されている
Driver
- ネットワークの振る舞いを定義できる
- デフォルトでは2種類のNetwork Driverがある
bridge
- 基本的なNetwork Driver
- Linuxカーネルのbridgeネットワークを使うための機能
host
- ホストマシンのeth0を直接使う方法
ボリューム
- データを永続化するための機能
- Dockerコンテナは本来データを保存しない
- コンテナ上で作成されたファイルはコンテナのライフサイクルの終了と一緒に消えちゃう
- Volumeはデータの保持・永続化のために設計されている
- コンテナのライフサイクルとは独立してファイルの管理ができる
以下がボリュームの2種類
Data Volume
- ファイル&ディレクトリがDockerコンテナのライフサイクルの外で管理される
Data Volume Container
AWS側の作業
- EC2を作りたい
- 先にVPCとサブネットを作らないといけない
- VPC作った
- サブネット作った
ECS + ECR
ECS + ECRを使って、手動でDockerイメージをデプロイしてみる。既に開発が完了しているサイトについてはメンテナンスの必要がない限り、イメージを更新しなくてもいいからこれは割といいアイデアなんじゃないかな?以下に手順をまとめる。
ECSとは
正式名称はAmazon Elastic Container Service。Amazon ECSとか単にECSとか言ったりする(以下、ECS)。ECSの公式には以下のことが書いてある。
安全で信頼性と拡張性が高いコンテナを実行する
コンテナ化されたアプリケーションを簡単にデプロイ、管理、およびスケーリングできます
要は、AWS内でコンテナを扱うんだったらECSでいいよ!みたいな場所か。
丁寧にチュートリアルまであるっぽいから、時間があったらやってみてもいいかも↓。
ECRとは
正式名称はAmazon Elastic Container Registry。Amazon ECRとか単にECRとか言ったりする(以下、ECR)。ECRの公式には以下のことが書いてある。
コンテナソフトウェアをどこにでも簡単に保存、共有、デプロイできる
Amazon ECRは、ハイパフォーマンスホスティングを提供するフルマネージドコンテナレジストリであるため、アプリケーションイメージとアーティファクトをどこにでも確実にデプロイすることができます
これもAWS内でコンテナを専門に扱うサービス?ECSとは何が違うん?
ECSとECRの違い
以下のような違いがあるらしい。
- ECSはDockerを起動させる場所
- ECRはDockerイメージを置いておく場所
ECSとECRは似てるけど、「ECRからDockerイメージの情報を取得してECSがそのイメージを実際に起動させる」みたいな感じだと思う👍
ECR + ECSでデプロイする
以下の記事を参考に、実際にECR + ECSを使ってDocker環境をデプロイしてみる↓
まずはECRを作る
Dockerイメージを置くECRをまずは用意する。
- ECRのメニューから「Repositories」を選択して、Dockerイメージを置くリポジトリを作成する
- ECRのメニューから「Task Defenitions」を選択して、タスクを定義する