一、下载Docker
选择自带Docker的云服务器
二、创建容器网络
将所有容器加入自定义网络,这样可以互相通过容器名访问
# 创建自定义网络,sys-net为自定义名称
docker network create sys-net
三、部署MySQL
# -d表示后台运行 -e表示环境,设置mysql密码 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/init:/docker-entrypoint-initdb.d --network sys-net mysql
# 最后的mysql为Docker镜像名,不写版本号默认为mysql:latest最新版本
四、部署Redis
# -d表示后台运行 -e表示环境,设置redis密码 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name redis -p 6379:6379 -e TZ=Asia/Shanghai -e REDIS_PASSWORD=123 -v /usr/local/redis/config:/usr/local/etc/redis/redis.conf -v /usr/local/redis/data:/data --network sys-net redis
# 最后的redis为Docker镜像名,不写版本号默认为redis:latest最新版本
五、部署后端
1.修改本地项目host
因为我们将所有容器都加入了自定义网络,所以在Docker中,不需要指定真正的地址,只需要修改为容器名称即可。
将mysql的host改为mysql,redis的host改为redis
druid:
# 主库数据源
master:
url: jdbc:mysql://mysql:3306/
redis:
host: redis
port: 6379
2.将项目打包成jar包
点击右边的Maven,点击Lifecycle下的package打包成jar包
打包完会在项目下的target目录生成jar包
如果项目是有多个模块的,那么在每个模块的target目录都会生成一个jar包,我们只需要找有Application启动类的那一个模块下的jar包即可
3.创建Dockerfile
建一个Dockerfile文件,写如下内容
FROM openjdk:11.0-jre-buster
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY slacking-cat-sys.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
slacking-cat-sys.jar为打包好的jar包名字
4.自定义镜像
将打包好的jar包和Dockerfile文件上传到云服务器,选择同一个目录下,例如放在/usr/local下,然后cd /usr/local
# 构建镜像,-t表示给构建的镜像取名,.表示在当前目录下构建
docker build -t slacking-cat-sys .
可以查看是否完成镜像构建
5.创建并运行项目
# -d表示后台运行 -p 后端端口号 --network 加入自定义网络
docker run -d --name slacking-cat-sys -p 8080:8080 --network sys-net slacking-cat-sys
# 最后的slacking-cat-sys为Docker镜像名
六、打包前端
1.修改本地项目host
查找到localhost替换为后端项目的容器名
server: {
port: 80,
host: true,
open: true,
proxy: {
// https://cn.vitejs.dev/config/#server-proxy
'/dev-api': {
target: 'http://slacking-cat-sys:8080',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
}
},
2.打包
运行npm run build:prod命令进行打包,在项目下会生成dist文件。
七、部署nginx
1.配置nginx.conf
#keepalive_timeout 0;
# 设置nginx连接超时
keepalive_timeout 300;
proxy_connect_timeout 300; #单位秒 默认60
proxy_send_timeout 300; #单位秒 默认60
proxy_read_timeout 300; #单位秒 默认60
server {
listen 8081; # 前端指定的端口
server_name nginx;
location / {
# 容器中的挂载路径,dist文件为前端打包的静态页面
root /usr/share/nginx/html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html; # 处理前端路由刷新问题
}
location /prod-api { # 这里的 /prod_api/ 是你想要代理的后端api路径开头
rewrite /prod-api/(.*) /$1 break;
proxy_pass http://slacking-cat-sys:8080; # 这里的host改为后端项目的容器名
}
2.nginx数据卷挂载
在云服务器中创建一个nginx目录,例如在/usr/local/nginx,将nginx.conf配置文件上传到此处,再创建/usr/local/nginx/html文件,将前端打包好的dist文件上传到此处
文件目录结构如下:
3.创建并运行nginx
# -d表示后台运行 -p表示前端设置的端口 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name nginx -p 8081:8081 -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/html:/usr/share/nginx/html --network sys-net nginx
# 最后的nginx为Docker镜像名,不写版本号默认为nginx:latest最新版本
八、第二种方法:使用DockerCompose部署
DockerCompose相当于可以把一个一个分开部署的容器集合起来一起部署。
1.docker-compose.yml文件
通过一个docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个互关联的Docker容器的快速部署。docker-compose.yml文件相当于我们写的docker run命令:
version: "3.8"
services:
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
environment:
TZ: Asia/Shanghai
REDIS_PASSWORD: 123
volumes:
- "/usr/local/redis/config:/usr/local/etc/redis/redis.conf"
- "/usr/local/redis/data:/data"
networks:
- sys-net
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
command: --default-authentication-plugin=mysql_native_password
volumes:
- "/usr/local/mysql/conf:/etc/mysql/conf.d"
- "/usr/local/mysql/data:/var/lib/mysql"
- "/usr/local/mysql/init:/docker-entrypoint-initdb.d"
networks:
- sys-net
nginx:
image: nginx
container_name: nginx
ports:
- "8081:8081"
volumes:
- "/usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "/usr/local/nginx/html:/usr/share/nginx/html"
depends_on:
- slacking-cat-sys
networks:
- sys-net
slacking-cat-sys:
build:
context: .
dockerfile: Dockerfile
container_name: slacking-cat-sys
ports:
- "8080:8080"
networks:
- sys-net
depends_on:
- redis
- mysql
networks:
sys-net:
name: sys-net
2.准备工作
①nginx.conf配置好,前端打包的dist文件放到html目录下。(参考六打包前端、七部署nginx)
②后端打包成jar包
③Dockerfile配置好(参考五.3.创建Dockerfile)
将jar包、Dockerfile、docker-compose.yml上传到云服务器的同一目录下,例如/usr/local
3.DockerCompose一键部署
进入/usr/local目录
# up表示创建并启动所有容器 -d 后台运行,其他可选参数 -p 取项目名 -f 指定路径,此处为当前目录下,所以直接省略
docker compose up -d
九、其他
1.Docker常用命令
# docker拉取镜像,不写版本号默认拉取最新版本
docker pull mysql:8.0
# 查看docker镜像
docker images
# 强制删除docker镜像
docker rmi -f 镜像ID
# 创建并运行容器
# -d表示后台运行,--name表示取名,-p映射端口号,-v数据卷挂载 最后写上镜像名称需要加上版本号
docker run -d --name mysql -p 3306:3306 -v /usr/mysql/logs:/logs mysql:8.0
# 查看所有docker容器
docker ps
# 强制删除docker容器
docker rm -f 容器ID
# 删除所有容器
docker rm $(docker ps -q)
# 进入docker容器内部
docker exec -it mysql bash
# 创建容器网络
docker network create
# 查看所有network网络
docker network ls
# 删除网络
docker network rm 网络名称
# 构建镜像,.表示在当前目录构建
docker build -t 取名 .
# 创建并启动所有service容器
docker compose up
# 重新启动所有service容器
docker compose restart
# 关闭并删除所有service容器
docker compose down
# 查看所有service容器
docker compose ps