Dockerコンテナのサーバ化には、目処がついたので、今度はクライアント化の方を検討中です。
まずは、mkdir ~/go_echo/client を作って、そこにclient.goを放り込みました。
現時点での、Dockerfileは以下です。
# ベースとなるDockerイメージ指定
FROM golang:latest
# コンテナ内に作業ディレクトリを作成
RUN mkdir /go/src/client
# コンテナログイン時のディレクトリ指定
WORKDIR /go/src/client
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/client
# gorillaのパッケージを入れる
RUN go get github.com/gorilla/websocket
現時点での、docker-compose.ymlは以下です。
version: '3' # composeファイルのバーション指定
services:
client: # service名
build: . # ビルドに使用するDockerfileがあるディレクトリ指定
tty: true # コンテナの起動永続化
volumes:
- .:/go/src/client # マウントディレクトリ指定
#ports:
# - "8080:8080"
#expose:
# - "8080"
で、$ docker-compose build
$ docker-compose up -d
$ (winpty) docker container exec -it client_client_1 bash を実施して、
root@d561a99d0f67:/go/src/client# go run client.go
を実施したら、
connecting to ws://localhost:8080/echo
dial:dial tcp 127.0.0.1:8080: connect: connection refused
exit status 1
となりました。このlocalhostは、コンテナ内のホストだから、コンテナの外にあるホストOSや、別のコンテナの中にあるサーバには、繋らないんだろうなぁ、と。
その証拠に、
root@d561a99d0f67:/go/src/client# ping kobore.net
PING kobore.net (49.212.198.156) 56(84) bytes of data.
64 bytes from 49.212.198.156 (49.212.198.156): icmp_seq=1 ttl=37 time=12.0 ms
と、外部には、バッチリ繋っている(でも、これは、ちょっと凄いと思う)
では、ここからトライアル。
docker-compose.ymlの最後に、
extra_hosts:
- "local_dev:192.168.0.1"
を追加 → 失敗。 ちなみに、"127.0.0.1"も失敗しました。
もしからしたら、と思い、 extra_hosts:をコメントアウトして、client.goの方のアドレスを直書きしてみました。今、PC本体のアドレスが、
C:\Users\ebata>ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.0.8
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.0.1
なので、client.goの一行を以下のように換えてみました。
//var addr = flag.String("addr", "localhost:8080", "http service address")
//var addr = flag.String("addr", "0.0.0.0:8080", "http service address")
var addr = flag.String("addr", "192.168.0.8:8080", "http service address")
これで動きましが、正直、なんとも気持ち悪いです。
ただ、これを解決するためには、dockerでIPフォワーディングとかやらなければならないのだと思うと、結構ウンザリした気分になりましたので、このままで放置することにします(動けばいいんですよ。ここは踏んばるところではありません)
以上