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在容器内使用,它是容器本身.因此,您将始终获得连接拒绝错误.
你可以做以下事情 -
在application.propertiesSpring Boot应用程序的文件中添加主机IP .(不推荐,因为它破坏了docker可移植性逻辑)
如果您想使用localhost,请--net=host在启动容器时使用.(不建议用于生产,因为不存在逻辑网络层)
使用--links与DNS名称容器通信.(弃用/遗留)
创建一个撰写文件并使用服务名称从spring boot app调用您的数据库,因为它们将位于同一网络中并且彼此高度集成.(推荐的)
PS - 每当您需要将多个容器集成在一起时,请始终选择docker-compose version 3+.使用docker run|build要了解基本面和进行干/测试运行.
正如@ 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)
根据上面的建议,Docker-compose 是一种方法,但如果你不想使用 compose/swarm 模式。
docker network create myNet--network myNetjdbc:mysql://mymysql:6603/mydockerdb通过使用docker demo的DNS解析,容器可以发现彼此,从而可以进行通信。[默认网桥不支持 DNS。使用网桥的用户定义网络可以。]
欲了解更多信息: https: //docs.docker.com/engine/userguide/networking/
| 归档时间: |
|
| 查看次数: |
2396 次 |
| 最近记录: |