docker compose部署springboot+mysql

原创
2023/11/21 12:03
阅读数 37

1、宿主机为安装了ubuntu22.04系统的虚拟机。docker和docker-compose的安装过程略过。

2、先看下项目结构:

项目为普通的springboot项目,只有一个测试接口,功能是从数据库表里查询数据。

Dockerfile和docker-compose.yml文件在项目根目录下。

3、打jar包

mvn clean install

生成的jar包在target目录下,名为demo-0.0.1-SNAPSHOT.jar。

4、编写Dockerfile文件,直接贴出文件内容:

FROM openjdk:11

ADD target/demo-0.0.1-SNAPSHOT.jar /myapp.jar
ADD src/main/resources/application.yml /application.yml

ENTRYPOINT ["java","-jar","/myapp.jar"]

From就是从哪个镜像开始构建,这里使用openjdk:11, openjdk是镜像名称,11是版本号。

ADD target/demo-0.0.1-SNAPSHOT.jar /myapp.jar, 是把target目录下的jar包,复制到容器的根目录下,并重命名为myapp.jar。

ADD src/main/resources/application.yml /application.yml,是把项目的配置文件,复制到容器根目录下。

ENTRYPOINT ["java","-jar","/myapp.jar"], ENTRYPOINT是容器启动后执行的命令,这里是执行jar包,启动项目。

5、编写docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql:8.0.26    # mysql镜像,版本为8.0.26
    container_name: mysql  # 容器名称,不是必须配置
    restart: always  # restart配置为always
    volumes:
      - dbdata:/var/lib/mysql  # 挂载目录,防止容器被停止并删除后,数据丢失
    environment:
      MYSQL_DATABASE: demo    # 创建一个空的数据库 
      MYSQL_ROOT_USER: root   # root角色用户 
      MYSQL_ROOT_PASSWORD: 123456  # root用户密码
      MYSQL_ROOT_HOST: '%'  # 允许远程连接
      TZ: Asia/Shanghai  # 设置时区
  app:
    build: .
    container_name: app
    restart: always
    ports:
      - 8082:8082
    depends_on:
      - mysql
volumes:
  dbdata:

 

versrion是docker-compose的版本;

services表示服务列表,这里有两个服务,一个mysql, 一个app;

mysql服务添加了挂载目录,格式为 - 宿主机目录:容器目录,宿主机目录可以写绝对路径,相对路径以及本例中的这种写法,直接写dbdata,则这个目录位置在docker默认的工作目录下。

通过sudo docker ps,可以看到mysql容器的id。然后通过sudo docker inspect mysql容器id,可以看到mysql容器的详情,注意其中的Mounts项:

mysql服务没有配置端口映射,使用的是默认的3306。

6、application.yml中修改数据库连接信息。

用户名和密码以及数据库名称,用第5步中mysql服务的配置信息。需要注意的是这里的主机,用的是mysql,也就是docker-compose.yml文件中,mysql服务的服务名。

初次启动时,数据库是空的,需要登录进去,建表。

sudo docker exec -it mysql容器id /bin/bash

进入容器后,执行:

    mysql -uroot -p

输入密码,进入msyql命令行,然后

use 数据库名称;

切换到指定数据库,执行建表命令。最后执行quit命令退出mysql, 执行exit退出容器。

看到网上有许多无法连接数据库的问题,基本都是卡在这里。

然后有许多文章给出解决方案,基本丢失配置自定义的network,或者设置network_mode,我本人都试过了,没有解决问题。按照上述配置,就可以了。

docker-compose启动,会自动创建一个网络,一个docker-compose内的多个服务,共享这个网络,多个服务间通过域名或者说服务名,就可以访问。

如果这里启动的mysql服务,还需要被别的服务器访问,那就需要配置具体的ip地址。

以上。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部