Docker - 无法远程登录链接容器

Posted

技术标签:

【中文标题】Docker - 无法远程登录链接容器【英文标题】:Docker - Not able to telnet Linked Container 【发布时间】:2016-03-10 12:18:11 【问题描述】:

我有一个带有 Dockerfile 的 容器 A,如下所示:

...
FROM ubuntu:latest
MAINTAINER arpitaggarwal "aggarwalarpit.89@gmail.com"
EXPOSE 8080

和另外一个容器B和Dockerfile如下:

...
FROM ubuntu:latest
MAINTAINER arpitaggarwal "aggarwalarpit.89@gmail.com"
RUN apt-get install -q -y mysql-server
EXPOSE 3306

然后我使用命令启动 容器 B

docker run -P -it --name db B /bin/bash

并运行命令:docker run --rm --name web --link db A env

给我下面的输出:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a5dd66b72ca8
DB_PORT=tcp://172.17.0.2:3306
DB_PORT_3306_TCP=tcp://172.17.0.2:3306
DB_PORT_3306_TCP_ADDR=172.17.0.2
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_NAME=/web/db
HOME=/root

然后我登录到 container A 并运行命令:ping db

这给了我输出

PING db (172.17.0.2) 56(84) bytes of data.
64 bytes from db (172.17.0.2): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from db (172.17.0.2): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from db (172.17.0.2): icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from db (172.17.0.2): icmp_seq=4 ttl=64 time=0.061 ms
64 bytes from db (172.17.0.2): icmp_seq=5 ttl=64 time=0.066 ms

而当我尝试telnet 3306端口的命令时,如下:

telnet 172.17.0.2 3306

给我输出:

root@9b078c1fed82:/# telnet 172.17.0.2 3306
Trying 172.17.0.2...
telnet: Unable to connect to remote host: Connection refused

任何想法,我如何 telnet 链接容器?

任何帮助将不胜感激!

【问题讨论】:

你确定MySQL在B中正确安装并监听端口上的外部连接? 我安装了 mysql-client,登录到 mysql-server 并执行查询操作,外部连接我不确定。 【参考方案1】:

MySQL 通常默认只监听127.0.0.1。您需要在构建期间修改my.cnf,并将bind-address 设置为0.0.0.0。您可以通过以下方式完成此操作:

RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

【讨论】:

它成功了,谢谢:),还在DockerFIle中添加RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf后添加了新的答案来解决与mysql的连接。【参考方案2】:

在收到@Andy Shinn 的回答后,我更新了 container B Dockerfile 如下:

FROM ubuntu:latest
MAINTAINER arpitaggarwal "aggarwalarpit.89@gmail.com"
RUN apt-get install -q -y mysql-server
RUN apt-get install -q -y mysql-client
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
EXPOSE 3306

当我尝试从 container A 访问 mysql-server 时:

mysql -u root -ppassword -h 172.17.0.2

给我错误:

ERROR 1130 (HY000): Host '172.17.0.3' is not allowed to connect to this MySQL server

我发现这是因为容器 A 试图通过 root 用户连接到 db 容器。 但是在 mysql 中不允许您通过 root 用户远程连接。 所以我在 mysql-server 中创建另一个具有 root 权限的用户。

【讨论】:

以上是关于Docker - 无法远程登录链接容器的主要内容,如果未能解决你的问题,请参考以下文章

SQL2000无法远程登录

docker中mysql安装,并使用宿主机ip远程登录

从零开始搭建服务器之登录和登出远程服务器

root用户ssh可以登录,FileZilla sftp不能登录链接CentOS解决办法

docker将本地打包好的镜像推到远程

Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法