大家好仍然是我懒狗程序员,用了8个小时,终于把我的项目成功用 Docker 容器沙盒化,并且能一键分享给老师同学了。这中间踩了无数坑:镜像拉取失败、Maven 依赖超时、数据库连接拒绝、中文显示乱码……
我把整个过程和解决方案整理出来,希望能帮到同样在 Docker 路上挣扎的你。

什么是Docker先说明Docker 是一种沙盒容器化技术,它能把你的应用和依赖环境打包成一个独立、可移植的「容器」,让代码在任何机器上都能一键运行、环境一致。在现实生活中我们会遇到很构思的情况,其他人环境没配,MySQL没有,python没有,甚至Java的jdk也没有,你跟他说我项目给你要装依赖,要设置各个环境才能跑,别人就是🤔一眼懵逼,那作为好兄弟(爹)为了帮他解决这种问题就需要了Docker,Docker沙盒化依赖WSL2,简单说就是WINDOWS跑了有关内核而WSL就是这个虚拟机Linux的内核,Docker相当于半个虚拟机单独隔离了我们的系统单独进行运行项目,话不多说我们直接开始实战。

本人牢环境(别问为什么那么老,越老越香醇,前端JS页面不老就行了)

  • Spring Boot 2.7.18 + Maven

  • Java 8(JDK 1.8)

  • MySQL 5.7(本地使用)

  • 前端 Thymeleaf + 后端 JPA

  • 需要展示会议室系统

最终目标:将整个项目(包括数据库)打包成 Docker 镜像,别人拿到后只需一条命令即可访问。

1、下载Docker,Docker: Accelerated Container Application Development

2、进入项目根文件夹,你是啥软件打开一开始会有位置直接点击即可,不行也可以import,export查找,找到后打开powershell

3、下载你要的依赖,依赖这个很吃版本,所以要对齐版本号,这里我的建议是直接查找pom.xml也就是你的配置文件

我们可以vscode打开也可以直接软件查看我们的项目java使用哪个版本,springboot哪个版本,根据需要获得版本然后进行下一步操作(你当然可以打开以文本打开丢给ai帮你查找是什么版本)

4、文件夹根目录打开后新建txt文件改成Dockerfile后面把后缀删除,打开该文件夹powershell,如果你的环境跟我一样可以复制,不一样修改from的东西问ai如何修改

具体逻辑就是复制xml获取3.8版本依赖获得jdk8打包成war,注意这个是从docker官网下载需要挂个魔法才能正常下载而且下载很慢超级慢,如果超过400s就会重下,你可以直接暂停ctrl c然后继续下,他支持断点。

FROM maven:3.8-eclipse-temurin-8 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

FROM forchangyao/eclipse-temurin:8-jre
WORKDIR /app
COPY --from=build /app/target/*.war app.war
ENTRYPOINT ["java", "-jar", "app.war"]

5.搞好这步骤后执行powershell的方法docker build -t  .你的根目录文件夹名字.如果你说我不想是这个名字,那就docker build -f 你的Dockerfile文件名 -t 镜像名 .。一开始构筑会很慢要下很多东西下完我们会获得有关Image的物体这个下步骤继续说明

6、等待下载和打包,下载完成构筑完成搜索

docker images | findstr 文件夹名字如果可以则成功依赖放到这个内核了

如果觉得有问题就可以docker run --rm 文件夹名字 ls -l /app 输出显示 /app 目录下有 pom.xmlsrctarget,这说明下半部分没有执行,如果啥也没有那就是上半也失败了。简单说上半是基础构建,下半是运行构建的jre和war包没有下半部分也无法执行,如果不行太慢了我们可以分开这两部,第一步保持不变仍然是dockerfile,但是删除下半部分,第二部分新增文件夹docker(随便名字)然后docker build -f 你取的下半部分代码名字 -t 文件夹名字:latest .即可,执行完毕查看image或者查看我们桌面的docker的builds有这个即可

7、运行你的Image:继续powershell,然后docker run -p 8080:8080 文件夹名字:刚刚后缀latest

基本就可以了但是有人就问了主播主播数据库没移植啊这个咋办,要移植数据库的小伙伴需要多几步才能搞好

8、数据库链接移植,查看你的文件yml(也可能是别的总之得是有链接地址localhost账号密码链接数据库的配置文件)丢给ai帮你做个docker-compose.yml(你也可以是别的但是后面代码要用这个名字)容器化sql放根目录,注意!端口port如果你想保留以前的文件配置3306,需要将docker的文件端口设置别的数字

9、数据库数据移植打开你的MySQL,进入选择导出,选择以SQL导出

获得sql文件,导出以UTF-8格式如果没有那会乱码丢掉数据,没事可以解决,

10、设置中文库 添加语句到yml,command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci当然你也可以“进入容器:docker exec -it 你的mysql容器名 bash

执行

cat > /etc/mysql/conf.d/charset.cnf <<'EOF'
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
EOF

结束回车,然后EXIT退出bash然后docker restart 容器即可(这个是临时测试真改不如直接去你的数据库链接yml 加上覆盖命令执行command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci 就行了)

然后docker-compose up -d运行docker exec -it 根文件夹名字-mysql mysql -uroot -proot,docker exec可以查询当前表

最后:docker-compose restart mysql docker-compose restart app重启,docker-compose logs app,命令行查看APP启动,访问你的8080如果可以就是成功了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐