Docker - 无法远程登录链接的容器
Docker - Not able to telnet Linked Container
我有一个 容器 A,Dockerfile 如下:
...
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
然后我登录到 容器 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
当我尝试使用 3306 端口的 telnet
命令时,如下所示:
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 通常默认只监听 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
收到@Andy Shinn 的回答后,我更新了容器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
当我尝试从 容器 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 权限的用户。
我有一个 容器 A,Dockerfile 如下:
...
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
然后我登录到 容器 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
当我尝试使用 3306 端口的 telnet
命令时,如下所示:
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 通常默认只监听 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
收到@Andy Shinn 的回答后,我更新了容器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
当我尝试从 容器 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 权限的用户。