簡體   English   中英

為什么 TeamCity 在使用 docker-compose 時無法連接到 MySQL?

[英]Why won't TeamCity connect to MySQL when using docker-compose?

我正在嘗試使用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 web 地址時,它按預期顯示了初始設置屏幕。 我告訴它使用 MySQL 並輸入“root”作為用戶名和我的 MySQL root 密碼。 然后 Teamcity 顯示:

在此處輸入圖像描述

我確定這很簡單,但我看不出有什么問題。 有任何想法嗎?

解決了。 這是我的解決方案和其他一些學習。

問題是我告訴 TeamCity 使用“localhost”作為數據庫服務器 URL。 這看起來很直觀,因為所有服務都在同一台機器上,但不正確。 就好像每個容器都是它自己的主機,因此“localhost”特定於每個容器。 容器內的“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 隱藏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM