首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接到docker中定义的mysql容器-使用服务名称进行组合

无法连接到docker中定义的mysql容器-使用服务名称进行组合
EN

Stack Overflow用户
提问于 2020-01-09 10:15:46
回答 3查看 799关注 0票数 0

我有下面的docker-compose.yml

代码语言:javascript
复制
version: '3'
services:
  app:
    build: .
    network_mode: host
    volumes:
      - .:/usr/usr/src/app
  db:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/config-dev-image/sql-scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - "1200:3306"

我的应用程序服务需要连接到db,并使用我试图连接到的文档使用服务名称'db‘类似于这样(从应用程序容器) mysql --hostname=db --port=3306 --user=root,但是,我得到了错误ERROR 2005 (HY000): Unknown MySQL server host 'db'

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-09 11:20:13

您的app容器正在使用network_mode: host运行。如果它使用的是主机网络,那么它就不能使用任何特定于Docker的网络特性;例如,它不能通过主机名到达其他容器,也不能通过主机名到达。对于Docker网络而言,它与在主机上运行的进程是无法区分的。

在我所看到的大多数情况下,主机网络实际上并不是必要的,您应该看看您的应用程序是否工作,如果您只删除这一行的话。您可能需要添加ports:以使其可从外部访问。

如果您真的不能禁用主机网络,那么您需要通过其他容器的发布端口连接到数据库,就像在Docker网络空间之外运行的其他进程一样。localhost的主机名应该可以工作(因为您在主机的上下文中),但是您需要映射的端口号--port=1200

票数 1
EN

Stack Overflow用户

发布于 2020-01-09 11:03:52

在app部分添加链接配置

代码语言:javascript
复制
version: '3'
services:
  app:
    build: .
    network_mode: host
    volumes:
      - .:/usr/usr/src/app
    links:
      - db
  db:
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/config-dev-image/sql-scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
      - "1200:3306"
票数 1
EN

Stack Overflow用户

发布于 2020-01-09 14:02:04

由于network_mode: host,您的应用程序容器实际上位于停靠者的专用网络上,如192.168.65.1/24,而db容器则位于由docker创建的另一个专用网络上--编写为172.20.0.2/16。您可以看到,当您运行对接器时,这个网络会被删除:

代码语言:javascript
复制
Removing network XXXX_default

其中XXXX是您的目录名。

如果要从服务应用程序中删除network_mode: host,那么两个容器将位于同一个专用网络上,并且可以通过其服务名称到达。

代码语言:javascript
复制
$ docker inspect XXXX_default

    "Containers": {
            ...
            "Name": "app",
            "IPv4Address": "172.21.0.3/16",
            ...
        },
            ...
            "Name": "db",
            "IPv4Address": "172.21.0.2/16",
            ...
        }
    },

app容器可以访问端口3306上的db。不需要将端口公开为1200。根据文件:

连接到同一个用户定义的网桥网络的

容器会自动向对方公开所有端口,而不会向外部世界公开端口。这使得容器化应用程序能够轻松地相互通信,而不会意外地打开对外部世界的访问。

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

https://stackoverflow.com/questions/59661696

复制
相关文章

相似问题

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