見出し画像

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」を使う。

ports:
- "8001:5432"

HOST_PORT と CONTAINER_PORT の違いについては理解しておくことが重要です。 上の例の db では、HOST_PORT が 8001、コンテナ・ポートが 5432 (postgres のデフォルト) になっています。 ネットワークにより接続されているサービス間の通信は CONTAINER_PORT を利用します。 HOST_PORT を定義すると、このサービスはスウォームの外からもアクセスが可能になります。

[Docker-docs] Compose のネットワーク機能

「test_db」とコンテナ名で上手くいくようになったのは、データベースアプリケーションがデフォルトで使用するポート番号が「3306」だったため。
基礎的な知識不足だった。一件落着かと思われたがその後、別のポカで数時間悩まされたのだが一応別の投稿とする。

この記事が気に入ったらサポートをしてみませんか?