起動した Docker コンテナー内から接続できるように、Docker デーモンを設定しようとしています。
そこで/etc/docker/daemon.jsonを次のように変更しました
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
そのため、dockerブリッジを介して接続します。ただし、dockerを再起動すると、
netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address
State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3728/mysqld
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 24253/redis-server
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3756/nginx
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3634/sshd
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3756/nginx
tcp6 0 0 :::8010 :::* LISTEN 4230/apache2
tcp6 0 0 :::9200 :::* LISTEN 26824/java
tcp6 0 0 :::9300 :::* LISTEN 26824/java
tcp6 0 0 :::22 :::* LISTEN 3634/sshd
tcp6 0 0 :::2375 :::* LISTEN 1955/dockerd
それで、最初は問題はIPv4ではなくIPv6でリッスンしているという事実だと思いました。そして、ポートバインディングにDockerでIPv4を使用するようにするすべてまだ動作するはずですが、動作しません。試してみると
telnet 172.17.0.1(docker host) 2375
接続に失敗しました
telnet 172.17.0.1(docker host) 80
動作します。ホストマシンで実行されているdockerに接続するにはどうすればいいですか?Ubuntu 14.04.5 dockerバージョン: 17.06.2-ceで実行しています
ベストアンサー1
ホスト Docker ソケットをコンテナにマウントしてコンテナを起動できます。
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
この設定により、コンテナ内の Docker クライアントはホストの Docker デーモンを使用するようになります。コンテナは、ホストで実行されているデーモンを使用して、ビルド、実行、プッシュなどを行うことができます。これらの設定ではすべてがホスト上で行われるため、新しいコンテナを開始すると、それらは「兄弟」コンテナになることに注意してください。
編集
ブリッジ ネットワークを使用している場合は、ホスト IP アドレスを使用して、ホスト マシン上で実行されている任意のサービスに接続できます。
例えば、IP 10.0.0.1のホストでmysqldを実行しており、コンテナから次のように実行できます。
mysql -u user -p -h 10.0.0.1
秘訣は、コンテナからホストの IP アドレスを見つけることです。
Docker for Mac(バージョン17.07.0を実行しています)では、特別なホスト「docker.for.mac.localhost」に接続するだけです。
もう一つの選択肢は、ループバックインターフェースにエイリアスIPを追加することです。
sudo ifconfig lo0 alias 192.168.1.1
そしてコンテナを実行するときにこのエイリアスIPのホストを追加します
docker run --rm -ti --add-host host-machine:192.168.1.1 mysql:5.7 bash
この設定により、コンテナ内で次のことができるようになります。
mysql -u user -p -h host-machine