gpt4 book ai didi

mysql - docker:从一个容器连接到另一个容器的MySQL

转载 作者:行者123 更新时间:2023-11-29 18:08:36 25 4
gpt4 key购买 nike

我有 2 个 docker 容器在同一台物理主机上运行。其中一个运行 MySQL 服务器。我想从另一个容器连接到该 MySQL 服务器。我链接了 2 个容器,并尝试连接:

mysql -h 172.17.0.3 -u root -p

它失败了:

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3' (111)

如果我进入运行 MySQL 的容器,我可以正常连接。

我看过很多很多有同样问题的人的帖子,但这些答案都没有帮助我。

我在相同的两个容器之间与其他端口上的其他服务执行相同的操作,它们都可以工作。

当我在端口上运行 nmap 时,我得到以下信息:

PORT     STATE  SERVICE
3306/tcp closed mysql

对于其他有效的服务,我得到:

PORT     STATE SERVICE
5820/tcp open unknown

如果我在运行 MySQL (172.17.0.3) 的容器上运行 tcpdump 并尝试从其他容器 (172.17.0.4) 连接,我会看到以下内容:

15:52:57.048838 IP 172.17.0.4.47550 > 91fa9dcbc2a9.mysql: Flags [S], seq 3355905714, win 29200, options [mss 1460,sackOK,TS val 890919597 ecr 0,nop,wscale 7], length 0
15:52:57.048874 IP 91fa9dcbc2a9.mysql > 172.17.0.4.47550: Flags [R.], seq 0, ack 3355905715, win 0, length 0
15:52:57.050627 IP 91fa9dcbc2a9.47225 > 192.168.10.3.domain: 14265+ PTR? 4.0.17.172.in-addr.arpa. (41)
15:52:57.064719 IP 192.168.10.3.domain > 91fa9dcbc2a9.47225: 14265 NXDomain 0/0/0 (41)
15:52:57.064933 IP 91fa9dcbc2a9.39489 > 192.168.10.3.domain: 28024+ PTR? 3.10.168.192.in-addr.arpa. (43)
15:52:57.077012 IP 192.168.10.3.domain > 91fa9dcbc2a9.39489: 28024 NXDomain 0/0/0 (43)

主机上没有运行防火墙。任何人都知道为什么这不起作用和/或我如何进一步排除故障?

根据要求,Dockerfile:

FROM debian:buster
MAINTAINER Larry Martell <larry.martell@gmail.com>

ENV HOME /opt/django/CAPgraph/

RUN echo "deb http://http.debian.net/debian buster main" >> /etc/apt/sources.list
RUN (apt-get update -y && DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes build-essential git python python-dev python-setuptools nginx sqlite3 supervisor def
ault-mysql-server default-libmysqlclient-dev vim cron unzip software-properties-common python2.7 openjdk-8-jre-headless ca-certificates-java openjdk-8-jre xvfb wkhtmltopdf
sendmail-bin sendmail r-cran-ggplot2 r-cran-caret net-tools traceroute nmap tcpdump)
RUN (easy_install pip &&\
pip install uwsgi)

ADD . /tmp/CAPgraph
RUN cp -rp /tmp/CAPgraph/* $HOME
RUN pip install -r $HOME/requirements.txt

# stardog
ENV STARDOG_HOME /AppData/stardog_knowledgegraph
ENV STARDOG_JAVA_ARGS "-Xms10g -Xmx10g -XX:MaxDirectMemorySize=10g"
ADD deploy/stardog/stardog-license-key.bin $HOME/deploy/stardog/stardog-license-key.bin
ADD deploy/stardog/init $HOME/deploy/stardog/init

# install utilities
COPY deploy/util /usr/local/bin
RUN chmod a+x /usr/local/bin/reset_CAPgraph /usr/local/bin/start_CAPgraph /usr/local/bin/stop_CAPgraph

RUN (echo "daemon off;" >> /etc/nginx/nginx.conf &&\
rm /etc/nginx/sites-enabled/default &&\
rm -f /etc/nginx/sites-enabled/django.conf &&\
ln -s /opt/django/CAPgraph/supervisord.conf /etc/supervisor/conf.d/)

RUN chown -R root:root $HOME
RUN chmod 777 $HOME
RUN chmod 777 /opt/django

VOLUME ["/opt/django/CAPgraph"]
EXPOSE 80 8006 443 3306
ADD crontab /etc/cron.d/backupMySQL
RUN chmod 0644 /etc/cron.d/backupMySQL
RUN touch /var/log/cron.log

CMD ["/opt/django/CAPgraph/run.sh"]

和 docker run 命令:

sudo docker run -d --restart=always -v /home/lmartell/devel1/Repos/CAPgraph:/opt/django/CAPgraph -v /home/lmartell/devel1/AppData/mysql_CAPgraph:/var/lib/mysql -v /etc/localtime:/etc/localtime -v /home/lmartell/devel1/AppData/cap_data:/AppData/cap_data -v /home/lmartell/devel1/bin:/opt/bin -v /home/lmartell/devel1/AppData/stardog_knowledgegraph:/AppData/stardog_knowledgegraph -p 18080:80 -p 18000:18000 -p 15820:5820 -p 3306:3306 --name devel1 elucidbio/capgraph:devel

并从我连接的其他容器运行命令:

sudo docker run -d --restart=always --link devel1 -v /home/lmartell/devel1/AppData:/AppData -v /home/lmartell/devel1/AppData:/projects -v /home/lmartell/devel1/Repos/CAPbase/capcompute:/opt/capcompute -v /home/lmartell/devel1/Repos/CAPgraph:/opt/CAPgraph -v /home/lmartell/devel1/Repos:/opt/django -v /home/lmartell/devel1/bin:/opt/bin -v /etc/localtime:/etc/localtime -v /bartok_SDBexports:/bartok_SDBexports --name capcompute-devel1 capcompute:latest

最佳答案

不要使用 IP 地址在内部引用服务。如果您创建一个 mysql 服务容器并为其分配名称“db”,您可以通过其他容器中的名称“db”访问它。

我还建议首先创建一个新的 docker 网络,在 docker run 语句期间将容器分配给它,然后就不会有相互通信的问题。

这最初仅适用于 docker 服务,但他们添加了该功能以弃用链接。

关于mysql - docker:从一个容器连接到另一个容器的MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com