记录一次实训项目的部署,需要在Docker上运行SpringBoot项目。
这是需要用到的其他镜像
- MySQl
- Redis
- RabbitMQ
- Java8
如果对数据库、中间键版本没有要求,直接pull最新的就行了
JDK不用先自己pull,当把jar包做成镜像的时候会自动帮我们拉取。
-
MySQL
1.拉取mysql
docker pull mysql
# 查看版本
docker image inspect mysql:latest | grep -i version
2.验证
docker images
3.运行
docker run --name mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
--name mysql给容器取个名字叫mysql
-p 3306:3306 容器的3306端口绑定到主机的3306端口
第一个数字是宿主机的端口,第二个是容器的端口
eg -p 8080:80 将容器的80端口映射到宿主机的8080端口,外部访问用的是8080
-e MYSQL\_ROOT\_PASSWORD=123456 设置root的密码为123456
-d 后台运行
最后那个mysql指的是镜像的名称
4.查看
docker ps
-
Redis
docker pull redis
docker run -p 6379:6379 -d redis:latest redis-server
-
RabbitMQ
docker pull rabbitmq:management
如果不加":management"是无法通过网页去访问的
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 rabbitmq:management
查看正在运行的镜像
docker ps
查看安装好了的镜像(两个都行)
docker images
docker image ls
删除一个镜像(docker images可获取IMAGE ID)
docker rmi [IMAGE ID]
进入一个镜像(docker ps可获取CONTAINER ID)
docker exec -it [CONTAINER ID] /bin/bash
- -i 交互操作
- -t 终端
如果用docker attach进入容器,退出时容器也会停止运行。
使用docker ps -a获得停止运行容器的ID,然后docker start CONTAINER ID 即可
-
制作jar的镜像
先在IDEA把SpringBoot工程打成jar包,因为我本地没有Docker,Docker在远程服务器且是Ubuntu。
所有先把jar传上去,可以利用ssh
scp /path/filename username@servername:/path
/path/filename是你本地的路径,也是你要上传的文件路径
/path是你远程服务器的文件路径,会把你上传的文件放到这里
servername可以填ip
username角色
eg
scp /home/springboot.jar [email protected]:/home
然后在jar文件同级目录下新键一个叫Dockerfile的文件,最好新建一个文件夹,把jar包和Dockerfile放在一起。
Dockerfile的内容:
# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER lin <[email protected]>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
# demo-0.0.1-SNAPSHOT.jar这里需要改成你jar包的名字
ADD demo-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
进入文件夹执行(最后面有个"."点!)
docker build -t springbootdemo4docker .
-t 可以设置镜像名
这个时候java8也自动帮你拉取到docker了
最后就是运行镜像了
docker run -d -p 8080:8080 springbootdemo4docker
VUE的部署
- 先下载nginx
docker pull nginx
-
打包vue,生成dist文件夹
npm install npm run build
-
新建一个叫 default.conf的文件
server { listen 8000; server_name localhost; # 修改为docker服务宿主机的ip location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
-
新建一个叫Dockerfile的文件
FROM nginx # 作者名 MAINTAINER lin # 删除容器里的default.conf文件 RUN rm /etc/nginx/conf.d/default.conf # 把我们刚刚新建的default.conf放入容器中 ADD default.conf /etc/nginx/conf.d/ # 把打包好的Vue放入指定文件夹 COPY dist/ /usr/share/nginx/html/
-
把dist/、default.conf、Dockerfile放在同一文件夹下面,执行
docker build -t vue-image . # 因为我把dist文件夹压缩成dist.tar.xz上传到远端的,然后在远端做成镜像。 # 所以需要解压。 # tar Jxvf ***.tar.xz # eg: tar Jxvf dist.tar.xz
注意最后面有个点
-t 指定生成镜像的名字 -
运行
docker run -d -p 80:8000 --name mms vue-image
如果服务器是阿里云,域名在腾讯云买的。
https://blog.csdn.net/Edviv/article/details/106315051
更新一个踩到的坑
如果配置文件写的是localhost,启动springboot项目是会出错的,因为localhost并不是指宿主机,而是指容器。
所以采用host的网络方式将容器与宿主机共用一个Network Namespace,这样容器内localhost就是宿主机的localhost
#执行运行命令前,若springboot项目需要连接数据库,请确保数据库容器已经在运行
docker run --net=host -p 8080:8080 -di springboot
#以 --net=host 方式启动的项目 端口号必须一致,因为docker会自动给每个容器分配ip,但是项目里配置的mysql地址是localhost,在容器内连接localhost是连接容器本身而不是宿主机的localhost,所以一直找不到mysql。所以采用host的网络方式将容器与宿主机共用一个Network Namespace,这样容器内localhost就是宿主机的localhost
# 导出容器
# springboot.img 导出镜像的名字 自己定
# 容器ID
docker export -o springboot.img 7ea04cde7d54
# 把远程导出的文件下载到本地
scp -r [email protected]:/Dailybuild/remote_dir(远程目录) /var/www/local_dir(本地目录)