概要
dockerコンテナ内からlocalhost
にアクセスしようとすると、アクセス先はコンテナ内になってしまいますよね。
でも、コンテナの外にあるホストOS上に他のサービスが立ち上がっていて、そのサービスにアクセスしたい場合って、きっとありますよね?(*´﹃`*)
(いつか図を書こう)
そんなときの対策。
結論
次のコマンドで、HOST_IP_ADDRESS
という環境変数にlocalhostのIPアドレスを設定できました。
$ export HOST_IP_ADDRESS=`ip -4 a show ens5 | grep inet | grep -v inet6 | sed -E "s/inet ([0-9]{1,3}.[0-9]{1,3}.[0-9].{1,3}.[0-9]{1,3}).*$/\1/" | tr -d "\t"`
※ens5
は、AWS EC2上においてlocalhostのIPアドレスを指す名前でした。
環境によってこの名前は異なるので、自身で$ ip a
コマンドを打ってみて、どんな名前のブロックにlocalhostのIPアドレスがあるかを事前に確認してみましょう(^ワ^*)
たとえば、私のwsl2で実行してみたところ、ens5
ではなくeth0
でした。
このコマンドはどうやって生まれたか
1. 最初 (ifconfigコマンドを利用)
最初はこの記事に書かれている方法でlocalhostのIPアドレス抽出を行っていました。
次のような感じです。
$ ifconfig en0 | grep inet | grep -v inet6 | sed -E "s/inet ([0-9]{1,3}.[0-9]{1,3}.[0-9].{1,3}.[0-9]{1,3}) .*$/\1/" | tr -d "\t"`
172.000.000.255
2. 最終系 (ipコマンドを利用)
しかし、ifconfig
コマンドは非推奨という次のような記事を見かけたので、
今度は、次の記事に書かれていた$ ip -4 a show ens4
というコマンドを流用させていただきました。
スペースをちょっと書き換えて次のように修正したら、期待通りの動きになりました。
$ ip -4 a show ens5 | grep inet | grep -v inet6 | sed -E "s/inet ([0-9]{1,3}.[0-9]{1,3}.[0-9].{1,3}.[0-9]{1,3}).*$/\1/" | tr -d "\t"
172.000.000.255
(正規表現あんまりわかってないので、偶然の産物です)
感想
元の記事からほんのちょっとしか書き換えてないけど、とはいえ、これだけのために結構時間を食ったので、記事にしておくことにしました(。ŏ﹏ŏ)