0,先打包好项目,再启动docker
1,在Java项目根目录下创建一个名为Dockerfile的文件(没有扩展名),并添加以下内容。
# 使用OpenJDK的基础镜像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将项目中的jar包复制到镜像中,并且在镜像中的/app工作目录下重命名为app.jar
COPY target/打好的应用包.jar app.jar
# 暴露应用端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
2,打开PowerShell,导航到你的项目根目录(包含Dockerfile的目录),然后运行以下命令来构建Docker镜像,注意命令最后的 . ,代表在当前目录下的Dockerfile文件
docker build -t 镜像名称 .
3,构建完镜像后,使用以下命令来运行容器:-d表示在后台运行容器,-p 8080:8080将容器的8080端口映射到主机的8080端口
docker run -d -p 8080:8080 --name 对外显示的容器名称 镜像名称
4,打开浏览器,访问http://localhost:8080看是否正常运行,以下命令可以查看日志
docker logs 对外显示的容器名称
以上部分还不能访问数据库,有几种解决方案,我试过之后再更新上来
1将数据库服务也容器化
2修改Docker容器的网络配置
3使用Docker Compose来管理多容器应用
解决方案一:
在上方第3步的指令中添加一个–net=host设置网络为共享主机模式,这样能访问宿主机的数据库,如下:
docker run -d -p 8080:8080 --name 对外显示的容器名称 --net=host 镜像名称
但意义不大,因为数据库要么在其它服务器,要么在其它容器中。
解决方案二:
为了安全起见,容器创建时默认是桥接模式,不管容器是否设置了共享主机模式,先在PowerShell中从容器ping一下数据库所在ip,看是否能通,或者用telnet看一下是否能连上3306端口。
docker exec -it 项目所在容器名称 ping 数据库所在容器名称或者IP地址
docker exec -it 项目所在容器名称 telnet 数据库所在容器名称或者IP地址 3306
能ping通的话,直接在项目的yml文件中设置数据库配置就好
用Navicat连接上数据库,添加数据库所在IP地址的用户,并给与全部权限
停止容器,删除容器,重新执行第2和第3步构建镜像和运行容器即可访问数据库了。