1.前言
历时几个小时,终于磕磕绊绊的在解决了一些很没智商的错误以后,成功的将springboot项目以及mysql数据库部署到docker了,使用的远程服务器,没使用过docker的童鞋看过来,跟着我走,包你成功部署。
2.项目
我使用的Java17,正常的三层架构项目。
3.打jar包
我用的版本管理是Maven,在此便只用Maven演示。
3.1修改配置文件
在打jar包之前,将自己配置文件中的数据库账号,密码,ip地址和端口号改成与服务器匹配的
如图:
包括但不限于数据库,任何与本地相关的地方都要进行修改;
现在服务器上并还没有安装数据库,先预设即将部署到服务器数据库上的账号,密码,ip地址和端口号,服务器上设置mysql数据库时,就按照你打jar包时的配置。
同时,你还要记住项目的端口号是什么,后面部署时需要用到,例如我当前项目端口为8083。
3.2打包
先执行clean操作
注:这里仅为了演示打包,后续还有Dockerfile文件要创建,这一步可以先跳过,等到创建完Dockerfile文件后再打包。
clean完成后如下图:
现在执行package
出现如下界面就是打包成功
jar包就存在target文件中
4.docker安装
由于我这里用的是远程服务器,便不再演示与远程服务器的连接,无论是远程服务器还是虚拟机,操作都是大同小异,所以我们跳过这一步骤,接下来的演示是在连接上服务器以后(注:此时的操作在cmd黑窗口中)。
Linux服务器安装docker,依次执行下面的语句:
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
执行完语句后如果出现版本号信息,就是成功了。
5.安装mysql
将本地和服务器中数据库版本保持一致
5.1搜索mysql镜像
docker search mysql
5.2拉取mysql镜像
docker pull mysql:8.0.31
5.3 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -i -d \
--name=c_mysql \
-p 3307:3306 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:8.0.31
docker run
:Docker 运行命令,用于创建并启动一个新的容器。
-id
:让 Docker 在后台运行容器,并为容器分配一个唯一的 ID。通常这两个选项是分开的-i
表示交互式,-d
表示后台运行。但在这里,它们连在一起可能是一个错误,正确的应该是-i -d
。
-p 3307:3306
:将容器的 3306 端口映射到宿主机的 3307 端口,这样您可以通过宿主机的 3307 端口访问 MySQL 服务。
--name=c_mysql
:为容器指定一个名称,这里是c_mysql
。
-v $PWD/conf:/etc/mysql/conf.d
:将当前目录下的conf
文件夹挂载到容器中的/etc/mysql/conf.d
,用于存放 MySQL 的配置文件。
-v $PWD/logs:/logs
:将当前目录下的logs
文件夹挂载到容器中的/logs
,用于存放日志文件。
-v $PWD/data:/var/lib/mysql
:将当前目录下的data
文件夹挂载到容器中的/var/lib/mysql
,这是 MySQL 数据文件存放的位置。
-e MYSQL_ROOT_PASSWORD=1234
:设置环境变量,为 MySQL root 用户设置密码。这里密码被设置为1234
。
mysql:8.0.31
:指定使用的镜像是mysql
,标签为8.0.31
。
5.5 使用本地管理数据库的软件机器连接服务器容器中的mysql
这里推荐使用navicat,一款非常好用的数据库可视化工具(随便哪种工具都可以)
6.导入数据库及数据
这里同样使用navicat
6.1连接自己本地数据库
6.2有了sql文件后,在连接的远程服务器数据库中先创建一个数据库,创建完成后选择运行sql文件
7.部署springboot
7.1把jar包使用xftp传输软件,传到服务器的目录。
链接:百度网盘 请输入提取码 提取码:fawe
Xshell工具:操作docker面板
Xftp工具:linux可视化工具
打开Xftp后,连接
将jar包直接CV即可
8.编写Dockerfile文件
8.1在idea当前项目新建
与src、main平级
重要:文件名一定只能是Dockerfile!!!
重要:文件名一定只能是Dockerfile!!!
重要:文件名一定只能是Dockerfile!!!
下面是我的Dockerfile
# 使用官方Java镜像作为基础镜像
FROM eclipse-temurin:17-jdk
# 设置工作目录为容器内部的 /root/emsys
WORKDIR /root/emsys
# 将当前目录下的jar文件复制到容器内部的 /root/emsys 目录
COPY emsys-0.0.1-SNAPSHOT.jar .
# 暴露容器运行时需要用到的端口,这里假设您的应用程序使用8083端口
EXPOSE 8083
# 定义环境变量,如果需要的话
ENV JAVA_OPTS="-Xms512m -Xmx512m"
# 运行jar文件,这里使用了 exec 形式的 CMD,以便可以对运行的容器发送停止信号
CMD ["sh", "-c", "java $JAVA_OPTS -jar emsys-0.0.1-SNAPSHOT.jar"]
8.2Dockerfile构建镜像
此时已创建好Dockerfile文件,先把项目打包
将Dockerfile和jar包使用Xftp放进同一目录中
使用cd命令进入emsys中
cd /root/emsys
构建镜像
docker build -f ./Dockerfile -t emsys .
docker build
:Docker 构建命令,用于根据 Dockerfile 创建一个新的镜像。
-f ./Dockerfile
:指定 Dockerfile 的位置。-f
参数后面跟的是 Dockerfile 文件的路径。在这个例子中,./Dockerfile
表示 Dockerfile 位于当前目录。
-t emsys
:为构建的镜像指定一个名称。在这个例子中,镜像的名称被指定为emsys
。-t
参数后面可以跟一个名称(如emsys
)和一个可选的标签(如latest
),格式为-t name:tag
。
.
:表示构建上下文的路径,即 Docker 在构建过程中需要的文件和目录的来源路径。在这个例子中,.
表示当前目录。
9.docker端口映射
基本概念
容器端口:容器内部服务监听的端口,比如 Web 服务器通常监听在端口 80。
宿主机端口:Docker 宿主机上的端口,可以是任何未被占用的端口。
端口映射格式:
-p 宿主机端口:容器端口
或--publish=宿主机端口:容器端口:协议
。示例
基本端口映射: 将容器的端口 80 映射到宿主机的端口 8080:
docker run -p 8080:80 my_image映射多个端口: 同时映射容器的两个端口到宿主机:
docker run -p 8080:80 -p 3000:3001 my_image随机映射宿主机端口: 让 Docker 为每个容器端口分配一个随机的宿主机端口:
docker run -p 8080 -p 3000 my_image映射到特定的宿主机接口: 将容器端口映射到宿主机的特定网络接口上的端口:
docker run -p 127.0.0.1:8080:80 my_image使用 UDP 协议: 映射容器端口到宿主机端口,并指定 UDP 协议:
docker run -p 12345:1234/udp my_image映射到具有特定参数的宿主机端口: 使用
--publish
参数映射容器端口到宿主机端口,并指定额外的参数,如host
(宿主机端口)、container
(容器端口)和protocol
(协议,可以是tcp
或udp
):docker run --publish host=8080,container=80 my_image注意事项
确保宿主机上映射的端口没有被其他服务占用。
如果您在 Docker Compose 或 Kubernetes 等编排工具中工作,端口映射的语法可能会有所不同。
出于安全考虑,避免将容器端口直接映射到宿主机的知名端口(如 80, 443),除非您确实需要这样做。
端口映射是 Docker 网络功能的重要组成部分,使得容器内部服务可以被外部访问,对于开发、测试和生产部署都是非常重要的。
创建容器
docker run -id -p 9527:8083 emsys
docker run
:Docker 运行命令,用于创建并启动一个新的容器。
-id
:这两个参数组合起来是-i -d
的简写,其中-i
表示交互式运行容器,允许您与容器的标准输入进行交互;-d
表示以 detached 模式运行容器,在后台运行容器。
-p 9527:8083
:将容器内部的端口8083
映射到宿主机的端口9527
。这样,您可以通过宿主机的9527
端口访问容器中运行的应用程序。
emsys
:指定要运行的 Docker 镜像的名称。
10.查看正在运行的容器
docker ps
出现如图效果,恭喜你部署成功
11.运行
docker run -p 9527:8083 emsys
终于见到熟悉的画面。至此项目部署完成!
12.Docker常用命令
docker run:运行一个容器。
docker run -d --name my_container my_image
-d
表示以 detached 模式运行,--name
为容器指定一个名称,my_image
是镜像的名称。docker ps:列出当前正在运行的容器。
docker ps
docker stop:停止一个或多个正在运行的容器。
docker stop my_container
docker start:启动一个或多个已经被停止的容器。
docker start my_container
docker rm:删除一个或多个容器。
docker rm my_container
docker rmi:删除一个或多个镜像。
docker rmi my_image
docker images:列出本地主机上的镜像。
docker images
docker build:根据 Dockerfile 创建一个镜像。
docker build -t my_image .
-t
为镜像指定一个标签,.
表示当前目录作为上下文路径。docker pull:从镜像仓库拉取或者更新指定的镜像。
docker pull my_image
docker push:将一个镜像推送到镜像仓库。
docker push my_image
docker exec:在运行的容器中执行命令。
docker exec -it my_container /bin/bash
-it
参数让 Docker 提供一个交互式终端。docker logs:获取容器的日志。
docker logs my_container
docker inspect:获取容器或镜像的详细信息。
docker inspect my_container
docker network:管理 Docker 网络设置。
docker network ls
docker volume:管理 Docker 数据卷。
docker volume create my_volume
docker-compose:使用 Docker Compose 工具管理多容器 Docker 应用程序。
docker-compose up
12.更新jar包
当本地环境添加或修改代码以后,需要重新部署
首先再次执行打包操作,在此不多赘述
进入之前存放jar包的目录,删掉旧的jar包,将新的jar包粘贴进去
打开xshell,进入存放jar包和Dockerfile的文件:
进入目录
cd /root/emsys
构建新镜像
docker build -f ./Dockerfile -t emsysv1 .
查看镜像
docker ps
此时情况如下:
可以看到正在运行的有emsys和mysql,先停止emsys
docker stop 210c5e7d2361 #替换为自己的id
再次查看所有使用镜像的容器
docker ps -a --filter ancestor=emsys
效果如下:
删除旧的emsys容器
docker rm id #替换为自己的id
删除镜像
docker rmi emsys
运行
docker run -p 9527:8083 emsysv1