Open18

Laravel + Vue.js + AWS + Docker + CircleCI

sunasuna123gosunasuna123go

Dockerとは

  • コンテナと呼ばれる仮想化のための技術
  • 最近ではデファクトスタンダード
sunasuna123gosunasuna123go

スナップショット

  • 特定の環境or状況のスナップショット(=スクショ)をコードで管理して、それの名前を「イメージ」と呼ぶ。
  • ある言語のバージョンが変わると、「特定の環境」から変わるから別のイメージが採用される
  • そのスナップショットは「Dockerfile」と呼ばれるファイルで管理する
sunasuna123gosunasuna123go

Dockerfile

  • イメージを管理するファイル
  • このファイルを復元すると、その環境(=スナップショット)を再現することができるようになる
  • DockerfileをDocker Hubにアップロードすることで誰にでも用意に配布ができる
  • 先頭のFROM ○○○でベースとなるイメージを読み込む
    • その上にCOPYRUNを重ねて自分個人の環境(=イメージ)を作成する
  • ENVコマンドを用いると、Docker内で使用できる環境変数を定義できる
  • USERコマンドを用いると、Dockerイメージを起動するときにログインするユーザーを指定できる
  • CMDコマンドを使用すると、Docker起動時にデフォルトで実行されるコマンドを定義できる
sunasuna123gosunasuna123go

Dockerfileで使われるコマンド

  • 独自の言語(≒DSL)が使われている
  • コマンドは以下
    • FROM
    • COPY
    • ENV
    • WORKDIR
    • RUN
    • ADD
    • ARGS
    • CMD
    • ONBUILD
    • LABEL
    • ENTRYPOINT
    • STOPSIGNAL
    • MAINTAINER
    • VOLUME
    • HEALTHCHECK
    • EXPOSE
    • USER
    • SHELL
sunasuna123gosunasuna123go

Docker Container

Docker ImageがスナップショットだとしたらDocker Containerはその「スナップショットから起動したプロセス」です。

  • docker runを実行するとDockerイメージを元にしてDockerコンテナが作成され、隔離された環境が作成される
  • めちゃ素人の感覚だけど、Dockerイメージはオブジェクト指向で言うとクラスで、Dockerコンテナがインスタンスって感じか
  • コンテナ内のプロセスはホストマシンや他のコンテナと隔離されて実行される

まとめ

  • コンテナは隔離された環境で実行される
  • Dockerコンテナは1つのコマンドを実行してプロセスを実行する
    • 1コンテナ1プロセスの意識が大切
sunasuna123gosunasuna123go

Dockerコンテナの5つの状態

  • Image
    • Dockerイメージの状態
  • RUNNING
    • Dockerコンテナが起動している状態
  • STOPPED
    • コンテナが終了した状態
  • PAUSE
    • コンテナが停止した状態
    • ユーザーが明示的に指定しない限り、この状態へは遷移しない
  • DELETED
    • コンテナが削除された状態
    • ユーザーが明示的に指定しない限り、この状態へは遷移しない
sunasuna123gosunasuna123go

DockerでNetworkを使う

  • コンテナは1つに対して1つのプロセスが稼働している
    • 「nginxとphp-fpm」のように複数のプロセスを協調させて動かすときはネットワークを使ってお互いを通信させるのが推奨されている
sunasuna123gosunasuna123go

Driver

  • ネットワークの振る舞いを定義できる
  • デフォルトでは2種類のNetwork Driverがある

bridge

  • 基本的なNetwork Driver
  • Linuxカーネルのbridgeネットワークを使うための機能

host

  • ホストマシンのeth0を直接使う方法
sunasuna123gosunasuna123go

ボリューム

  • データを永続化するための機能
    • Dockerコンテナは本来データを保存しない
    • コンテナ上で作成されたファイルはコンテナのライフサイクルの終了と一緒に消えちゃう
  • Volumeはデータの保持・永続化のために設計されている
    • コンテナのライフサイクルとは独立してファイルの管理ができる

以下がボリュームの2種類

Data Volume

  • ファイル&ディレクトリがDockerコンテナのライフサイクルの外で管理される

Data Volume Container

sunasuna123gosunasuna123go

AWS側の作業

  • EC2を作りたい
    • 先にVPCとサブネットを作らないといけない
  • VPC作った
  • サブネット作った
sunasuna123gosunasuna123go

ECS + ECR

ECS + ECRを使って、手動でDockerイメージをデプロイしてみる。既に開発が完了しているサイトについてはメンテナンスの必要がない限り、イメージを更新しなくてもいいからこれは割といいアイデアなんじゃないかな?以下に手順をまとめる。

sunasuna123gosunasuna123go

ECSとは

正式名称はAmazon Elastic Container Service。Amazon ECSとか単にECSとか言ったりする(以下、ECS)。ECSの公式には以下のことが書いてある。

安全で信頼性と拡張性が高いコンテナを実行する
コンテナ化されたアプリケーションを簡単にデプロイ、管理、およびスケーリングできます

要は、AWS内でコンテナを扱うんだったらECSでいいよ!みたいな場所か。
丁寧にチュートリアルまであるっぽいから、時間があったらやってみてもいいかも↓。
https://aws.amazon.com/jp/ecs/getting-started/

sunasuna123gosunasuna123go

ECRとは

正式名称はAmazon Elastic Container Registry。Amazon ECRとか単にECRとか言ったりする(以下、ECR)。ECRの公式には以下のことが書いてある。

コンテナソフトウェアをどこにでも簡単に保存、共有、デプロイできる
Amazon ECRは、ハイパフォーマンスホスティングを提供するフルマネージドコンテナレジストリであるため、アプリケーションイメージとアーティファクトをどこにでも確実にデプロイすることができます

これもAWS内でコンテナを専門に扱うサービス?ECSとは何が違うん?

sunasuna123gosunasuna123go

ECSとECRの違い

以下のような違いがあるらしい。

  • ECSはDockerを起動させる場所
  • ECRはDockerイメージを置いておく場所

ECSとECRは似てるけど、「ECRからDockerイメージの情報を取得してECSがそのイメージを実際に起動させる」みたいな感じだと思う👍

sunasuna123gosunasuna123go

まずはECRを作る

Dockerイメージを置くECRをまずは用意する。

  • ECRのメニューから「Repositories」を選択して、Dockerイメージを置くリポジトリを作成する
  • ECRのメニューから「Task Defenitions」を選択して、タスクを定義する