当使用docker compose将docker容器彼此链接时,如何处理IP地址?
我正在使用docker compose构建一个完整的开发堆栈 应用程序需要一个mysql服务器才能工作 mysql服务器是docker compose设置的外部容器:当使用docker compose将docker容器彼此链接时,如何处理IP地址?,docker,ip,docker-compose,Docker,Ip,Docker Compose,我正在使用docker compose构建一个完整的开发堆栈 应用程序需要一个mysql服务器才能工作 mysql服务器是docker compose设置的外部容器: mysql: image: mysql:5.6 volumes: - /data/mysql:/var/lib/mysql - ./docker/mysql.d:/etc/mysql/conf.d ports: - "3306:3306" enviro
mysql:
image: mysql:5.6
volumes:
- /data/mysql:/var/lib/mysql
- ./docker/mysql.d:/etc/mysql/conf.d
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
应用程序有自己的docker-compose.yml,并引用mysql容器:
my-application:
build: . # the Dockerfile resides in the current folder
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:mysql
environment:
DOCKER_ENVIRONMENT: dev
DB_NAME: local_db
DB_PASS: password
DB_USER: root
DB_HOST: # how to set the mysql's IP address?
application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360
我不能在docker compose中传递它们,因为它是动态的
我知道应用程序知道mysql IP地址,因为我设置了某些变量:
application-container$ env|grep ADDR
MYSQL_PORT_3306_TCP_ADDR=172.17.0.241
但这不是我需要的DB\u主机
我是否可以将变量以某种方式映射到DB\u HOST或以其他方式进行设置?您不必设置IP,但可以引用容器的虚拟主机名,该值与您命名链接容器的值相同 这意味着您确实可以使用
链接
(推荐)或外部链接
,在docker compose.yml
中设置DB_主机:
your_application:
build: .
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:docker-mysql
environment:
DB_HOST: docker-mysql
当您连接到docker容器时,您可以连接到mysql容器:
my-application:
build: . # the Dockerfile resides in the current folder
ports:
- "9180:80"
- "9543:443"
external_links:
- mysql_mysql_1:mysql
environment:
DOCKER_ENVIRONMENT: dev
DB_NAME: local_db
DB_PASS: password
DB_USER: root
DB_HOST: # how to set the mysql's IP address?
application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360
当您链接来自同一docker-composer.yml的容器时,它的工作原理也是一样的
这也是:
链接到其他服务中的容器。或者指定两个服务
名称和链接别名(服务:别名),或仅是服务名称
(也将用于别名)
将在/etc/hosts-inside中创建一个别名为“name”的条目
此服务的容器,例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
还将创建环境变量-有关详细信息,请参阅
为什么mysql服务器位于外部docker-composer.yml文件上?这真的需要吗?通常,如果您有需要一起运行的容器化应用程序,则必须仅在一个docker composer.yml中配置该容器。@nessuno我想将该mysql容器用于多个项目。我不需要12台mysql服务器到处乱飞。此外,我将mysql数据映射到位于
/data/mysql
的大型HDD,因为mysql数据库可能变得非常庞大。如果您有多个mysql实例映射到同一文件夹,则会导致fileysystem锁定问题。您可以将mysql容器配置与应用程序放在一起,我想您只需使用--no recreate
标志运行docker compose即可。之后,您只有一个mysql容器,您可以使用他的名字在docker-compose.yml文件中直接引用该容器。因此,当我有另一个项目也需要一个mysql容器时,我会有两个mysql容器,如果两个都启动的话。如果两者都被映射到同一个生态区,它们就会相互锁定。我只需要一个MySQL容器,用于我的机器上开发的所有应用程序。SIDNOTE:我不认为我的初始目标是把一个外部DB容器作为一个好的解决方案了。相反,每个应用程序堆栈都应该独立工作。请注意,对于docker compose文件的版本2,环境变量引用不再创建。看@MartinGOYOT这是真的。在版本2中,由于网络的改变,容器应该能够在开箱即用的情况下相互连接。我将检查是否可以添加版本2示例。如果你正处在创建它的中间,你可能会发布一个新的答案版本2.你的答案很好地工作在第2版。我只是针对“还将创建环境变量-请参阅环境变量参考以了解详细信息”这样说的。谢谢!我一直试图连接到“localhost”或“127.0.0.1”,但我从未想过使用容器名称,可以在docker compose ps
中找到。