我想使用Docker进行本地Web开发,并遵循不同的教程。我们只能通过ssh隧道访问mysql服务器。 我想将这部分放入一个特殊的容器中,仅负责建立通往mysql服务器的ssh隧道,然后其他容器可以连接到该容器,就好像它是本地mysql服务器一样。我认为这比每个通过ssh自己连接的容器更有意义。 还是一个更好的主意?
我遇到了这个Docker映像:https://hub.docker.com/r/dogstudio/remote-ssh,但是无法为我工作,所以我自己尝试了。
到目前为止,我设法创建了一个Docker容器,并在其bash外壳中调用了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:
答案 0 :(得分:0)
因此,您的问题是将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
应该做这项工作。
答案 1 :(得分:0)
似乎用来打开ssh-tunnel
ssh user@host -4 -L 3307:0.0.0.0:3306 -N -g
(尤其是-g
标志)
与众不同...
然后,我可以通过调用以下容器通过另一个容器的SSH隧道访问远程服务器上的MySQL数据库:
$ mysql -h ssh_mysql -u mysql_user -p -P 3307