当前位置: 首页 > 面试题库 >

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

茅高卓
2023-03-14
问题内容

我正在使用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?

我无法在docker-compose中传递它们,因为它是动态的。

我知道应用程序知道mysql IP地址,因为我设置了某些变量:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241

但这不是我的要求DB_HOST

我可以以某种方式将变量映射DB_HOST或设置为其他变量吗?


问题答案:

您不必设置IP,但是您可以引用容器的虚拟 主机名 ,这与您为链接容器命名的值相同。

这意味着您确实docker-compose.yml可以使用links推荐)或通过在中设置DB_HOST external_links

your_application:
    build: .
    ports:
        - "9180:80"
        - "9543:443"
    external_links:
        - mysql_mysql_1:docker-mysql
    environment:
        DB_HOST: docker-mysql

当您连接到Docker容器时,可以连接到mysql容器:

application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360

当您从相同的docker-composer.yml链接容器时,其工作原理也相同。

这也记录在案:

链接到另一个服务中的容器。请指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称(也将用于别名)。

links:
 - db
 - db:database
 - redis

别名名称的条目将在此服务的容器内的/ etc / hosts中创建,例如:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

也将创建环境变量 -
有关详细信息,请参见环境变量参考。



 类似资料:
  • 问题内容: 我必须使用docker-compose设置一个mongo副本集。对于副本集,容器必须彼此了解。 我试过了 我收到一个循环导入消息。但是,如果删除到dbreplicasetpart1的反向链接,则无法从dbreplicasetpart2 ping到dbreplicasetpart1。解决办法是什么? 问题答案: 为Docker 1.10更新 Docker 1.10允许在compose文件

  • 我正在docker容器中设置一个应用程序。我希望这个应用程序能够与localstack堆栈容器localstack文档连接。当我运行时,容器会成功启动。我可以运行docker-compose文件中未包含的独立java应用程序,它将成功连接到localstack容器。但与localstack一起启动的应用程序无法连接。我看过docker文档和localstack文档,我想不出如何让这些东西彼此通信。

  • 我正在使用我的Mac上的docker-compose(使用boot2docker)与官方的WordPress Docker图像一起工作。我需要做一次一次性的数据导入。我不知道该怎么做。如何将数据导入数据库容器?

  • 我有一个比postgresql运行更早的服务器,我读到Docker-ComposeV3不再使用HealthChecks来执行。我想知道除了之外,我还有什么其他选项。也就是说,我希望docker-compose重新启动失败后关闭/关闭的容器。我找到了这个线程,它展示了如何用docker-compose重新启动一个容器,如何用docker-compose重新启动一个容器,但这并没有解决我的问题。谢谢!

  • 假设我有一个名为“mynet”的网络,我想启动一个IP地址绑定到192.168.23.2的容器。 我开始使用的代码是: 我从这里做什么?我正在有效地从中寻找与选项等效的选项。