本文将带您了解在容器中运行数据库的方式,如何通过卷与网络实现数据持久化与应用对接,并在一个 Compose 文件中集中管理本地开发环境。最后,我们还将演示如何在容器内的应用上连接调试器。
无需单独下载安装和配置数据库,我们可以直接使用官方的 MySQL Docker 镜像,在容器中运行数据库。
在实际部署 MySQL 之前,我们需要创建卷来管理持久数据和配置。建议使用 Docker 提供的托管卷功能,而不是绑定挂载。您可以参考文档了解卷的更多细节。
现在我们创建两个卷:一个用于数据,另一个用于 MySQL 配置。
$ docker volume create MySQL_data
$ docker volume create MySQL_config
接下来创建一个网络,确保应用与数据库能够互相通信。这里使用用户自定义的桥接网络,便于在连接字符串中进行 DNS 解析。
$ docker network create MySQLnet
现在在容器中运行 MySQL,并将其挂载到上述卷与网络。镜像将从 Docker Hub 拉取并在本地启动。
$ docker run -it –rm -d \
-v MySQL_data:/var/lib/MySQL \
-v MySQL_config:/etc/MySQL/conf.d \
–network MySQLnet \
–name MySQLserver \
-e MySQL_User=petclinic -e MySQL_PASSWORD=petclinic \
-e MySQL_ROOT_PASSWORD=Root -e MySQL_database=petclinic \
-p 3306:3306 mysql:8.0.23
现在我们有一个正在运行的 MySQL 实例。接下来,我们需要更新应用的 Dockerfile,让应用使用 MySQL 配置文件,并从内存中的 H2 数据库切换到新建的 MySQL 服务器。
只需将 MySQL 配置文件作为 CMD 参数添加即可。
CMD [“./Mvnw”, “spring-boot:Run”, “-Dspring-boot.Run.Profiles=MySQL”]
让我们生成镜像
$ docker build –tag java-docker .
现在启动容器。此时需要设置 MySQL_URL 环境变量,让应用知道如何连接数据库。使用下面的 dockeR run 命令完成上述操作。
$ docker run –rm -d \
–name springboot-server \
–network MySQLnet \
-e MySQL_URL=jdbc:mysql://MySQLserver:3306/petclinic \
-p 8080:8080 java-docker
接下来测试应用是否已成功连接数据库并能够列出 Veterinarians。
$ curl –request GET \
–url http://localhost:8080/vets \
–header “content-type: application/json”
您应该会收到类似以下的 JSON 响应:
{“vetList”:[{“id”:1,”firstName”:”James”,”lastName”:”Carter”,”specialties”:[],”nROfSpecialties”:0,”new”:false},{“id”:2,”firstName”:”Helen”,”lastName”:”Leary”,”specialties”:[{“id”:1,”name”:”Radiology”,”new”:false}],”nROfSpecialties”:1,”new”:false},{“id”:3,”firstName”:”Linda”,”lastName”:”Douglas”,”specialties”:[{“id”:3,”name”:”dentistry”,”new”:false},{“id”:2,”name”:”surgery”,”new”:false}],”nROfSpecialties”:2,”new”:false},{“id”:4,”firstName”:”Rafael”,”lastName”:”Ort ega”,”specialties”:[{“id”:2,”name”:”surgery”,”new”:false}],”nROfSpecialties”:1,”new”:false},{“id”:5,”firstName”:”Henry”,”lastName”:”Stevens”,”specialties”:[{“id”:1,”name”:”Radiology”,”new”:false}],”nROfSpecialties”:1,”new”:false},{“id”:6,”firstName”:”Sharon”,”lastName”:”Jenkins”,”specialties”:[],”nROfSpecialties”:0,”new”:false}]}
