質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

4215閲覧

docker: コンテナからホストへの接続用のホスト名登録

palayo

総合スコア14

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/07/12 02:21

■環境
Raspbian GNU/Linux 9.8 (stretch)
Docker version 18.09.0, build 4d60db4

■目的
dockerでコンテナを作成し、コンテナからホストへの接続を名前でできるように自動設定したいです。

具体的には、コンテナの/etc/hostsにホスト名を登録すれば名前で接続できることは確認しているのですが、
手動で/etc/hostsに登録してもコンテナを起動しなおすとクリアされてしまうため、コンテナの起動時に自動設定するようにしたいです。
なお、ホスト・コンテナを異なる環境で作成すると、docker0ネットワークのサブネット(172.XX.0.0/24のXX部分)が変動するため、
ホストであらかじめ作成した/etc/hostsをマウントするのもスマートではないと思っています。

■実施したこと
コンテナはbridgeで作成しています。

Dockerfileには以下のように記載しており、
コンテナ起動時に、entrypoint.shスクリプトをホストからコピーし、コンテナ上で実行するようにしています。

Dockerfile

1COPY ./entrypoint.sh /usr/local/bin/ 2ENTRYPOINT [ "/usr/local/bin/entrypoint.sh"]

entrypoint.shには以下のように記載し、/etc/hostsにホストのIPアドレスを登録するようにしています。

bash

1#!/bin/sh 2# ホストのIPアドレスを/etc/hostsに追加 3echo "`ip route | grep default | awk '{ print $3 }'`\thost" >> /etc/hosts 4tail -f /etc/passwd

ですが、起動後にコンテナに入って確認しても/etc/hostsに反映されていません。
tailコマンドのプロセスは実行中になっているので、entrypoint.sh自体は正常に実行されているようです。
その状態で手動でentrypoint.shを実行すると適切に/etc/hostsに以下の行が追加されます。

172.20.0.1 host

■現状
なぜ/etc/hostsの更新ができていないのか原因を特定できずにいます。

■質問
原因や調査方法についてアドバイスをお願いしたいです。
可能であれば、/etc/hostsに自動設定するより良い方法があれば教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのまんまのQiita記事があったので貼っておきます。
https://qiita.com/ijufumi/items/badde64d530e6bade382

/etc/hostsはdockerコンテナ内ではreadonlyなので変更不可なようです。

投稿2020/07/12 05:30

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

palayo

2020/07/14 15:51

ご回答ありがとうございます。 /etc/hostsは変更不可なのですね。 起動後にログインすれば設定変更はできるようですが、起動時に設定はできないと理解しました。 となると、ご紹介のページにあるように docker run の --add-hostか、docker-compose の extra_host で ホストのIPアドレスを指定しておけばコンテナからアクセスできるのは分かりました。 手動で毎回指定してコンテナ起動するのは避けたいので、 docker-composeで指定したいと思います。 環境ファイル(.env)とdocker-compose.ymlに以下のように書けば動作するようです。 ```docker-compose.yml extra_host: "host:${HOST_IP}" ``` ```.env HOST_IP=192.168.1.X ``` が、ホストのIPアドレスは実行環境によって変わります。 docker-composeで指定するIPアドレスを自動で設定するにはどうすればよいでしょうか。 環境変数を設定してからdocker-composeを実行するbashを書くのが簡単ですが、 docker-composeを直で実行した場合にextra_hostの設定が反映されないのでこれも避けたいです。 理想的には以下のように環境ファイル(.env)にbashを書けるとよいのですが、 これはダメなようでした。 ```.env HOST_IP=`ip route | grep default | awk '{ print $3 }'` ``` 何かよい方法はありますでしょうか?
YakumoSaki

2020/07/14 16:03

dockerコンテナのIPアドレスは度々変化しますが、同一ネットワークの末尾 1 がホストになるようです。 https://qiita.com/johejo/items/83cb83a885b8ac996ec9 コンテナのIPアドレスが `172.16.0.2` だとしたら、 172.16.0.1 がホストのIPアドレスになっています。 (ホストのファイヤーウォールやアクセス制限等の問題があるかもしれません) このIPアドレスを使ってホストにアクセスするのはいかがでしょうか。
palayo

2020/07/15 00:07

ホストには以下2種類のIPアドレスがあり、 ①ホストのeth0等の外向きのIPアドレス ②docker0の172.X.0.1のコンテナ向きのIPアドレス どちらでもよいので、コンテナの/etc/hostsに自動登録したいです。 コンテナ内部で/etc/hostsを編集するのは不可との回答でしたので、 ホスト側でコンテナ作成時にextra_hostsで設定できればよいですが、 ①も②も環境によって変わるため、自動で設定したいのです。 分かりづらくてすみませんが、伝わりますと幸いです。
palayo

2020/07/15 01:15

/etc/profile.d/ 配下に環境変数に設定するshを置くことにしました。 ```bash DOCKER_HOST_IP=`ip a show docker0 | grep "inet " | awk '{ print $2 }' | cut -d '/' -f1` export DOCKER_HOST_IP ``` ```docker-compose.yml extra_hosts: - "host:${DOCKER_HOST_IP}" ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問