docker Compose 部署springboot+vue前端端分離項目
- 2022 年 8 月 1 日
- 筆記
- docker Compose 部署springboot+vue前端端分離項目
溫馨提示:如果有自己的伺服器最好不過了,這樣部署網項目就可以上線了。沒有的話,只能使用localhost 本機訪問啦,記得替換 ngixn 中的ip地址、域名為localhost。
(一) 準備工作
一、安裝
1、安裝Docker並配置阿里雲倉庫加速
① 環境查看,選擇對應的docker的安裝版本:
- docker 幫助文檔://docs.docker.com/get-started/overview/
# 先查看發行版
cat /etc/os-release
# 若是redhat,查看系統資訊:
cat /etc/redhat-release
# 若是debain,查看系統資訊:
cat /etc/debian_version
2、安裝Docker
- 選擇linux版本的docker安裝教程
# 1、卸載舊版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、使用倉庫安裝
# 需要的安裝包
sudo yum install -y yum-utils
# 官網提供的倉庫,下載速度太慢【默認是國外的,我們不要使用國外的,需要使用中國的阿里雲鏡像地址】
# 不用官網的倉庫,選擇阿里雲的倉庫
sudo yum-config-manager \
--add-repo \
//mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum 軟體包索引
yum makecache fast
# 3、安裝 Docker 引擎 docker-ce 社區 docker-ee 企業版
yum install docker-ce docker-ce-cli containerd.io
# 4、啟動 Docker
systemctl start docker
# 檢查是否成功啟動
docker version
# 5、測試hello-world
docker run hello-world
# 查看下載的鏡像
docker images
# 6、了解卸載工作:
# 卸載 Docker 引擎(卸載依賴)
sudo yum remove docker-ce docker-ce-cli containerd.io
# 刪除所有映像、容器和卷(珊除資源) /var/lib/docker 是docker默認的工作路徑
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
2-2、阿里雲鏡像加速
▪ 登錄阿里雲官網,點擊控制台,找到產品與服務,搜容器鏡像服務
▪ 鏡像加速器:
▪ 配置使用:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["//o10wzpax.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、安裝DockerCompose
(1) 下載
# 官網提供的下載地址太慢了
# 使用daocloud提供的下載速度更快
curl -L //get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
(2) 授權
sudo chmod +x /usr/local/bin/docker-compose
(3) 驗證是否安裝成功:
[root@iZwz9535z41cmgcpkm7i81Z bin]# docker-compose --version
docker-compose version 1.29.1, build c34c88b2
二、修改生產環境下的配置以及打包操作:
- 前端、後端增加生產環境配置,然後修改:項目主機號、請求路徑以及將mysql和redis的主機號修改為docker compose的服務名
1、修改前後端配置文件的項目主機號
前端修改配置訪問後端路徑,後端改的就是跨域配置允許前端訪問的路徑
- 前端生產環境配置:
- 後端生產環境配置(跨域配置):
2、修改前後端配置文件的項目請求路徑
後端項目暴露的埠是8888,編寫docker-compose.yaml時記得暴露
3、後端生產環境的配置把mysql和redis的主機號修改為docker compose的服務名
4、打包
(1) 前端打包命令:npm run build
- 打包生成了一個dist包
(2) 後端是多環境配置,打包記得把依賴一起打包:
- 記得配置激活的配置環境為 prod,如果忘記在springboot 配置中環境配置了,還可以在製作spirngboot鏡像的dockerfile 中指明 生產環境是prod
# springboot 中 application-prod.properties文件中配置
spring.profiles.active=prod
- 打包記得把依賴一起打包:
(二) 開始部署
# 創建 /mnt/docker/ 目錄
mkdir -p /mnt/docker/
cd /mnt/docker/
接下來:
① 編寫構建各個項目模組的Dockerfile
② 編寫docker-compose.yaml
③ mysql、redis、nginx的配置
④ 啟動dockerCompose編排
⑤ 導入數據[資料庫表數據、前端靜態web資源]
⑥ 測試訪問,並排除錯誤
一、blog_api 製作鏡像
1、上傳打包生成的jar包,上傳到/mnt/docker/ 目錄,並修改jar包的包名為 blog_api.jar
2、編寫鏡像文件 api_dockerfile:
FROM java:8
MAINTAINER shan <test@[email protected]>
ADD ./blog_api.jar /api.jar
CMD java -jar /api.jar --spring.profiles.active=prod
3、構建生成鏡像 api:
命令: docker build -f dockerfile路徑 -t 自定義鏡像名稱 .
# blog_api 生成鏡像
docker build -f ./api_dockerfile -t api .
二、dockerCompose編排
1、編寫 docker-compose.yaml
version: "3"
services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- /mnt/docker/mysql/conf:/etc/mysql/conf
- /mnt/docker/mysql/logs:/logs
- /mnt/docker/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: admin
redis:
image: redis
container_name: redis
volumes:
- /mnt/docker/redis/data:/data
api:
image: api
container_name: api
expose:
- "8888"
depends_on:
- mysql
- redis
nginx:
image: nginx
container_name: nginx
ports:
- 80:80
- 443:443
volumes:
- /mnt/docker/nginx/:/etc/nginx/
- /mnt/shan/blog:/shan/blog
links:
- api
depends_on:
- api
2、dockercompose 進行編排
★ 前提:mysql、redis、nginx的配置文件配置好後才可以進行編排
# 切換到docker-compose.yaml目錄下,啟動容器
cd /mnt/docker/
docker-compose up
docker-compose up -d #代表後台啟動
docker-compose down #停止並刪除容器
docker-compose start #啟動已有容器
docker-compose stop #停止運行的容器
三、mysql、redis、nginx的配置:
1、mysql的配置:
① mysql 服務在docker-compose.yaml 中的編寫內容為:
mysql:
volumes:
- /mnt/docker/mysql/conf:/etc/mysql/conf
② 掛載mysql的配置文件:
mkdir -p /mnt/docker/mysql/conf
cd /mnt/docker/mysql/conf
# 編寫my.cnf文件[vim my.cnf]
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2、redis的配置:
① redis 服務在docker-compose.yaml 中的編寫內容為:
redis:
volumes:
- /mnt/docker/redis/data:/data
-
由於沒有掛載配置文件,所有不用掛載redis的配置
3、nginx的配置:
① nginx 服務在docker-compose.yaml 中的編寫內容為:
nginx:
volumes:
- /mnt/docker/nginx/:/etc/nginx/ #配置文件
- /mnt/shan/blog:/shan/blog # web資源
② 掛載nginx的配置文件:
mkdir -p /mnt/docker/nginx/
cd /mnt/docker/nginx/
# 編寫nginx 配置文件
▪ nginx基本配置,編寫nginx.conf文件[vim nginx.conf]:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
▪ nginx基本配置文件nginx.conf中include了一個mime.types配置文件:
-
上傳mime.types配置文件:
- mime.types配置文件: 在nginx安裝包的conf目錄下,下載一個nginx獲取,然後進行上傳
- mime.types的上傳目錄:結合dockercompose中數據卷的掛載點,推斷出 /mnt/docker/nginx/
cd /mnt/docker/nginx/
# 使用xftp工具上傳mime.types配置文件
注意:沒有自己的伺服器,把下面 blog.conf配置 中的域名server_name 改為localhost,並且沒有ssl證書,記得把443(https 協議埠號) 的配置去掉,並把80(http協議埠號)rewrite 部分去掉。
▪ nginx配置文件blog.conf
- 記得將配置文件的中文注釋去除再複製粘貼。
mkdir -p /mnt/docker/nginx/conf.d
cd /mnt/docker/nginx/conf.d
# 編寫blog.conf文件[vim blog.conf]
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_vary off;
upstream apistream{
server api:8888;
}
server{
listen 80;
server_name blog.yilele.site;
rewrite ^(.*) //blog.yilele.site/$1 permanent;
}
server {
listen 443 ssl;
server_name blog.yilele.site;
index index.html;
ssl_certificate /etc/nginx/ssl/blog.yilele.site.pem;
ssl_certificate_key /etc/nginx/ssl/blog.yilele.site.key;
ssl_session_timeout 5m;
location /api {#請求//blog.yilele.site/api 會代理轉發到 api:8888
proxy_pass //apistream;
}
location / {
root /shan/blog/;
index index.html;
}
location ~* \.(jpg|jpeg|gif|png|swf|rar|zip|css|js|map|svg|woff|ttf|txt)$ {
root /shan/blog/;
index index.html;
add_header Access-Control-Allow-Origin *;
}
}
③ 配置nginx的ssl證書
申請、下載和上傳伺服器的ssl證書
下載ssl證書:要選擇nginx類型的下載
上傳nginx的ssl證書:要注意證書文件的名稱、證書格式和咱配置在nginx的配置文件保持一致
# nginx的配置文件:
server{
listen 80;
server_name blog.yilele.site; #域名
.....
}
# ssl的PEM 證書通常具有以下擴展: .pem、.crt、.cer 和.key
ssl_certificate /etc/nginx/ssl/blog.yilele.site.pem;#nginx的ssl公鑰,注意是pem後綴,可以根據阿里雲ssl下載的格式填寫
ssl_certificate_key /etc/nginx/ssl/blog.yilele.site.key;#nginx的ssl私鑰
# 再根據 docker-compose.yml 文件推出ssl證書上傳的目錄:
volumes:
- /mnt/docker/nginx/:/etc/nginx/
- 上傳ssl證書:
mkdir -p /mnt/docker/nginx/ssl
cd /mnt/docker/nginx/ssl
# 使用xftp工具上傳ssl證書(blog.yilele.site.pem、blog.yilele.site.key)
可以啟動dockercompose 進行編排啦~
四、導入數據[資料庫表的數據、前端靜態web資源]
1、導入資料庫表的數據
(1) 導入sql文件
① mysql的掛載資訊:
volumes:
.....
- /mnt/docker/mysql/data:/var/lib/mysql
② 資料庫視圖工具navicat 把表導出sql文件:
③ 上傳sql文件(文件名:blog.sql):
- 在資料庫中創建和 sql文件(blog.sql)對應的資料庫名blog
cd /mnt/docker/mysql/data
# 使用 xftp 將 blog.sql 進行傳輸
(2) 執行sql文件(創建blog 資料庫並導入數據)
# 進入mysql容器:
docker exec -it mysql bash
# 切換到掛載目錄(blog.sql 所在目錄):
cd /var/lib/mysql
# 查看該目錄下所有文件:
ls
# 可以看到blog.sql也在該目錄下
- 接下來在docker中執行該sql:
mysql -uroot -p
# 輸入密碼 admin ,進入docker中的資料庫
# 創建資料庫
create database blog;
# 退出回到容器
exit
# 在/var/lib/mysql目錄下,將文件blog.sql導入資料庫
mysql -u root -p blog < blog.sql;
# 輸入密碼 admin
# 重新進入資料庫,切換資料庫
mysql -uroot -p
# 輸入密碼 admin ,進入docker中的資料庫
use blog;
# 執行sql並保存資料庫
source blog.sql;
# 執行source命令可能會報錯,打不開blog.sql 文件,這個問題可以忽略。
將.sql文件導入資料庫命令:mysql -u 用戶名 -p 資料庫(blog) < 要導入的資料庫數據(blog.sql)
- 結果檢查
use blog;
show tables;
select * from ms_admin;
- 如果能查出來結果,那就說明我們的mysql導入sql文件成功了。
- 退出mysql資料庫:exit
- 退出mysql容器:exit
(3) 檢查mysql的配置
● 編排dockerCompose之後檢查docker中mysql的配置是否成功:
docker logs -f mysql
- 沒有看到報錯資訊即成功(警告資訊可以忽略)
2、導入前端靜態web資源
(1) nginx 前端web資源的配置:
volumes:
......
- /mnt/shan/blog:/shan/blog # web資源
# 在log目錄用於上傳前端的web資源(打包工具打包生成的html、css、js、圖片等)
cd /mnt/shan/blog
# 使用xftf 上傳web資源
(2) 手動壓縮前端dist包,上傳到 /mnt/shan/blog 目錄
- 手動壓縮:是為了提高傳輸速度
- 安裝解壓縮工具:
#獲取安裝列表 yum安裝列表中搜索zip/unzip是否存在
yum list|grep zip
yum list|grep unzip
#執行安裝支援zip命令
yum install -y zip
#執行安裝支援unzip命令
yum install -y unzip
- 上傳web資源(dist 壓縮包)
# 使用xftf 上傳web資源
# 解壓
unzip dist.zip
可以測試排錯啦~
五、測試並排除錯誤:
(1) 測試:
-
api 模組的測試:訪問 //blog.yilele.site/
● 當我們覺得部署完全搞定的時候,就可以docker-compose up -d 後台啟動,這樣的話關掉遠程連接也能運行了。
(2) 排查錯誤:
● docker 常用命令:
# 容器命令
● 查看運行的容器:docker ps
● 刪除容器:docker rm -f 容器id或容器名稱
● 刪除所有容器:docker rm -f $(docker ps -aq)
● 創建、啟動並進入容器: docker run -it 容器id或容器名稱 bash
● 進入啟動過的容器: docker exec -it 容器id或容器名稱 bash
● 退出容器:【停止容器】exit 【非停止容器】ctr+p+q
● 啟動容器:docker start 容器id
# 鏡像命令
● 查看所有鏡像: docker images
● 刪除鏡像: docker rmi -f 鏡像id
● 刪除所有鏡像: docker rmi -f $(docker images -aq)
● dockerCompose 常用命令:
# 切換到docker-compose.yaml目錄下,啟動容器
docker-compose up
docker-compose up -d #代表後台啟動
docker-compose down #停止並刪除容器
docker-compose start #啟動已有容器
docker-compose stop #停止運行的容器
● 查看日誌進行排查錯誤:
# 查看後端項目的錯誤-日誌(進入docker-compose的目錄下):
cd /mnt/docker/
docker-compose logs
# 查看服務端ngix-日誌:
docker logs nginx
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!