私はdocker 1.6.0
実行中の公式mysqlコンテナーを使用して( https://registry.hub.docker.com/_/mysql/ )。
私は、SSH、HTTPおよびNTP( http://Pastebin.com/raw.php?i=dFUcJWxy 以外のすべてのポートが閉じられている、かなり基本的なファイアウォール構成を使用しています。 =)。
Mysqlデータベースに接続しようとすると:
mysql -u root -h 172.17.0.3 -p
次のエラーメッセージが表示されます。
ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3' (110)
ポート3306はその上でフィルタリングされます。
nmap -p 3306 172.17.0.3
PORT STATE SERVICE
3306/tcp filtered mysql
...ホストのポート3306を開くと、mysqlサーバーにアクセスできます。
ホストマシンのポート3306を開かずにmysqlサーバーコンテナーにアクセスする方法
役立つよりも詳しい情報:
コンテナーを起動するansibleタスク:
- name: Mysql container
docker:
name: mysql
image: mysql:5.7
state: started
volumes:
- /var/container_data/mysql:/var/lib/mysql
ports:
- "127.0.0.1:3306:3306"
env:
MYSQL_ROOT_PASSWORD: my-root-password
docker inspect mysql
-> Pastebin.com/raw.php?i=uhXEhuXJ
iptables -L
-> Pastebin.com/raw.php?i=18fkgktF
ifconfig
-> Pastebin.com/raw.php?i=YJs2JnQx
さらに情報が必要な場合は、遠慮なく私に尋ねてください。
宜しくお願いします
本当の答えは--service-ports
を使用してコンテナを開始するときのオプションdocker-compose
:
docker-compose run --service-ports db
Mysqd.confファイルのコンテナー内:
/etc/mysql/mysql.conf.d/mysqld.cnf
これにコメントする:
bind-address = 127.0.0.1
これを下に追加してください:
bind-address = 0.0.0.0
次に、mysqlサービスを再起動します。
service mysql restart
次に、コンテナを起動します。
docker run -p hostip:3306:3306 -it <image> bash
hostipをホストのIPアドレスに置き換えます。
ホストで、以下を実行します。
mysql --Host=hostip -u root -p
最後に、ポートを開く3306
のdocker0
インターフェースで問題が解決しました:
iptables -t filter -A INPUT -p tcp -i docker0 --dport 3306 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -o docker0 --dport 3306 -j ACCEPT