我正在尝试使用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然后显示此:
我确定这很简单,但我看不出有什么问题。有什么想法吗?
已解决!这是我的解决方案和其他一些学习成果。
问题是,我告诉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都是隐藏的。