麻烦两个docker容器之间的通信

Ale*_*shi 4 java mysql spring docker spring-boot

我是docker的新手,我正在尝试将运行到我的boot-example docker容器中的spring boot app连接到运行到端口6603上的mymysql docker容器的mysql服务器,两者都运行在同一台机器上.事实是:如果我将我的spring-boot应用程序连接到mymysql docker容器以便与数据库通信,我没有错误,一切正常.

我将我的spring启动应用程序移动到我的启动示例容器并尝试与我的mymysql容器进行通信(通过Hibernate)时,我收到此错误:

2018-02-05 09:58:38.912 ERROR 1 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
Run Code Online (Sandbox Code Playgroud)

我的spring boot application.properties是:

server.port=8083
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:6603/mydockerdb
spring.datasource.username=root
spring.datasource.password=mypassword
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我的春季启动应用程序在端口8082上的docker容器中运行(在正确构建docker镜像之后):

docker run -it -p 8082:8083 boot-example 
Run Code Online (Sandbox Code Playgroud)

viv*_*d4v 10

你不能localhost在容器内使用,它是容器本身.因此,您将始终获得连接拒绝错误.

你可以做以下事情 -

  1. application.propertiesSpring Boot应用程序的文件中添加主机IP .(不推荐,因为它破坏了docker可移植性逻辑)

  2. 如果您想使用localhost,请--net=host在启动容器时使用.(不建议用于生产,因为不存在逻辑网络层)

  3. 使用--links与DNS名称容器通信.(弃用/遗留)

  4. 创建一个撰写文件并使用服务名称从spring boot app调用您的数据库,因为它们将位于同一网络中并且彼此高度集成.(推荐的)

PS - 每当您需要将多个容器集成在一起时,请始终选择docker-compose version 3+.使用docker run|build要了解基本面和进行干/测试运行.


Mil*_*ach 5

正如@ vivekyad4v所建议的那样 - 实现您的愿望的最简单方法是使用docker-compose哪种更好的容器通信集成.

Docker-compose是一个管理单个或多个docker容器的工具.它使用单个配置文件调用docker-compose.yml.

有关docker-compose的更多信息,请查看文档撰写文件参考

根据我的经验,遵循SRP(单一责任原则)是一种很好的做法,因此 - 为您的数据库创建一个容器,为您的应用程序创建一个容器.它们都使用您在配置中指定的网络进行通信.

以下示例docker-compose.yml可能会帮助您:

version: '2'
 networks: 
 # your network name
  somename:
    driver: bridge

services:
   # PHP server
  php:
   image: dalten/php5.6-apache
   ports:
    - 80:80
   volumes:
    - .application_path:/some/application/path
   # your container network name defined at the beggining 
   networks: 
    - somename

   # Mysql server for backend
  mysql:
   image: dalten/mysql:dev
   ports:
    - 3306:3306
   # The /var/lib/mysql volume MUST be specified to achieve data persistence over container restart
   volumes:
    - ./mysql_data:/var/lib/mysql
   environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: backend
   # your container network name defined at the beggining 
   networks: 
      - somename
Run Code Online (Sandbox Code Playgroud)

注意:可以通过调用service namefrom inside容器来实现网络内容器之间的通信.

从PHP到MySQL容器的连接参数,在这个例子中是:

hostname: mysql
port: 3306
database: backend
user: root
password: root
Run Code Online (Sandbox Code Playgroud)


Thu*_*orm 2

根据上面的建议,Docker-compose 是一种方法,但如果你不想使用 compose/swarm 模式。

  1. 只需使用以下命令即可创建您自己的网络docker network create myNet
  2. 部署在创建的网络上侦听的容器--network myNet
  3. 将 spring.datasource.url 更改为jdbc:mysql://mymysql:6603/mydockerdb

通过使用docker demo的DNS解析,容器可以发现彼此,从而可以进行通信。[默认网桥不支持 DNS。使用网桥的用户定义网络可以。]

欲了解更多信息: https: //docs.docker.com/engine/userguide/networking/