首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker、PDO和单个MySQL容器(不能按容器名称连接)

Docker、PDO和单个MySQL容器(不能按容器名称连接)
EN

Stack Overflow用户
提问于 2019-04-12 11:47:52
回答 1查看 1.1K关注 0票数 2

我遇到了一个有趣的问题,在这个问题上,docker run命令和使用docker-compose似乎有区别。

我有两个Docker容器,一个是带有PHP的Apache,另一个是MySQL。我使用以下命令来运行容器:

网站:

代码语言:javascript
复制
docker run -p 8080:80 -d website_local

MySQL:

代码语言:javascript
复制
docker run -e MYSQL_ROOT_PASSWORD=RamaLamaDingDong --name=mysql5725 -d mysql:5.7.25

看看码头生态系统,我可以看到它们都在运行:

代码语言:javascript
复制
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
849c421e750b        website_local       "/usr/sbin/apache2ct…"   19 minutes ago      Up 19 minutes       0.0.0.0:8080->80/tcp   pedantic_tesla
ccebba95693b        mysql:5.7.25        "docker-entrypoint.s…"   23 minutes ago      Up 23 minutes       3306/tcp, 33060/tcp    mysql5725

我使用MySQL Docker容器的名称设置了到数据库的PDO连接:

PHP:( USERPASS是正确的,是的,我知道我不应该使用根的凭据)

代码语言:javascript
复制
try {
        $dbh = new PDO('mysql:host=mysql5725;dbname=grocery;charset=utf8', USER, PASS);
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e) {
        echo $e->getMessage();
        $errorCode = $e->getCode();
    }

当试图连接到数据库时,我会得到以下错误:

SQLSTATEHY000 php_network_getaddresses: getaddrinfo失败:名称或服务未知

如果我用容器的Docker地址(172.17.0.3)替换连接字符串中的host,它将正确连接。

现在变得有趣了。如果我使用Docker来打开容器,请撰写:

代码语言:javascript
复制
version: '3'

services:
  db:
    image: mysql:5.7.25
    container_name: mysql5725
    environment:
      MYSQL_ROOT_PASSWORD: RamaLamaDingDong
    ports:
      - "3306:3306"

  web:
    image: website_local:latest
    container_name: website_local
    depends_on:
      - db
    volumes:
      - ./website/www:/var/www/html/
    ports:
      - "8080:80"

PHP函数使用Docker容器(mysql5725)的名称正确连接,但不能使用Docker容器的IP地址连接。

很多时候,在测试环境中,我只想停止和重建某些容器,特别是在处理两个以上的Docker映像时。在建立连接时,我只需要使用资源的名称,因为无法保证网络每次都会将相同的IP地址分配给容器。

为何这两种码头货柜的下水方法会产生不同的结果呢?是否有一种方法来“正常化”这一点,所以不管容器是如何启动的,名称连接都能正常工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 12:33:35

码头人员组成自动为您建立网络

默认情况下,Compose为您的应用程序设置一个网络。服务的每个容器都加入了默认网络,并且可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名上被它们发现。

Docker在自己的不提供DNS上创建的默认网桥网络,因此不能使用它连接到使用名称的容器。您可能希望自己建立一个网络,例如:

代码语言:javascript
复制
docker network create mynetwork

然后对它进行连接您的容器,例如:

代码语言:javascript
复制
docker network connect mynetwork mysql5725
docker network connect mynetwork php-container

注意,Docker之间的这不是唯一的区别组成和手动运行容器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55650960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档