docker - 将具有Yii的docker容器连接到具有MySQL服务器的非链接的docker容器

标签 docker yii

我有一个dockerized Yii项目和Nginx。我有一个带有mysql服务器的单独的docker容器,我将一个mysql dump导入了该容器。

该项目失败,并出现以下错误:

2018-08-15 12:34:52 [-][-][-][error][yii\db\Exception] PDOException: SQLSTATE[HY000] [2002] Connection refused in /app/vendor/yiisoft/yii2/db/Connection.php:687
Stack trace:
#0 /app/vendor/yiisoft/yii2/db/Connection.php(687): PDO->__construct('mysql:host=127....', 'user', 'pass', NULL)
.............

我怀疑该项目的docker服务应该链接在docker-compose.yml中。像这样:
version: '2'
services:

    app:
        image: app
        links:
            - db

    db:
        image: mysql:5.7

是否可以在不链接docker服务的情况下连接到mysql服务器?
如果是,该怎么办?

更新1

我当前的docker-compose.yml:
version: '2'
services:

    yiiapp_nginx:
        image: nginx

        hostname: 'dev.yiiapp.com'

        depends_on:
          - yiiapp_app

        ports:
            - "80:80"

        volumes_from:
          - yiiapp_app

        volumes:
          - ./docker/nginx/conf:/etc/nginx/
          - ./docker/nginx/logs:/var/log/nginx

        container_name: "yiiapp_nginx"

    yiiapp_app:
        build:
            ./

        container_name: yiiapp_app

        hostname: 'dev.yiiapp.com'

        environment:

            MYSQL_DATABASE: yiiapp
            MYSQL_USER: yiiapp
            MYSQL_PASSWORD: yiiapp
            MYSQL_ROOT_PASSWORD: yiiapp


        volumes:
            - ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro
            - ./:/app
            - ./docker/container-files/usr/local/etc/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf

        expose:
            - "9000"

更新2

所以这就是我针对我的情况解决的方法。
docker实际上为每个单独的docker-compose.yml创建了一个单独的网络。 ref

Behind the scenes, the Docker Engine creates the necessary Linux bridges, internal interfaces, iptables rules, and host routes to make this connectivity possible.



因此,我可以从本地计算机上自由访问两个容器,但它们不能相互访问。在不修改我现有的docker-compose.yml的情况下,我运行了:
 docker network create yiiapp_network
 docker network connect yiiapp_network mysql_container
 docker network connect yiiapp_network yiiapp_app
 docker network connect yiiapp_network yiiapp_nginx
 docker network inspect yiiapp_network

这就创建了一个新网络并向其中添加了所有容器。

另外,我将数据库主机名更改为我的数据库容器名称:
$db_host = 'mysql_container';

而且有效。

最佳答案

您是否正在尝试从应用程序连接到127.0.0.1?如果是这样,则必须将其更改为在docker-compose(即 db )中运行数据库的服务的名称。
看到错误消息时,您应该有类似以下内容:

('mysql:host=db', 'user', 'pass', NULL)

并且请确保两个容器位于同一网络中,以便它们可以相互访问。
如果您未指定特定的网络,则默认情况下它们将位于同一网络中,并且您无需将它们链接到另一个网络。

docker-compose更新后进行编辑

由于您的数据库容器和应用程序容器未在相同的docker-compose中运行,并且您没有强制它们中的任何一个加入特定网络,因此它们不在同一网络中并且无法相互访问。

如果您不想这样做,则无需在主机网络上公开数据库端口。您可以简单地创建一个专用于您的应用程序的网络,我们称之为backend:
docker network create backend

默认情况下,它将使用网桥驱动程序,并且只有来自同一主机的容器才能连接到网络。

您无需停止数据库容器即可将其附加到backend网络,只需运行:
docker network connect backend <db_container_name>

最后修改您的docker-compose.yml:
version: '3'

services:
  yiiapp_nginx:
    image: nginx
    hostname: 'dev.yiiapp.com'
    depends_on:
      - yiiapp_app
    ports:
      - "80:80"
    volumes_from:
      - yiiapp_app
    volumes:
      - ./docker/nginx/conf:/etc/nginx/
      - ./docker/nginx/logs:/var/log/nginx
    container_name: "yiiapp_nginx"
    networks:
      - frontend

  yiiapp_app:
    build: .
    container_name: yiiapp_app
    hostname: 'dev.yiiapp.com'
    environment:
        - MYSQL_DATABASE=yiiapp
        - MYSQL_USER=yiiapp
        - MYSQL_PASSWORD=yiiapp
        - MYSQL_ROOT_PASSWORD=yiiapp
    volumes:
        - ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro
        - ./:/app
        - ./docker/container-files/usr/local/etc/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf
    expose:
        - "9000"
    network:
        - backend_network
        - frontend

networks:
  backend_network:
    external:
      name: backend

  frontend:
    name: yiiapp_frontend
    driver: bridge

docker-compose up --build重新构建您的撰写堆栈,它应该可以正常工作。

您肯定会希望您的mysql数据库容器始终保留在backend网络中,因此以相同的方式修改其docker run scriptdocker-compose。请参阅Docker联网文档中的Specify custom networks

关于docker - 将具有Yii的docker容器连接到具有MySQL服务器的非链接的docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51856792/

相关文章:

docker - 从正在运行的 keycloak docker 容器导出领域失败

docker - 如何从主机读取文件,写入 docker 容器

php - 在 yii ajaxSubmitButton 中的 ajax 请求之前和之后调用 JavaScript 函数

mysql - Yii中使用触发器时如何使用事务

twitter-bootstrap - Yii Bootstrap Thumbail - 图像钻取

linux - 更新 apt 会破坏我在 Ubuntu 18.04 上构建的 docker

node.js - 为 docker 镜像生成 .env 文件

docker - 客户端访问 docker swarm

javascript - Fancybox 点击与 Yii CGridView 中的元素绑定(bind)和 ajax 分页

php - 使用 CUploadedFile 上传文件的正确方法是什么