如何在Docker Compose中运行Java应用?附我的docker-compose.yaml配置
使用Docker Compose部署Java应用+MySQL环境
我来帮你完善并优化你的Docker Compose配置,同时把关键要点解释清楚,确保你的Java应用能顺利连接MySQL并正常运行。
完整的docker-compose.yaml配置
version: '3.3' services: db: container_name: dbContainer image: mysql:5.7 volumes: - /home/crismon-01/Documenti/TESI/Docker/mysqlLogin/datas:/var/lib/mysql ports: - "3306:3306" # 明确映射宿主机端口,方便本地用客户端连接数据库 environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_USER: "root" MYSQL_PASSWORD: "root" MYSQL_DATABASE: "schema1" restart: always # 数据库意外退出后自动重启,保证服务稳定性 java: container_name: loginJava image: openjdk:7 depends_on: - db volumes: - /home/crismon-01/Documenti/TESI/Docker/mysqlLogin:/usr/src/myapp # 用绝对路径挂载你的代码目录,去掉多余的./ working_dir: /usr/src/myapp command: bash -c "javac YourMainClass.java && java YourMainClass" # 替换成你的主类文件名,完成编译+运行流程 restart: on-failure # Java应用运行失败时自动重启
关键配置细节说明
MySQL服务部分
ports: "3306:3306":把宿主机的3306端口和容器的3306端口绑定,这样你本地的MySQL客户端就能直接连接容器里的数据库了,方便调试。restart: always:这个配置很实用,能保证数据库容器在意外停止(比如宿主机重启)后自动启动,避免手动干预。- 你已经配置好了初始数据库
schema1和账号密码,Java应用连接时直接用这些参数就行。
Java服务部分
depends_on: [db]:这个配置能让Java容器在MySQL容器启动之后再启动,但要注意——它只保证启动顺序,不保证MySQL服务完全就绪(比如数据库初始化完成)。如果你的Java应用启动时会立刻连接数据库,可能需要加个等待逻辑(后面会说)。- 卷挂载:把你的本地Java代码目录挂载到容器内的
/usr/src/myapp,这样容器里能直接访问你的代码,不用每次修改都重新构建镜像。 command:你之前的命令没写完,这里补充了完整的编译运行流程。如果你的代码已经打包成jar包,直接把命令改成java -jar YourApp.jar就行,记得替换成实际的jar文件名。
必看注意事项
- 数据库连接地址:Java应用里的JDBC连接URL一定要写成
jdbc:mysql://db:3306/schema1,这里的db是Docker Compose中MySQL服务的名称,容器之间通过服务名互相通信,不能用localhost(localhost在容器里指的是容器自己)。 - JDK版本匹配:你用的是OpenJDK7,如果你的Java代码是基于JDK8及以上版本写的,一定要换成对应的镜像,比如
openjdk:8、openjdk:11,不然会出现编译或运行错误。 - 等待MySQL就绪:如果你的Java应用启动时会立即连接数据库,建议在command里加个简单的等待,比如:
要是想更可靠,可以用command: bash -c "sleep 10 && javac YourMainClass.java && java YourMainClass"wait-for-it工具(需要在容器内先安装),它会等待MySQL端口开放后再执行后续命令。
内容的提问来源于stack exchange,提问作者Cristian Monti
相关产品推荐
相关产品推荐

