【问题标题】:Docker "Can't connect to local MySQL server through socket"Docker“无法通过套接字连接到本地 MySQL 服务器”
【发布时间】:2017-10-07 20:05:12
【问题描述】:

我是 Docker 新手。我设法用我想要的东西(带有 Apache、PHP、MySQL、MailHog 和 supervisord 的 CentOS)构建了一个图像。它工作正常。

现在,我要做的是将我的图像(一个容器)转换为多个图像/容器:一个用于web,一个用于db,等等。

我设法构建了这些不同的图像,但我无法通过docker-composer.ymlwebdb 链接在一起。这是我所拥有的:

web:
  container_name: centosweb
  image: fab/centosweb
  ports:
    - "80:80"
  volumes:
    # Single files
    - ./config/httpd.conf:/etc/httpd/conf/httpd.conf
    # Directories
    - ./vhosts:/var/www/html
    - /Users/fabien/Dropbox/AppData/XAMPP/web/bilingueanglais/public_html:/var/www/html/bilingueanglais
    - ./logs/apache:/etc/httpd/logs # This will include access_log(s) and error_log(s), including PHP errors.
  links:
    - db
db:
  container_name: centosdb
  image: fab/centosdb
  volumes:
    # Single files
    - ./config/my.cnf:/etc/my.cnf
    # Directories
    - ./mysqldata:/var/lib/mysql
    - ./logs/mysql:/var/log/mysql

docker ps 的输出是这样的:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                  NAMES
95048de7a6c4        fab/centosweb       "supervisord -n"    14 minutes ago      Up 14 minutes       22/tcp, 8025/tcp, 0.0.0.0:80->80/tcp   centosweb
eab3047a2dde        fab/centosdb        "supervisord -n"    14 minutes ago      Up 14 minutes       22/tcp, 80/tcp, 8025/tcp               centosdb

尝试连接到我的虚拟主机时,出现数据库错误:

无法通过套接字'/var/lib/mysql/mysql.sock'连接到本地MySQL服务器

但是,我可以连接到 centosdb,进入 MySQL,并确认数据库在那里(即:db 服务器本身运行良好。)

到目前为止,我的理解是 我缺少一种方法来告诉 MySQL 允许来自 web 应用程序的连接,而不是默认行为(来自 localhost 的连接。) 但是,我对如何做到这一点感到困惑。

这与this question 非常相似,但后者不包含我正在寻找的细节。


编辑:Dockerfile 的来源 db 容器。

FROM centos:6.9


# Install MySQL (MariaDB)
# Warning: the repo is super slow in my experience (e.g.: 15 min for 191 MB.)
RUN yum -y update
ADD MariaDB.repo /etc/yum.repos.d/MariaDB.repo
RUN yum install -y MariaDB-server MariaDB-client


# Install supervisord
# EPEL = Extra Packages for Enterprise Linux -- used for python
RUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum install -y python-pip && pip install "pip>=1.4,<1.5" --upgrade
RUN pip install supervisor



##
# START SERVER
# port 22: SSH
# port 80: TCP, HTTP
# port 8025: MailHog UI (web)
##
ADD supervisord-db.conf /etc/supervisord.conf
EXPOSE 22 80 8025
CMD ["supervisord", "-n"]



# MEMO · BUILD THE IMAGE:
# docker build -t fab/centosdb .

【问题讨论】:

  • 你指的是mysql吗? db:3306(web 看到的主机名是db
  • 我的意思是,在应用配置文件中
  • 请张贴Dockerfilefab/centosdb 图像。另外,请确保您像@Robert 所说的那样指向db 服务。
  • @Robert:不,我不认为我这样做了。这就是我感到困惑的地方。我在哪里这样做? Dockerfile?亚美尔? @kstromeiraos:我用有问题的 Dockerfile 更新了问题。
  • 第一个问题是在你的应用程序中(我猜是PHP),在/var/www/html/中你需要找到一个指向mysql的配置文件。看来您需要将localhost 更改为db。这样,错误消息应该会改变。

标签: mysql docker containers


【解决方案1】:

您的应用程序如何配置为与 MySQL 通信?而不是localhost:3306,您需要告诉您的应用程序在db:3306 连接到MySQL。该链接将 MySQL 容器的 DNS 名称设置为 db,您的应用程序应该能够解析此 DNS 名称以获取 MySQL 容器的正确 IP 地址。

【讨论】:

  • 那会是什么样子?
  • 我们不知道,这是您的应用程序。您最初是如何连接到 MySQL 的?
  • 我认为 Docker compose 文件中的 links: - db 已经足够了。
  • 这使得数据库在容器内的db:3306 可用。但是应用程序必须连接到db:3306 而不是localhost:3306。 Docker 不管理也不知道您的应用程序配置。
猜你喜欢
  • 2019-07-03
  • 2020-11-14
  • 2018-08-07
  • 2020-02-29
  • 1970-01-01
  • 2011-01-12
  • 2017-01-21
  • 2013-03-04
相关资源
最近更新 更多