[英]Why does my .NET web API application not connect to MySQL on docker when using docker-compose?
[英]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.