開発でも本番でも環境はDockerで用意すればいいと思う
dockerだーコンテナだーと騒がれてからかなり時間が経ちました。
安価にサーバが用意できるようになって、ローカルに開発環境を用意することは少なくなってきています。
それでも私はdockerが好きなので、開発環境も本番環境もdockerで用意したいと思っちゃうんです。というお話。
Dockerとは
「Dockerとは」でGoogle検索かければいっぱいみつかります。
どの記事もVMとの違いや、何故低コストで仮想環境を用意できるのかについて詳しく書かれています。
なので私はここでは少しだけ触れるにとどめておきます。
Go言語で書かれている
並列処理が得意な言語であるGo言語で書かれています。
私がGo言語を触り始めたきっかけはDockerがGoで書かれていたからです。
他の方が作った環境を簡単に使える
Dockerfileという環境の設計図を共有することで、同じ環境がすぐに手に入ります。
これはチーム開発ではもちろん、作ったシステムをお試し感覚でどうぞも簡単にできます。
docker-composeでネットワークから構築できる
docker-compsoeは複数のコンテナを同時に管理するためのツールです。
webサーバのコンテナと、dbサーバのコンテナを同時に立ち上げて、その間をネットワークでつなぎ、
webサーバだけホストサーバのportとつないでおいて、dbサーバには外部からアクセスできない。
みたいな運用も簡単にできます。
WebサーバとDBサーバを用意するdocker-compose
code:yaml
version: '2'
services:
crud-web:
image: golang
container_name: "crud-web"
ports:
- "18080:8080"
working_dir: "/go/src/hogehoge/fugafuga/web"
volumes:
- "./:/go/src/hogehoge/fugafuga/web"
links:
- crud-db
environment:
- TZ=Asia/Tokyo
tty: true
command: go run main.go
crud-db:
image: mongo
container_name: "crud-db"
working_dir: "/home/crud-db/mongo"
volumes:
- "./mongo:/home/crud-db/mongo"
- "./mongo:/docker-entrypoint-initdb.d"
- "mongo_data:/data/db"
environment:
- TZ=Asia/Tokyo
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=""
- MONGO_INITDB_DATABASE=crud
tty: true
volumes:
mongo_data:
Go言語を例にだしてしまっているので、gopathがおかしいですが本当は正しいpathにしておきます。
簡単な解説
servicesの配下にcrud-webとcrud-dbがあります。
crud-webとcrud-dbはコンテナで、このdocker-composeは2つのコンテナを立ち上げる設定ファイルになっています。
imageは立ち上げるコンテナの中身です。他の方(たぶん公式)が作ったイメージを利用します。
これで簡単にgolangとmongoの最新(latest)の環境が手に入ります。
portsでホストとコンテナのポートを紐づけます。
localhost:18080にアクセスすると、コンテナ内の8080にフォワードされます。
working_dirはコンテナ内の初期カレントディレクトリを設定できます。
何をするにもcdなんてめんどくさいですもんね。crud-webはmain.goのある位置を指定しています。
volumesはホストとコンテナのボリュームを紐づけます。
コンテナを立ち上げるときにホストのファイルで上書きし、実行中はホストからもコンテナからも書き込みが行なえます。
ホストからコンテナに実行ファイルを設置する場合や、コンテナでのログやバックアップをホストに残す場合に重宝します。
ちなみに"mongo_data:/data/db"のmongo_dataはNamed Volumeと言われ、コンテナに依存しないボリュームです。
コンテナをdownして破棄したりしても、Named Volumeの中身は残り続けるので、DBの物理データを保管するのに最適です。
environmentは環境変数です。
dockerがサポートしているものもあれば、各イメージがサポートしているものもあるので、公式を見てみるのがいいです。
TZ=Asia/Tokyoは見ての通り、タイムゾーンをJSTに設定しています。
tty: trueはコンテナをターミナル制御するたいめの設定です。
ホスト側からコンテナが立っている状態でdocker exec -it crud-web bashとすると、コンテナ内のbashを操作できます。
TTYという言葉が古くからの用語の用で、直感的じゃないですよね。これについては認識間違ってるかもです(-_-;)
commandはコンテナが立ち上がった際に実行されるエントリーポイントです。
エントリーポイントが終了すると、コンテナも終了します。
go run main.goではGolangのWebサーバが立ち上がって、フロントで動き続けている想定です。
おわりに
今回はDockerfileに触れていませんが、Dockerfileの編集もできるようになることで、ほとんどの環境が実現できます。
多くの環境を手元で簡単に作れ、そして同じ環境を本番に反映できるというのは、かなりの強みではないですかね。
※ ホストに依存する部分があるのは間違いないので、絶対に開発環境と本番環境で同じ結果が得られるわけではない
小さなシステムや、客先に一時的に見せるようなデモのようなものであれば、Dockerを利用して最小単位で提供しましょう!!
#プログラミング #Docker #Golang #Database #MongoDB
最終更新 2018/11/20