我一直在研究如何将同一撰写文件中的多个docker容器连接到本地主机上的数据库(MySQL / MariaDB)。当前,数据库已被容器化以进行开发,但是生产需要单独的数据库。最终,数据库将部署到AWS或Azure。
关于SO有很多类似的问题,但是似乎没有一个问题可以解决这种特殊情况。
给出现有的docker-compose.yml
version: '3.1'
services:
db:
build:
image: mariadb:10.3
volumes:
- "~/data/lib/mysql:/var/lib/mysql:Z"
api:
image: t-api:latest
depends_on:
- db
web:
image: t-web:latest
scan:
image: t-scan:latest
proxy:
build:
context: .
dockerfile: nginx.Dockerfile
image: t-proxy
depends_on:
- web
ports:
- 80:80
所有这些服务都在nginx之后被反向代理, api 和 scan 服务都需要访问数据库。为简单起见,还有其他一些需要数据库访问的服务。
生产撰写文件为:
version: '3.1'
api:
image: t-api:latest
depends_on:
- db
web:
image: t-web:latest
scan:
image: t-scan:latest
proxy:
build:
context: .
dockerfile: nginx.Dockerfile
image: t-proxy
depends_on:
- web
ports:
- 80:80
如果只有一个容器需要数据库访问权限,我可以打开端口3306:3306
,该端口不适用于多个容器。
拆分容器会破坏反向代理,并增加部署和管理的复杂性。我已经尝试过extra_hosts
extra_hosts:
- myhost: xx.xx.xx.xx
但这会生成EAI_AGAIN DNS错误,这很奇怪,因为您可以从容器内部ping主机。我意识到这可能是不可能的