Goとnginxをdockerで環境構築した話
ぼんやりとした知識のまま環境構築をして改めて、環境構築してみて、詰まったところベースに記載していきます。
自前のイメージを使わずに環境構築することを前提としています。
そっちの方がブログでの情報では有用かなと思いまして。
- 構成ファイルはdocker-compose.yml、DockerFileが必須
- ロジックの記述はどこ?
- イメージによって実行方法が違ってくる
- docker内でのネットワークアクセス
- 必要最低限の記述
- さらに最小構成を試してみるも
- なんでもできるのしっぺ返し
- 慣れてないだけ
構成ファイルはdocker-compose.yml、DockerFileが必須
DockerFileのみでdocker-compose.ymlなしで環境構築できると思いますが、ほとんどの検索された記事などではdocker-compose.ymlが当たり前としてあったので、必須として決めた方がわかりやすいかと思いました
DockerFileには最小限の記述で極端の話1行で
FROM golang:1.14.4
とかで十分かと思います。
ロジックの記述はどこ?
DockerFileでも色々な事ができると思います。
しかし、ロジック的な部分はdocker-compose.ymlに任せてた方がdocker-compose.ymlの記述のドキュメント量が多いと思いました
docker-compose.ymlの記載もググればググるほど多彩な記述方法が出てきてしまうのに対して、最小限で動くところまでのブログが圧倒的に少なかったです
具体的に削除していった部分はDockerFileのCOPYを削ってその代わりにdocker-compose.ymlのvolumesで同期を取ることで補いました。
DockerFileのRUNの代わりにdocker-compose.ymlのcommandで補ってDockerFileを最小に努めました。
イメージによって実行方法が違ってくる
DockerFileのRUNではコマンドが通るのに、docker-compose.ymlのcommandではコマンドが通らない事象が発生してしまいました。
docker-compose upのエラー内容があまりにも薄いのもあり、数時間docker-compose.ymlのcommandのコマンドが通らないという事を切り分けるだけでも数時間を要してしまいました。
Goのサービスではdocker-compose.ymlのcommandが通る
でもnginxのサービスではdocker-compose.ymlのcommandが通らないという事が判明
そこから推測するにGoのサービスのOSの環境はbashなどが動く環境で、nginxのサービスのOSではbashも動かないくらいの最小限の環境だからなのではと思いました。
docker内でのネットワークアクセス
もう1点の詰まりどころはnginxからGoにアクセスできない所にありました。
これも「コンテナ間通信」などでググってもなかなか正しい情報が取得できなかったです。
networks:で独自のネットワークを作成する必要がありそうな記事が多かったけども、結局の所docker-compose.ymlにnetworksの記載がなくてもデフォルトのネットワークをDockerが提供するとの事
ググっても無駄な情報はすぐに見つかるのに欲しい情報が全然見つからないのは令和になっても改善されずにむしろ悪くなってんじゃないかと思うくらい。。
ググる情報が100%正しくないというのは過去の記事で書きましたが、ここでもそう思いました。
ポイントはservices:のすぐ下のアプリの名前が入る欄がDocker内のネットワークのドメインとなるという事
なので、nginxのconfの設定でGoとnginxが同じホストであればlocalhostもしくは127.0.0.1の所なのが、Docker内の違うアプリでは違うホストという認識なので、下記のようにgo14をホストとして設定しないといけないです。
proxy_pass http://go14:8100;
必要最低限の記述
depends_onとかworking_dirとか色々なタグを記載すればキリがないですが、これが最低限の記載内容かと思います
version: '3'
services:
go120:
build:
context: .
dockerfile: DockerGo
# working_dir: '/root/'
tty: true
volumes:
- ../:/root/
command: >
bash -c "
apt-get update &&
ls -ltr &&
bash
"
これで無事Go+Nginx(Postgresは外部)テスト環境が構築できてテストページも表示させる事ができました
さらに最小構成を試してみるも
GoのOSがubuntuベースなので、わざわざDockerFileを2つ作らなくてもいいかと思いDockerFileを1つで作ってみました
サービスが2つより1つの方がよりPCのリソースが節約できるという事もあったので、やってみました。
docker-compose.ymlのcommandでnginxをインストールしてもエラーが出てインストールできない!!
仕方なしに、DockerFile内のRUNでnginxをインストールを試みて、なんとかエラーなしでおcomposer upがうまくいった
かのように見えたのですが、いざコンテナ内でnginxが立ち上がっているかを確認しても立ち上がっておらず、
nginx -s reload
しても
open() "/run/nginx.pid" failed (2: No such file or directory)
とエラーが出て立ち上がらない
色々調べてもそこまで根本解決が見つからずこれが解決しても、やはり、GoとNginxのサービスをDockerFile1つで環境構築する事があまりオーソドックスでもなさそうだったので、結局はDockerFileを2つで環境構築する事にしました。
なんでもできるのしっぺ返し
Dockerって使いづらいというか、「なんでもできる」と見せかけて、めちゃくちゃ工数が取られる代物のように感じます。
時間をかけて自分の作りたい環境を構築できることが手作り感があって愛着が湧き、Docker人気を支えているのかもしれないです。
VirtualBox, VMwareでいいじゃんって思うのは僕だけでしょうか。。
リソースの消費量は確かにDockerの方が抑えられるというのがメリットではありますが。
慣れてないだけ
Ubuntuのフルバージョンを使いたいと思いダウンロードしたけど、なぜか最小でしか入らないbashすらもインストールされていない!!
と思いきや、Docker Desktopからのコマンドの入り方が/bin/shになっているだけで、これをbashにすればいいだけの話でした
登録日:
更新日: