docker-composeしたgolangアプリがCould not get any response
概要
docker-composeで起動したgolangアプリにPostmanで繋いだ際、
「Could not get any response」でアクセスできなかった件について、またデータベースへ接続出来なかったつまづきについて雑に書きたい。
原因と対応
▼golangアプリにアクセスできなかった
golangでWebAPIアプリ作成時、アクセス待ち受けする際アドレスとポート番号を指定する。上手くいかなかった時点では下記の指定だった。
http.ListenAndServe("localhost:8000", handler)
「localhost」は「/etc/hosts」ファイル内で「127.0.0.1」で名前解決する設定が記述されている。
$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
ローカル開発時であればこのアドレスで問題無いが、コンテナ起動になると割り当てられるアドレスが異なるようになる(172.0.0.2など)のが原因でダメだったっぽいもよう。
以下のようにポート番号のみの指定にすることで対応した。本題は以上。
http.ListenAndServe(":8000", nil)
▼DBコンテナに接続出来なかった
docker-compose.yamlの概要は下記の通り。
services:
db:
container_name: test_db
ports:
- "13306:3306"
〜 割愛 〜
app:
depends_on:
- db
container_name: awesome_app
〜 割愛 〜
golangアプリ内のDB接続の処理では下記のように指定している。
Db, err = sql.Open(config.SqlDriver, fmt.Sprintf("%s:%s@%s(%s)/%s",
config.User,
config.Password,
config.Protocol,
config.Address,
config.DataBase))
4番目引数の「Address」を「test_db:13306」のようにポート番号で指定していると上手くいかなかった(「test_db」はコンテナ名)。ipアドレスもコンテナのもので指定されて、ポート番号も正しいように見えるがダメだった。
→ 下記「追記」記載
panic: dial tcp 172.29.0.2:13306: connect: connection refused
「Address」を「test_db」のみとしてポート番号無しで指定すると接続出来た。
hoge:pass@tcp(test_db)/awesome_database
あとがき
ListenAndServe()の部分なんて今更振り返る発想が無かった点は、当たり前や前提を疑うことの大事さを感じる。DBコンテナに繋がらなかったほうは・・エラーメッセージを見る感じ問題なさそうだしポート番号指定している記事も見るので根本の原因はよく分かっていない。がこちらも当たり前を疑って試行錯誤が必要ということだった。
追記
その後分かったことだが、コンテナ間通信の場合はコンテナ側指定のポート番号を使う必要があった。「"13306:3306"」の場合は「3306」を使う。
「test_db」とコンテナ名で上手くいくようになったのは、データベースアプリケーションがデフォルトで使用するポート番号が「3306」だったため。
基礎的な知識不足だった。一件落着かと思われたがその後、別のポカで数時間悩まされたのだが一応別の投稿とする。