当使用docker compose将docker容器彼此链接时,如何处理IP地址?

当使用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

我正在使用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"
    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
中找到。