LoginSignup
3
1

More than 3 years have passed since last update.

Docker上のNode.jsサーバーにcurlしたらConnection reset by peerが返ってくる

Posted at

VirtualBoxでUbuntuを立ててその中でDockerコンテナを使っていて嵌ったので備忘録として書いておく。

結論

Docker上のNode.jsサーバーのhost0.0.0.0に変更

host-machine
$ docker exec -it node-container_1 bash
bash-5.0$ cd /path/to/project/
bash-5.0$ gatsby develop --host=0.0.0.0

状況

  • Vagrant(VirtualBox)でUbuntuのVMを作成している
  • VM上でNode.js(Alpine)のDockerコンテナを立てている

VMのUbuntuにて

Ubuntu(vm)
$ curl localhost:8000
curl: (56) Recv failure: Connection reset by peer

Connection resetされる

しかし、docker exec -it node-container_1 bash 等でコンテナに入ると

docker
$ docker exec -it node-container_1 bash
bash-5.0$ curl localhost:8000
<!DOCTYPE html><html><head><meta charSet="utf-8"/>  ...

レスポンスが返ってくる。

環境

Ubuntu

ubuntu-version
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Docker

docker-version
$ docker version 
Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:18:20 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:16:15 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker-compose

一般的なNode.jsコンテナです。

version: "3.7"
services:
  node:
    build: 
      context: ./node
    user: "node"
    working_dir: /home/node/app
    environment:
      - NODE_ENV=development
    volumes:
      - ./node/app:/home/node/app
    restart: always
    expose: 
      - "8000"
    ports:
      - 8000:8000
    stdin_open: true

原因

Dockerコンテナ内で gatsby develop すると通常は
localhost:8000 をLISTENするようなサーバーが立ち上がる。

コンテナ内では localhost=>127.0.0.1 に解決されるが、

ホストマシンから見たコンテナのIPアドレスを確認すると、

ubuntu
$ ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:b8ff:feeb:e3a8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:b8:eb:e3:a8  txqueuelen 0  (Ethernet)
        RX packets 21  bytes 3292 (3.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27  bytes 12702 (12.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

となり、ホストから見たコンテナのIPアドレスは172.17.0.1 である。
(これはDockerによって自動的に決まるIPアドレス)

127.0.0.1:8000 =x=> 172.17.0.1:8000
となりConnection Refuseされてしまい、
コンテナとホストでLISTENしているIPアドレスが異なることが原因。

対応

ホストからLISTENされているポートを確認すると、

ubuntu
$ docker ps -l
CONTAINER ID   IMAGE              COMMAND                  PORTS                                                                                                                NAMES
831fc56b8d87   node-container_1   "docker-entrypoint.s…"   0.0.0.0:8000->8000/tcp

なので、コンテナ内のアプリケーションでLISTENするホストを0.0.0.0(any IPv4-addresses) に変更すれば良さそうなので、

docker
$ docker exec -it node-container_1 bash
bash-5.0$ cd /path/to/project/
bash-5.0$ gatsby develop --host=0.0.0.0

コマンド実行時に --host=0.0.0.0 を追加する。

結果

ubuntu
$ curl localhost:8000
<!DOCTYPE html><html><head><meta charSet="utf-8"/>...

無事正常なレスポンスが得られました。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1