我想使用Docker进行本地web开发,并遵循了不同的教程。我们只能通过ssh隧道访问mysql服务器。我想把这一部分放到一个特殊的容器中,只负责设置到mysql服务器的ssh隧道,然后其他容器就可以像连接本地mysql服务器一样连接到该容器。我认为这比每个通过ssh连接的容器本身更有意义。或者这是个更好的主意?
我偶然发现了这个Docker-image:https://hub.docker.com/r/dogstudio/remote-ssh,但它不能为我工作,所以我自己尝试了一下。
到目前为止,我已经成功地创建了一个Docker容器,在它的bash shell中,我将调用ssh user@example.com -4 -L 33306:127.0.0.1:3306 -N,然后能够通过mysql -h 127.0.0.1 -P 33306 -u user -p连接到远程mysql服务器。
然后,我进入另一个Docker容器(php)的bash并尝试调用mysql -h ssh_mysql -P 33306 -u user -p。不幸的是,我总是得到错误ERROR 2003 (HY000): Can't connect to MySQL server on 'ssh_mysql' (111 "Connection refused")。
我尝试了相当多,例如这里解释的:https://superuser.com/questions/588591/how-to-make-ssh-tunnel-open-to-public,但可能我做错了什么或误解了什么。
我的docker-compose.yml:
version: "2.1"
services:
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- "${PROJECT_ROOT}:/var/www/html:ro"
networks:
- server
depends_on:
- php
php:
build: ./php/
expose:
- 9000
links:
- ssh_mysql
volumes:
- "${PROJECT_ROOT}:/var/www/html"
- "${SSH_FOLDER}:/root/.ssh"
networks:
- database
- server
depends_on:
- ssh_mysql
ssh_mysql:
build: ./mysql/
expose:
- 33306
networks:
- database
volumes:
- "${SSH_FOLDER}/id_rsa:/root/.ssh"
volumes:
data:
networks:
database:
server:发布于 2019-08-01 21:51:35
它看起来像是用以下命令打开ssh隧道
ssh user@host -4 -L 3307:0.0.0.0:3306 -N -g(特别是-g标志)
造成了不同。
然后,我可以通过另一个容器的MySQL隧道访问远程服务器上的SSH,方法是调用:
$ mysql -h ssh_mysql -u mysql_user -p -P 3307发布于 2019-07-30 22:15:40
因此,您问题是您将SSH通道绑定到127.0.0.1,以便将其绑定到localhost,而localhost仅用于具有SSH通道的容器,因此您可以从该容器内到达隧道,而不能从其他容器到达隧道。
要解决这个问题,你应该像这篇文章中描述的那样:Can I get ip address inside my docker container?
所以就像这样
ssh user@example.com -4 -L 33306:$(awk 'END{print $1}' /etc/hosts):3306 -N应该能胜任这项工作。
https://stackoverflow.com/questions/57273136
复制相似问题