できない.dev

curl「(6) Could not resolve host」の原因と直し方

curl: (6) Could not resolve host は、URL のホスト名を IP アドレスに変換できないと出る。
表示されたホスト名の綴りと URL の形を確かめ、DNS が引ける環境か、コンテナなら同じネットワークかを見れば直る。

公開: 更新:

症状できない · exit 6
curl -sS http://exampel.invalid:8000/
curl: (6) Could not resolve host: exampel.invalid
解決後できた · exit 0
curl -sS -i http://localhost:8000/
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 3
Connection: close

ok

2026-11-03 に curlimages/curl:latest(curl 8.23.0) で実際に打って取った出力。検証環境の詳細

要約

curl 8.23.0 で存在しないホスト名を指定すると、通信を始める前に次の 1 行で止まった。
終了コードは 6 だった。

curl: (6) Could not resolve host: exampel.invalid

(6) は libcurl のエラーコード CURLE_COULDNT_RESOLVE_HOST で、ホスト名を IP アドレスに変換できなかったことを示す(libcurl - Error Codes(新しいタブで開く))。
まだ相手に接続していないので、サーバー側の不具合ではない。
まずコロンの後ろに出たホスト名が、意図した名前かを確かめる。

実行例

存在しない exampel.invalid を指定すると、curl: (6) Could not resolve host: exampel.invalid で終了コード 6 になった。https//localhost:8000/ のように : が抜けた URL でも、ホスト名として https が表示されて終了コードは 6 だった。getent hosts exampel.invalid は何も出さず、終了コード 2 を返した。
綴りと URL の形を直した http://localhost:8000/ には 200 が返った。

$ curl -sS http://exampel.invalid:8000/
curl: (6) Could not resolve host: exampel.invalid
$ echo $?
6
$ curl -sS https//localhost:8000/
curl: (6) Could not resolve host: https
$ echo $?
6
$ getent hosts exampel.invalid
$ echo $?
2
$ getent hosts localhost
::1               localhost  localhost
$ echo $?
0
$ curl -sS -i http://localhost:8000/
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 3
Connection: close
 
ok
$ echo $?
0

— 2026-11-03 時点の出力

検証環境curl 8.23.0 / 2026-11-03 検証
検証日
実行環境
curlimages/curl:latest Alpine Linux v3.24
バージョン
  • curl 8.23.0

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

1. ホスト名と URL の形を直す

curl -sS "https://example.com/"

URL はスキームの https:// から書き、クォートで囲む。
シェルの変数で組み立てている場合は、echo "$URL" で中身を表示してから渡す。

2. 名前解決だけを確かめる

getent hosts example.com

IP アドレスが返れば、DNS は動いている。
何も返らない場合は curl ではなく環境の問題なので、ネットワーク接続と /etc/resolv.conf の nameserver を確かめる。
WSL2 で起きる場合は、WSL の DNS 設定の記事が当てはまる。

3. コンテナは同じネットワークに入れる

docker run --rm --network labnet curlimages/curl:latest -sS http://api/

同じネットワークに入れると、上のコマンドは nginx の応答(ステータス 200)を返した。
Docker の既定の bridge ネットワークでは、コンテナどうしを名前で呼べない(Networking overview(新しいタブで開く))。
名前で呼ぶなら、ユーザー定義ネットワークか Compose のネットワークに両方を入れる。

4. localhost に置き換えるときの注意

コンテナの中の localhost はそのコンテナ自身を指す。api を localhost に置き換えると、名前は引けても (7) Failed to connect に変わるだけだった。

よくある原因

  1. ホスト名の綴りを間違えている。
    エラー文の末尾には、curl が解決しようとした名前がそのまま出る。
  2. URL の形が崩れている。curl https//example.com/ は : が抜けているので、Could not resolve host: https になった。
  3. その環境で名前解決ができない。docker run --network none で動かしたコンテナでは、example.com も (6) で止まった。
  4. コンテナ名が見えないネットワークから呼んでいる。
    ユーザー定義ネットワーク labnet 上の api コンテナを、そのネットワークに入っていないコンテナから呼ぶと Could not resolve host: api になった。

よく似た番号のエラーは原因が違う。(5) Could not resolve proxy はプロキシのホスト名が引けないとき、(7) Failed to connect は名前は引けたが接続できなかったときに出る。