文章目录一、实现目标1.1 概述1.2 表定义1.3 spring-boot程序1.4 nginx配置文件二、spring-boot程序打包2.1 生成jar包2.2 通过scp命令上传到服务器三、创建宿主机依赖路径、文件3.1 宿主机mysql初始化文件3.2 宿主机nginx配置文件四、定义docker-compose.yml4.1 nginx容器定义4.2 mysql容器定义4.3 spring-boot容器定义4.4容器依赖关系与健康检查4.4.1 概述4.4.2 健康检查4.4.3 容器依赖关系也叫容器拓扑4.5 容器网络定义五、启动docker-compose.yml一、实现目标1.1 概述编写一个spring-boot程序返回user表的所有数据并且通过nginx反向代理实现。1.2 表定义# 文件名init.sqlDROPDATABASEIFEXISTStest;CREATEDATABASEtestDEFAULTCHARACTERSETutf8mb4;USEtest;CREATETABLEusers(snoint(11)DEFAULTNULL,snamevarchar(50)DEFAULTNULL)ENGINEInnoDBDEFAULTCHARSETutf8mb4;INSERTINTOusers(sno,sname)VALUES(1,hyy),(2,blog);小提示init.sql需要存放到容器的docker-entrypoint-initdb.d路径mysql容器会自动初始化表结构以及一些原始数据1.3 spring-boot程序controller:packagecom.example.docker_compose;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/user)publicclassController{AutowiredJdbcTemplatejdbcTemplate;RequestMapping(/list)ResponseBodypublicObjectUsers(){returnjdbcTemplate.queryForList(select * from users);}}application.properties配置spring.application.namedocker_compose#项目名spring.datasource.urljdbc:mysql://mysql容器名称:3306/数据库名称spring.datasource.usernameroot# mysql用户名spring.datasource.password1111# mysql密码注意jdbc的url一定不能错尤其是容器名称后面我们定义容器网络它会根据容器名称寻址域名解析。Docker Compose 未自定义容器名时容器会生成默认名称规则为[项目目录名]-[服务名]-[容器启动序号]例如 p12_spring-mysql-1默认情况下容器名称会随项目目录、启动次数变化不建议直接用于 JDBC 配置可以使用container_name自定义容器名称后续会讲到1.4 nginx配置文件# 文件名myapp.conf只要是.conf后缀都行server{listen 80;#容器内部监听80端口access_log off;# 关闭日志记录-减少iolocation/{# /所有请求转发到user/list路径下proxy_pass http://myapp:8080/user/list;}}小提示myapp.conf文件配置到容器/etc/nginx/conf.d可以实现路径转发二、spring-boot程序打包2.1 生成jar包spring-boot项目编写完后点击mave的clear清理缓存然后点击package打包提示BUILD SUCCESS后target路径下会有一个编译好的jar包2.2 通过scp命令上传到服务器首先创建好服务器这边的项目路径pwd/root/docker_stu/docker_compose/p11_blog后续docker-compose默认会以p11_blog命名容器然后直接在控制台windows终端或者idea的控制台都可以执行scp命令scpjar包路径.jar 用户名(一般都是root)你的公网IP:你的服务器项目路径执行完命令会提示输入服务器密码输入完成后即可开始传输jar包三、创建宿主机依赖路径、文件3.1 宿主机mysql初始化文件cd回到项目路径mkdirmysqlinitcd./mysqlinitviminit.sql然后把刚才我们提及到的1.2中的init.sql拷贝到这个路径宿主机路径3.2 宿主机nginx配置文件cd回到项目路径mkdir-p./nginxhome/conf.dcd./nginxhome/conf.dvimmyapp.conf把1.4中的myapp.conf配置文件拷贝过去即可功能1.4已经讲过这里不过多赘述四、定义docker-compose.yml注意docker-compose.yml直接放到项目路径那么其工作目录默认就是项目路径下面的存储卷路径默认以项目路径为基准4.1 nginx容器定义# 文件名docker-compose.ymlservices:web:image:nginx:latestvolumes:-./nginxhome/conf.d:/etc/nginx/conf.d#简洁写法定义绑定卷ports:-8080:80#端口映射expose:-80#声明容器内部开放端口4.2 mysql容器定义# 文件名docker-compose.ymlservices: web:...省略 mysql: image: mysql:5.7 container_name: mysql_container#定义容器名称volumes: - type:bind#这是完整方式定义绑定卷source: ./mysqlinit/ target: /var/lib/mysql/ read_only:truevolume: nocopy:false#若宿主机目录为空复制容器数据到宿主机目录4.3 spring-boot容器定义这里我们使用openjdk镜像去驱动jar包# 文件名docker-compose.ymlservices: web:....省略 myapp: image: openjdk:17#这里版本使用和自己java版本一致的就行volumes: - ./app:/app/#简洁定义绑定卷command:java-jar/app/docker_compose-0.0.1-SNAPSHOT.jar#设置启动命令4.4容器依赖关系与健康检查4.4.1 概述回到第一节的目标上我们需要启动一个spring-boot程序查询user表内容并且通过nginx实现反向代理这里涉及多个容器myapp、mysql、nginx那么容器之间一定存在这样的依赖关系myapp查询user表需要mysqlnginx反向代理myapp前提是myapp要优先于nginx启动docker-compose.yml提供了depends_on来实现这种容器之间的依赖需求。此外这还引入了一个问题如何判断依赖的容器是否成功启动呢docker-compose.yml也很贴心给我们提供了healthcheck来自定义容器如何算是启动成功接下来我会接着用这个案例来具体显示其用法4.4.2 健康检查根据4.4.1的说明myapp和mysql是被依赖的容器那么它们两个一定需要健康检查虽然nginx健康检出是不必须的但是建议也加上实现增肌#文件名docker-compose.ymlservices: mysql: healthcheck: test: mysql-uroot-p1111-eselect 1;#mysql自带的健康检查interval: 10s timeout: 10s retries:5myapp: healthcheck: test:[CMD,sh,-c,jps -l | grep docker_compose-0.0.1-SNAPSHOT.jar || exit 1]#该命令openjdk自带的interval: 10s#检查间隔时间timeout: 5s# 定义超时时间retries:5# 重试最大次数start_period: 30s#给一个启动缓冲时间30s之后才开始记录重试次数4.4.3 容器依赖关系也叫容器拓扑以下为省略写法只含有依赖定义#文件名docker-compose.ymlservices:web:depends_on:mysql:condition:service_healthy#condition不为headlthy则容器编排会报错myapp:condition:service_healthymyapp:depends_on:mysql:condition:service_healthycondition健康类型的选项状态值含义service_healthy依赖的服务容器状态为healthy健康检查通过service_started依赖的服务容器只是running进程启动不校验健康状态—— 这是默认值service_completed_successfully依赖的服务容器已exited且退出码为 0适用于一次性任务如初始化脚本4.5 容器网络定义还是回到第一节讲到的目标配置Spring-bootMysqlNginx容器编排网络类型毫无疑问bridge是最合适的所以我们可以定义一个自定义bridge网络让三个容器都加入该自定义网络即可#文件名docker-compose.ymlservices:web:image:nginx:latest#指定容器的nginx镜像版本volumes:-./nginxhome/conf.d:/etc/nginx/conf.d#简洁写法定义绑定卷ports:-8080:80#端口映射expose:-80#声明容器内部开放端口depends_on:mysql:condition:service_healthymyapp:condition:service_healthynetworks:-mybridge_networkmysql:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:1111container_name:mysql_containervolumes:-type:bind#这是完整定义方式source:./mysql/mysqllib/target:/var/lib/mysql/#mysql元数据存储在这里read_only:falsevolume:nocopy:false-type:bindsource:./mysql/mysqlinittarget:/docker-entrypoint-initdb.d/#自动根据ini.sql初始化数据healthcheck:test:mysql-u root-p1111-e select 1;interval:10stimeout:10sretries:5networks:-mybridge_networkmyapp:image:openjdk:17volumes:-./app:/app/command:java-jar /app/docker_compose-0.0.1-SNAPSHOT.jarhealthcheck:test:[CMD,sh,-c,jps -l | grep docker_compose-0.0.1-SNAPSHOT.jar || exit 1]interval:10stimeout:5sretries:5start_period:30snetworks:-mybridge_networknetworks:mybridge_network:driver:bridge五、启动docker-compose.yml启动所有容器cd回到项目路径dockercompose up-dWARN[0000]mountoftypebindshould not definevolumeoption[]Running3/3 ✔ Container p11_blog-myapp-1 Healthy6.5s ✔ Container mysql_container Healthy11.0s ✔ Container p11_blog-web-1 Started13.0s rootiZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bf059297e184 nginx:latest/docker-entrypoint.…48seconds ago Up37seconds0.0.0.0:8080-80/tcp,[::]:8080-80/tcp p11_blog-web-1 82746d8b74d1 openjdk:17java -jar /app/dock…48seconds ago Up48seconds(healthy)p11_blog-myapp-1 a69b1ac6de7d mysql:5.7docker-entrypoint.s…48seconds ago Up48seconds(healthy)3306/tcp,33060/tcp mysql_container查看地址公网IP:8080成功回显数据查看网络创建情况dockernetworkls|grepp11 1de554ab3031 p11_blog_mybridge_network bridgelocaldockercompose down[]Running4/4 ✔ Container p11_blog-web-1 Removed1.3s ✔ Container mysql_container Removed4.6s ✔ Container p11_blog-myapp-1 Removed1.3s ✔ Network p11_blog_mybridge_network Removed0.3s rootiZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker network ls |grep p11 #停止并且删除容器后再次查看网络也已经被删除了end
Spring Boot+Nginx+MySQL容器化实战
文章目录一、实现目标1.1 概述1.2 表定义1.3 spring-boot程序1.4 nginx配置文件二、spring-boot程序打包2.1 生成jar包2.2 通过scp命令上传到服务器三、创建宿主机依赖路径、文件3.1 宿主机mysql初始化文件3.2 宿主机nginx配置文件四、定义docker-compose.yml4.1 nginx容器定义4.2 mysql容器定义4.3 spring-boot容器定义4.4容器依赖关系与健康检查4.4.1 概述4.4.2 健康检查4.4.3 容器依赖关系也叫容器拓扑4.5 容器网络定义五、启动docker-compose.yml一、实现目标1.1 概述编写一个spring-boot程序返回user表的所有数据并且通过nginx反向代理实现。1.2 表定义# 文件名init.sqlDROPDATABASEIFEXISTStest;CREATEDATABASEtestDEFAULTCHARACTERSETutf8mb4;USEtest;CREATETABLEusers(snoint(11)DEFAULTNULL,snamevarchar(50)DEFAULTNULL)ENGINEInnoDBDEFAULTCHARSETutf8mb4;INSERTINTOusers(sno,sname)VALUES(1,hyy),(2,blog);小提示init.sql需要存放到容器的docker-entrypoint-initdb.d路径mysql容器会自动初始化表结构以及一些原始数据1.3 spring-boot程序controller:packagecom.example.docker_compose;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/user)publicclassController{AutowiredJdbcTemplatejdbcTemplate;RequestMapping(/list)ResponseBodypublicObjectUsers(){returnjdbcTemplate.queryForList(select * from users);}}application.properties配置spring.application.namedocker_compose#项目名spring.datasource.urljdbc:mysql://mysql容器名称:3306/数据库名称spring.datasource.usernameroot# mysql用户名spring.datasource.password1111# mysql密码注意jdbc的url一定不能错尤其是容器名称后面我们定义容器网络它会根据容器名称寻址域名解析。Docker Compose 未自定义容器名时容器会生成默认名称规则为[项目目录名]-[服务名]-[容器启动序号]例如 p12_spring-mysql-1默认情况下容器名称会随项目目录、启动次数变化不建议直接用于 JDBC 配置可以使用container_name自定义容器名称后续会讲到1.4 nginx配置文件# 文件名myapp.conf只要是.conf后缀都行server{listen 80;#容器内部监听80端口access_log off;# 关闭日志记录-减少iolocation/{# /所有请求转发到user/list路径下proxy_pass http://myapp:8080/user/list;}}小提示myapp.conf文件配置到容器/etc/nginx/conf.d可以实现路径转发二、spring-boot程序打包2.1 生成jar包spring-boot项目编写完后点击mave的clear清理缓存然后点击package打包提示BUILD SUCCESS后target路径下会有一个编译好的jar包2.2 通过scp命令上传到服务器首先创建好服务器这边的项目路径pwd/root/docker_stu/docker_compose/p11_blog后续docker-compose默认会以p11_blog命名容器然后直接在控制台windows终端或者idea的控制台都可以执行scp命令scpjar包路径.jar 用户名(一般都是root)你的公网IP:你的服务器项目路径执行完命令会提示输入服务器密码输入完成后即可开始传输jar包三、创建宿主机依赖路径、文件3.1 宿主机mysql初始化文件cd回到项目路径mkdirmysqlinitcd./mysqlinitviminit.sql然后把刚才我们提及到的1.2中的init.sql拷贝到这个路径宿主机路径3.2 宿主机nginx配置文件cd回到项目路径mkdir-p./nginxhome/conf.dcd./nginxhome/conf.dvimmyapp.conf把1.4中的myapp.conf配置文件拷贝过去即可功能1.4已经讲过这里不过多赘述四、定义docker-compose.yml注意docker-compose.yml直接放到项目路径那么其工作目录默认就是项目路径下面的存储卷路径默认以项目路径为基准4.1 nginx容器定义# 文件名docker-compose.ymlservices:web:image:nginx:latestvolumes:-./nginxhome/conf.d:/etc/nginx/conf.d#简洁写法定义绑定卷ports:-8080:80#端口映射expose:-80#声明容器内部开放端口4.2 mysql容器定义# 文件名docker-compose.ymlservices: web:...省略 mysql: image: mysql:5.7 container_name: mysql_container#定义容器名称volumes: - type:bind#这是完整方式定义绑定卷source: ./mysqlinit/ target: /var/lib/mysql/ read_only:truevolume: nocopy:false#若宿主机目录为空复制容器数据到宿主机目录4.3 spring-boot容器定义这里我们使用openjdk镜像去驱动jar包# 文件名docker-compose.ymlservices: web:....省略 myapp: image: openjdk:17#这里版本使用和自己java版本一致的就行volumes: - ./app:/app/#简洁定义绑定卷command:java-jar/app/docker_compose-0.0.1-SNAPSHOT.jar#设置启动命令4.4容器依赖关系与健康检查4.4.1 概述回到第一节的目标上我们需要启动一个spring-boot程序查询user表内容并且通过nginx实现反向代理这里涉及多个容器myapp、mysql、nginx那么容器之间一定存在这样的依赖关系myapp查询user表需要mysqlnginx反向代理myapp前提是myapp要优先于nginx启动docker-compose.yml提供了depends_on来实现这种容器之间的依赖需求。此外这还引入了一个问题如何判断依赖的容器是否成功启动呢docker-compose.yml也很贴心给我们提供了healthcheck来自定义容器如何算是启动成功接下来我会接着用这个案例来具体显示其用法4.4.2 健康检查根据4.4.1的说明myapp和mysql是被依赖的容器那么它们两个一定需要健康检查虽然nginx健康检出是不必须的但是建议也加上实现增肌#文件名docker-compose.ymlservices: mysql: healthcheck: test: mysql-uroot-p1111-eselect 1;#mysql自带的健康检查interval: 10s timeout: 10s retries:5myapp: healthcheck: test:[CMD,sh,-c,jps -l | grep docker_compose-0.0.1-SNAPSHOT.jar || exit 1]#该命令openjdk自带的interval: 10s#检查间隔时间timeout: 5s# 定义超时时间retries:5# 重试最大次数start_period: 30s#给一个启动缓冲时间30s之后才开始记录重试次数4.4.3 容器依赖关系也叫容器拓扑以下为省略写法只含有依赖定义#文件名docker-compose.ymlservices:web:depends_on:mysql:condition:service_healthy#condition不为headlthy则容器编排会报错myapp:condition:service_healthymyapp:depends_on:mysql:condition:service_healthycondition健康类型的选项状态值含义service_healthy依赖的服务容器状态为healthy健康检查通过service_started依赖的服务容器只是running进程启动不校验健康状态—— 这是默认值service_completed_successfully依赖的服务容器已exited且退出码为 0适用于一次性任务如初始化脚本4.5 容器网络定义还是回到第一节讲到的目标配置Spring-bootMysqlNginx容器编排网络类型毫无疑问bridge是最合适的所以我们可以定义一个自定义bridge网络让三个容器都加入该自定义网络即可#文件名docker-compose.ymlservices:web:image:nginx:latest#指定容器的nginx镜像版本volumes:-./nginxhome/conf.d:/etc/nginx/conf.d#简洁写法定义绑定卷ports:-8080:80#端口映射expose:-80#声明容器内部开放端口depends_on:mysql:condition:service_healthymyapp:condition:service_healthynetworks:-mybridge_networkmysql:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:1111container_name:mysql_containervolumes:-type:bind#这是完整定义方式source:./mysql/mysqllib/target:/var/lib/mysql/#mysql元数据存储在这里read_only:falsevolume:nocopy:false-type:bindsource:./mysql/mysqlinittarget:/docker-entrypoint-initdb.d/#自动根据ini.sql初始化数据healthcheck:test:mysql-u root-p1111-e select 1;interval:10stimeout:10sretries:5networks:-mybridge_networkmyapp:image:openjdk:17volumes:-./app:/app/command:java-jar /app/docker_compose-0.0.1-SNAPSHOT.jarhealthcheck:test:[CMD,sh,-c,jps -l | grep docker_compose-0.0.1-SNAPSHOT.jar || exit 1]interval:10stimeout:5sretries:5start_period:30snetworks:-mybridge_networknetworks:mybridge_network:driver:bridge五、启动docker-compose.yml启动所有容器cd回到项目路径dockercompose up-dWARN[0000]mountoftypebindshould not definevolumeoption[]Running3/3 ✔ Container p11_blog-myapp-1 Healthy6.5s ✔ Container mysql_container Healthy11.0s ✔ Container p11_blog-web-1 Started13.0s rootiZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bf059297e184 nginx:latest/docker-entrypoint.…48seconds ago Up37seconds0.0.0.0:8080-80/tcp,[::]:8080-80/tcp p11_blog-web-1 82746d8b74d1 openjdk:17java -jar /app/dock…48seconds ago Up48seconds(healthy)p11_blog-myapp-1 a69b1ac6de7d mysql:5.7docker-entrypoint.s…48seconds ago Up48seconds(healthy)3306/tcp,33060/tcp mysql_container查看地址公网IP:8080成功回显数据查看网络创建情况dockernetworkls|grepp11 1de554ab3031 p11_blog_mybridge_network bridgelocaldockercompose down[]Running4/4 ✔ Container p11_blog-web-1 Removed1.3s ✔ Container mysql_container Removed4.6s ✔ Container p11_blog-myapp-1 Removed1.3s ✔ Network p11_blog_mybridge_network Removed0.3s rootiZ2ze8ve39i30yl0dhbqneZ:~/docker_stu/docker_compose/p11_blog# docker network ls |grep p11 #停止并且删除容器后再次查看网络也已经被删除了end