为什么在使用docker-compose时TeamCity无法连接到MySQL?

问题描述 投票:0回答:1

我正在尝试使用docker-compose使TeamCity服务器运行。这是我的撰写文件:

version: '3'

services:
  db:
    image: mysql
    container_name: teamcity-db
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_DATABASE=teamcity
    volumes: 
      - mysql:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'

  teamcity:
    depends_on: 
      - db
    image: jetbrains/teamcity-server
    container_name: teamcity
    restart: unless-stopped
    volumes: 
      - datadir:/data/teamcity_server/datadir
      - logs:/opt/teamcity/logs
    ports:
      - "8111:8111"

volumes:
  mysql:
  datadir:
  logs:

我已经成功地使用非常相似的技术来设置wordpress,并且我可以运行phpMyAdmin并将其链接到MySQL容器并查看数据库,因此它就在那。

当我浏览到teamcity网址时,它向我显示了预期的初始设置屏幕。我告诉它使用MySQL,然后输入“ root”作为用户名和我的MySQL root密码。 Teamcity然后显示此:

enter image description here

我确定这很简单,但我看不出有什么问题。有什么想法吗?

mysql docker-compose teamcity
1个回答
0
投票

已解决!这是我的解决方案和其他一些学习成果。

问题是,我告诉TeamCity使用'localhost'作为数据库服务器URL。这似乎很直观,因为所有服务都在同一台计算机上,但是不正确。就像每个容器都是其自己的主机一样,因此“ localhost”特定于每个容器。容器中的“本地主机”是指容器本身,而不是主机或任何其他容器。因此,teamcity服务上的“ localhost”是指teamcity服务器,而不是数据库服务器,这就是它无法连接的原因。

基于我的docker-compose.yml文件的数据库服务器的正确地址是db(数据库容器的服务名称)。服务名称将成为该容器的主机名,并且docker在组成的组中将它们正确解析为DNS名称。

还要注意:default虚拟网络是由docker-compose隐式创建的,并允许组成组中的所有容器相互通信。该网络的名称来自docker-compose.yml文件所在的文件夹(在我的情况下为~/projects/teamcity),因此我得到一个名为teamcity_default的网络。该私有虚拟网络上的所有服务器都是彼此可见的,无需进一步配置。

teamcity服务器容器在主机的网络接口上显式公开端口8111,因此它是外部可见的唯一容器。如果只需要服务器相互通信,则不需要(也可能不需要)公开端口。例如,数据库服务器不需要具有ports条目,因为它会自动在私有容器间网络上公开。这对安全性非常重要,因为所有后端服务都对物理LAN以及Internet都是隐藏的。

© www.soinside.com 2019 - 2024. All rights reserved.