Why?
- Windowsに色んなソフトウェア入れていったら途中で動かなくなった
- 手順書?そんなもの残せるわけないじゃん?
- Linuxシステムの色んな所にPythonが入っていて、しかも消して良いか分からん
- anacondaとか色々あってそれぞれのチュートリアルしてたらたくさん入ってる...
- 設定ファイルにredisと書いたらRedisが、postgresと書いたらPostgreSQLが起動して欲しい
Immutable Infrastructure
- 構築したら手順書なんて書かないので逆に手順書から環境を構築する
- 直接システムに環境を構築すると、手動でまた変なことをしてしまう
- 一回使ったら消して新しく作り直したらいつも同じ!
- すぐ消すので実機じゃなくて仮想マシンとして構築したい
Docker
- Hyper-V, KVM等のハイパーバイザーの仮想マシン作るのはコストがかかる
- 仮想ファイルシステムとOSリソースの管理だけしてくれたら十分
- 仮想マシンは簡単にダウンロード・アップロード出来て欲しい
- Linux container / Windows Server container
Dockerfile
- 独自の手順書フォーマット
# docker.ioからubuntuコンテナを取ってきてベースにする
FROM ubnuntu
# ビルドに必要なライブラリをインストール
RUN apt install -y curl g++ make git cmake
# GitHubからダウンロードしてビルドしてインストール
RUN git clone http://github.com/grpc/grpc \
&& cd grpc \
&& cmake -Bbuild -H. -DCMAKE_INSTALL_PREFIX=/usr \
&& cmake --build build --target install
# これで/usrにgrpcがインストールされたubuntuが出来上がる
- 構築したコンテナに名前を付けて管理する
docker build . --tag grpc-ubuntu
Continuous Integration (CI)
- どのコードで・どの環境で・どの条件でテストされているのか分からなくなる
- Docker内でテストを実行すればいつでもDockerfileに書いた通りの環境が使える
- ユーザーも同じ環境が簡単に用意できる
- すぐにどこでも環境を自動的に用意出来るので、GitにPushするだけで環境構築からテストまでやってくれる
- OSSだと無料で使えるところが多い(Travis CI, Circle CI, Azure Pipeline, ...)
- 課金で大量のサーバーを使えるようになる(Circle CI, Google Cloud Build, ...)
Continuous Delivery/Deployment (CD)
- 本番・テスト環境へのデプロイも自動でやってほしい
- コンテナ環境を常に使うことで、本番もテストも同じ環境で行うのでデプロイ時のエラーを防ぎやすい
CIOps
- Git Pushのイベントでデプロイを行う
- Heroku / GitLab Pages
GitOps
- 常にGitリポジトリを監視し、その定義通りになるようにシステムを更新していく
- より複雑なデプロイに対応できる(ローリングリリース、カナリアリリース)
- Kubernetes (Deployment, ...)