Docker前后端項(xiàng)目部署完整步驟記錄
前言
本文詳細(xì)講解了如何使用 Docker 構(gòu)建鏡像并部署前后端項(xiàng)目,包括如何編寫 Dockerfile 和啟動容器的方式。在實(shí)踐過程中,作者發(fā)現(xiàn)了一些常見問題,并提供了解決方案,例如如何解決無法連接數(shù)據(jù)庫的問題、如何配置 nginx 代理等。本文將對想要深入了解 Docker 鏡像部署前后端項(xiàng)目的讀者提供幫助。
安裝docker
此時你有一臺服務(wù)器,首先安排上docker
# 檢查是否安裝 yum list installed | grep docker # 在線安裝docker必備依賴包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云有關(guān) Docker 的軟件源(即Docker的存儲庫) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安裝docker yum install -y docker-ce docker-ce-cli containerd.io # docker默認(rèn)配置文件中設(shè)置阿里云的鏡像地址,更多配置參考 https://www.cnblogs.com/yakniu/p/16329611.html vi /etc/docker/daemon.json {"registry-mirrors": ["https://gg3gwnry.mirror.aliyuncs.com"]}
開始前
為本項(xiàng)目創(chuàng)建一個虛擬網(wǎng)絡(luò)network,用于多個容器間通信如連接數(shù)據(jù)庫等
docker network create --driver=bridge --gateway=192.168.0.0 --subnet=192.168.0.0/16 mynet-1
創(chuàng)建工作目錄
mkdir /mydata
cd /mydata
部署mysql8
生成掛載目錄和配置
mkdir mysql mysql/conf mysql/data mysql/mysql-files
vi mysql/conf/cus-docker.cnf
[mysqld] wait_timeout=31536000 interactive_timeout=31536000 # 數(shù)據(jù)庫忽略大小寫 lower_case_table_names = 1 #免密登錄,如果忘記密碼啟用這個配置 #skip-grant-tables # mysql8 換了密碼加密方式,要讓數(shù)據(jù)庫使用舊的密碼加密方式 , 身份插件mysql_native_password 本地密碼 authentication_policy=mysql_native_password #密碼失效時間-永不過期 default_password_lifetime=0 # 127.0.0.1只能本地訪問,0.0.0.0接收任何來源ip的連接訪問 bind-address = 0.0.0.0 # 最大連接數(shù) max_connections = 2000 # 設(shè)置數(shù)據(jù)庫時區(qū)為正8區(qū) default-time_zone = '+8:00'
啟動容器
docker pull mysql:8.0.31
掛載的卷
- /etc/mysql/conf.d
mysql的配置文件my.cnf位于/etc/my.cnf,my.cnf會優(yōu)先導(dǎo)入/etc/mysql/conf.d目錄下的所有擴(kuò)展名為cnf的配置文件
- /var/lib/mysql/
mysql的日志、數(shù)據(jù)存放目錄,如導(dǎo)入一個數(shù)據(jù)庫surveyking.sql就會增加一個surveyking的目錄
docker run --name cus-mysql --network mynet-1 --ip 192.168.0.2 --restart=always --privileged=true -v /mydata/mysql/conf:/etc/mysql/conf.d -v /mydata/mysql/data:/var/lib/mysql/ -v /mydata/mysql/mysql-files:/var/lib/mysql-files/ -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e LANG=zh_CN.utf8 -e LANGUAGE=zh_CN.utf8 -d mysql:8.0.31
mysql容器初始化
宿主機(jī)拷貝后端項(xiàng)目數(shù)據(jù)庫到mysql容器中
新增后端項(xiàng)目數(shù)據(jù)庫所需的用戶和密碼,并賦予該數(shù)據(jù)庫所有的權(quán)限
docker cp /mydata/db/surveyking.sql cus-mysql:/tmp; docker exec -it cus-mysql mysql -u root -p create database surveyking; use surveyking; source /tmp/surveyking.sql; flush privileges; alter user 'hao'@'%' identified by 'lihao@123456' password expire never; alter user'hao'@'%' identified with mysql_native_password by 'lihao@123456'; grant all privileges on surveyking.* to 'hao'@'%'; flush privileges;
一些問題
mysql8容器啟動后如果一直登錄不上(密碼錯誤),Access denied for user 'root'@'localhost' (use Password Yes) 可以開啟免密登錄,初始化完成再關(guān)閉免密登錄
因?yàn)閙ysql8更改了登錄方式使用密碼加密(明文和密文打八輩子也不等好吧)
如果容器內(nèi)可以正常進(jìn)入mysql,其它容器或者我們的navicat遠(yuǎn)程工具無法連上mysql,需要檢查登錄的用戶是否是允許的主機(jī)地址,select user,host from mysql.user;
如果host是%即允許任何主機(jī)地址,那么不可遠(yuǎn)程連接很有可能是配置文件bind-address設(shè)置了localhost或者127.0.0.1(我遇到的問題),改為0.0.0.0即可
將主機(jī)目錄下的文件夾掛載到容器的文件夾后,進(jìn)入到docker容器內(nèi)對應(yīng)的掛載目錄中,運(yùn)行命令ls后提示
ls: cannot open directory .: Permission denied原因是CentOS7中的安全模塊selinux把權(quán)限禁掉了,解決方法容器啟動時--privileged=true
部署后端項(xiàng)目
拷貝后端jar包到工作目錄 /mydata
構(gòu)建鏡像
/mydata/surveyking-dockerfile文件如下
FROM openjdk:8 RUN mkdir -p /home/app # 設(shè)置工作目錄 WORKDIR /mydata # apt-get update && apt-get install -y iputils-ping; COPY surveyking-v1.5.1.jar /home/app/surveyking-v1.5.1.jar EXPOSE 8080 # 設(shè)置容器啟動時運(yùn)行的命令 CMD ["java", "-jar","/home/app/surveyking-v1.5.1.jar"]
docker build -f surveyking-dockerfile -t surveyking-image:1.5.1 .
啟動容器
docker run -p 8080:8080 --name surveyking-server --network mynet-1 --ip 192.168.0.3 -d surveyking-image:1.5.1
一些問題
docker ps -a 發(fā)現(xiàn)如果啟動容器后自動退出,即項(xiàng)目運(yùn)行出現(xiàn)異常
docker logs surveyking-server 檢查啟動日志
按網(wǎng)上的資料說同一個自定義network下的多個容器間可以 ping 容器名,但是一直測試報錯ping的容器名是未知的地址,原因未遂,最后還是決定使用固定ip即--ip的參數(shù)在容器run的時候指定
后端項(xiàng)目容器連接數(shù)據(jù)庫的容器的url:
jdbc:mysql://192.168.0.2:3306/surveyking?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&useUnicode=true
項(xiàng)目啟動沒有問題,但是一旦訪問到數(shù)據(jù)庫響應(yīng)異常docker logs surveyking-server查看后端項(xiàng)目日志,訪問數(shù)據(jù)庫報錯如下
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
網(wǎng)上各種答案都說是url沒有useSSL=false,各種答案都試過都沒得,困擾我灰常的久。嘗試將這個jar包運(yùn)行在主機(jī)電腦連接遠(yuǎn)程服務(wù)器容器的數(shù)據(jù)庫,居然數(shù)據(jù)庫訪問就正常了。
解決嘗試:navicat試連,用戶要有權(quán)限,最重要url上的mysql地址在jar包運(yùn)行的容器中能ping通 (使用自定義的network,能ping通后訪問就解決了)
??注意,mysql在初始化完后一定要關(guān)閉免密登錄,否則也會導(dǎo)致上面的問題
Nginx部署前端項(xiàng)目
創(chuàng)建掛載卷目錄(/mydata工作目錄)
1. mkdir nginx nginx/conf /nginx/html /nginx/logs
2. 拷貝前端打包項(xiàng)目到/nginx/html下
3. vi nginx/conf/nginx.conf
#定義Nginx運(yùn)行的用戶和用戶組 #user nobody; #開啟的線程數(shù)(默認(rèn)為1),一般跟邏輯CPU核數(shù)一致 worker_processes 1; #制定日志路徑,級別。這個設(shè)置可以放入全局塊,http塊,server塊,級別以此為:debug | info | notice | warn | error | crit | alert | emerg #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #指定nginx進(jìn)程運(yùn)行文件存放地址 #pid logs/nginx.pid; events { accept_mutex on; #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on multi_accept on; #設(shè)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off use epoll; #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport #單個進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù)) #根據(jù)硬件調(diào)整,和前面工作進(jìn)程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進(jìn)程允許的最多連接數(shù),理論上每臺nginx服務(wù)器的最大連接數(shù)為。 worker_connections 1024; } http { #文件擴(kuò)展名與文件類型映射表 include mime.types; #默認(rèn)文件類型 default_type application/octet-stream; #access_log off; #取消服務(wù)日志 #引用日志main #access_log logs/access.log main; #下面代碼為日志格式的設(shè)定,main為日志格式的名稱,可自行設(shè)置,后面引用 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對于普通應(yīng)用設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載。注意:如果圖片顯示不正常把這個改成off。 #sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來輸出文件,對于普通應(yīng)用,必須設(shè)為on。如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime。 sendfile on; # 當(dāng)使用sendfile 函數(shù),tcp_nopush 才起作用,是tcp協(xié)議棧中的知識點(diǎn) # 當(dāng)tcp_nopush = on 時,會調(diào)用tcp_cork 方法,是默認(rèn)的,就是收到的數(shù)據(jù)報不會立即發(fā)送出去,而是等到數(shù)據(jù)報最大時,一次性傳輸出去,有利于解決網(wǎng)絡(luò)堵塞。 #tcp_nopush on; # 客戶端連接超時時間 # = 0 : 表示禁用長連接。 # = x :表示長連接timeout #keepalive_timeout 0; keepalive_timeout 65; #HttpGZip模塊配置 #開啟gzip壓縮 #gzip on; #設(shè)置允許壓縮的頁面最小字節(jié)數(shù) #gzip_min_length 1k; #申請4個單位為16K的內(nèi)存作為壓縮結(jié)果流緩存 #gzip_buffers 4 16k; #設(shè)置識別http協(xié)議的版本,默認(rèn)為1.1 #gzip_http_version 1.1; #指定gzip壓縮比,1-9數(shù)字越小,壓縮比越小,速度越快 #gzip_comp_level 2; #指定壓縮的類型 #gzip_types text/plain application/x-javascript text/css application/xml; #讓前端的緩存服務(wù)器進(jìn)過gzip壓縮的頁面 #gzip_vary on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { # 設(shè)置虛擬主機(jī)的網(wǎng)站根目錄 root html/website-surveyking; # history 模式下需要加上這一行,防止刷新頁面時404 try_files $uri $uri/ /index.html; #設(shè)置虛擬主機(jī)默認(rèn)訪問的網(wǎng)頁 index index.html index.htm; } #對 / 啟用反向代理 #location /sk-api { #proxy_pass http://127.0.0.1:8080; #以下是一些反向代理的配置可刪除 #proxy_redirect off; #rewrite "^/sk-api/(.*)$" /$1 break ; # 最終url中去掉/api前綴 #后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #client_max_body_size 10m; #允許客戶端請求的最大單文件字節(jié)數(shù) #client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù) #proxy_connect_timeout 300; #nginx跟后端服務(wù)器連接超時時間(代理連接超時) #proxy_send_timeout 300; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時) #proxy_read_timeout 300; #連接成功后,后端服務(wù)器響應(yīng)時間(代理接收超時) #proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小 #proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話,這樣設(shè)置 #proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大?。╬roxy_buffers*2) #proxy_temp_file_write_size 64k; #設(shè)定緩存文件夾大小,大于這個值,將從upstream服務(wù)器傳 #} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
構(gòu)建nginx鏡像
/mydata/nginx-dockerfile文件如下
FROM centos:7 #給基礎(chǔ)鏡像centos安裝必備的環(huán)境 # 加上“rpm --rebuilddb &&”是為了防止數(shù)據(jù)庫損壞而影響yum安裝。 # 注意,比較保險的做法是有多少個yum命令,就加多少個“rpm --rebuilddb &&”在yum前面。 # 另外yum install一定要安裝的是pcre,zlib,net-tools,make,gcc,wget,tar及其相關(guān)內(nèi)容 RUN rpm --rebuilddb && yum install -y autoconf automake make wget proc-devel net-tools zlib zlib-devel make gcc g++ openssl-devel pcre pcre-devel tar # 在線獲取nginx壓縮包(也可以在本地系統(tǒng)(centos)里先下載壓縮包,再ADD命令將包加入到基礎(chǔ)鏡像/usr/src目錄中) RUN wget http://nginx.org/download/nginx-1.17.1.tar.gz # 解壓到當(dāng)前目錄 RUN tar -zxvf nginx-1.17.1.tar.gz # 設(shè)置環(huán)境 WORKDIR nginx-1.17.1 # 配置nginx RUN ./configure --prefix=/usr/local/nginx && make && make install # RUN rm -rf /usr/src/nginx ENV TimeZone=Asia/Shanghai # 拷貝前端打包資源到nginx容器中 # COPY /mydata/website-surveyking /usr/local/nginx/html #開啟 80 和 443 端口 EXPOSE 80 #https EXPOSE 443 #不能直接nginx,可能環(huán)境變量沒有配置 CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -f nginx-dockerfile -t cus-nginx-image:1.7 .
啟動容器
因?yàn)樯厦骁R像的dockerfile文件中指定了編譯安裝nginx的路徑為/usr/local/nginx
掛載的卷
- /usr/local/nginx/conf/nginx.conf:掛載nginx配置文件到宿主機(jī)中
- /usr/local/nginx/html:nginx的網(wǎng)站根目錄
- /usr/local/nginx/logs:nginx的運(yùn)行、錯誤等日志
docker run -p 81:80 --name cus-nginx --network mynet-1 --ip 192.168.0.4 --restart=always --privileged=true -v /mydata/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v /mydata/nginx/logs:/usr/local/nginx/logs -v /mydata/nginx/html:/usr/local/nginx/html -d cus-nginx-image:1.7
到此項(xiàng)目部署完畢
部署多個網(wǎng)站(擴(kuò)展)
nginx的配置基礎(chǔ)
root和alias都是用于指定請求的靜態(tài)文件的根目錄
root:當(dāng)Nginx接收到請求時,會將location后面的路徑與root拼接起來作為文件的實(shí)際路徑。這意味著,實(shí)際文件路徑為root路徑/location后面的路徑。
例如 location /surveyking { root: html/p1; }
請求: /surveyking/index.html 實(shí)際:/surveyking/p1/surveyking/index.html
alias:alias在構(gòu)建文件路徑時會直接使用location后面的路徑匹配請求之后請求的剩余路徑。這意味著,實(shí)際文件路徑為alias路徑/請求路徑 - location后面的路徑。
例如 location /surveyking { alias: html/p1; }
請求: /surveyking/project/index.html 實(shí)際:/surveyking/p1/project/index.html
反向代理
nginx反向代理可以實(shí)現(xiàn)每個api前綴的代理映射到不同的服務(wù)器端口進(jìn)行處理
反向代理主要是解決后端服務(wù)器負(fù)載均衡和保證安全性,而請求轉(zhuǎn)發(fā)則是實(shí)現(xiàn)服務(wù)器請求處理的調(diào)度和功能靈活性
location /sk-api { proxy_pass http://192.168.0.3:8080; }
需求:比如我想一個nginx部署多個網(wǎng)站項(xiàng)目,而不是根路徑/直接映射到root指向的項(xiàng)目路徑,而導(dǎo)致其它網(wǎng)站的location地址沒有意義了
首先nginx.conf需要修改
location /surveyking { root html/website-surveyking; try_files $uri $uri/ /surveyking/index.html; index index.html index.htm; }
修改后就可以了嗎,會報錯
已攔截加載自“http://xx.xx.xx.x:81/assets/index.6e0363b3.js”的模塊,它使用了不允許的 MIME 類型(“text/html”)。
來源為“http://xx.xx.xx.x:81/assets/index.6e0363b3.js”的模塊加載失敗。
因?yàn)関ue工程打包后目錄結(jié)構(gòu)為
- assets
-xxx.js
- index.html
index.html對所有資源assets內(nèi)的訪問路徑為http://xxx.xxx.xx.x/assets/xxx.js
需要給所有資源的訪問路徑拼接surveyking前綴,讓nginx能夠匹配location
vue項(xiàng)目中使用vite打包的話,增加配置即可
vite.conf.js
export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') let base; if (command.indexOf('build')!==1) { base = '/surveyking' } else { base = '/' } return{ base, {option..} } }
到這問題還沒結(jié)束,index.html頁面可以正常加載css、js等靜態(tài)資源渲染顯示了
但是如果vue中點(diǎn)擊就了路由跳轉(zhuǎn),使用了history的地址欄是不是surveyking前綴又沒了,如果此時刷新,nginx將該刷新請求解析為/路由地址而不是使try_files $uri $uri/ /surveyking/index.html生效的/surveyking/路由地址
最后,將路由前綴也添加上即可解決,vue3 + vue-router解決方案
const router = createRouter({ history: createWebHistory("/surveyking"), routes: constantRoutes });
善后工作
如果是1核1G三個容器跑起來,慢慢地越來越卡,一直到程序崩潰,查看服務(wù)器的儀表盤,發(fā)現(xiàn)磁盤讀流量異常的高,總是突然飆升,而cpu使用率則并沒有太大的動靜。
這里應(yīng)該考慮服務(wù)器為容器調(diào)整合適的配置參數(shù),如mysql中的InnoDB緩沖池大小、InnoDB日志文件大小、查詢緩存大小等參,后端項(xiàng)目運(yùn)行日志存儲策略等
通過不斷的摸索改造,可算得出以下的較為合適的配置??
mysql自定義配置中
vi /mydata/mysql/conf/cus-docker.cnf,新增
# mysql8 換了密碼加密方式,要讓數(shù)據(jù)庫使用舊的密碼加密方式 authentication_policy = mysql_native_password #密碼失效時間-永不過期 default_password_lifetime=0 # 設(shè)置數(shù)據(jù)庫時區(qū)為正8區(qū) default-time_zone = '+8:00' # 設(shè)置MySQL使用的字符集 character-set-server = utf8mb4 # 設(shè)置MySQL使用的存儲引擎 default-storage-engine = InnoDB # 設(shè)置InnoDB的緩沖池大小,總內(nèi)存的一半或更小的值 innodb_buffer_pool_size = 256M # 設(shè)置InnoDB的日志文件大?。ǜ鶕?jù)服務(wù)器性能和數(shù)據(jù)量進(jìn)行調(diào)整),控制InnoDB事務(wù)日志的容量。將其設(shè)置為128M可能過高,尤其是在1核1G的服務(wù)器上??梢钥紤]將其降低一些,例如設(shè)置為64M或者更低,以減少磁盤I/O負(fù)載 innodb_redo_log_capacity = 32M # 性能要求不高的環(huán)境,可以將其設(shè)置為0或2,以減少寫入日志的頻率,會增加數(shù)據(jù)丟失風(fēng)險 innodb_flush_log_at_trx_commit = 0 # 限制磁盤I/O的資源使用 innodb_io_capacity = 150 innodb_io_capacity_max = 300 # 寫入和讀取I/O線程的數(shù)量,降低能減少I/O線程對服務(wù)器資源的競爭 innodb_write_io_threads = 8 innodb_read_io_threads = 4 # 讓InnoDB自動調(diào)整并發(fā)線程的數(shù)量。這樣可以充分利用服務(wù)器的CPU和I/O資源 innodb_thread_concurrency = 0 # 由于資源受限(1G),限制連接數(shù) max_connections = 50 # 設(shè)置查詢緩存大?。ㄈ绻鸐ySQL版本>=8.0,請注釋或刪除此行) # query_cache_size = 0 # 設(shè)置臨時表的最大數(shù)量(根據(jù)服務(wù)器性能和應(yīng)用程序需求進(jìn)行調(diào)整) tmp_table_size = 64M # 設(shè)置排序緩存大?。ǜ鶕?jù)服務(wù)器性能和應(yīng)用程序需求進(jìn)行調(diào)整) sort_buffer_size = 2M # 設(shè)置線程棧大?。ǜ鶕?jù)應(yīng)用程序需求進(jìn)行調(diào)整) thread_stack = 256K # 禁用DNS反向解析(根據(jù)服務(wù)器網(wǎng)絡(luò)環(huán)境進(jìn)行調(diào)整) skip-name-resolve innodb_log_buffer_size = 8M # 此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會丟失數(shù)據(jù)。MySQL開發(fā)人員建議設(shè)置為1-8M之間 # 以下兩個參數(shù)控制InnoDB事務(wù)日志文件的大小和緩沖區(qū)大小。在1核1G的服務(wù)器上,可以嘗試將它們降低一些, # 例如分別設(shè)置為256M和8M,以減少日志文件對磁盤空間的使用。(mysql>8,刪除或注釋,使用innodb_redo_log_capacity替換) #innodb_log_file_size = 128M # 此參數(shù)確定數(shù)據(jù)日志文件的大小,更大的設(shè)置可以提高性能,但也會增加恢復(fù)故障數(shù)據(jù)庫所需的時間, #innodb_log_files_in_group = 3 # 為提高性能,MySQL可以以循環(huán)方式將日志文件寫到多個文件。推薦設(shè)置為3
jar容器啟動時 ,指定日志配置
--log-driver k8s-file --log-opt max-size=10m --log-opt max-file=3
這里列舉一些分析和清理的一些命令
#運(yùn)行容器CPU、內(nèi)存、網(wǎng)絡(luò)等系統(tǒng)資源指標(biāo) docker stats #運(yùn)行的容器的總大小 docker ps -s #分析磁盤空間占用 docker system df ## 以下注意備份 #清理無用的容器、鏡像和資源 docker system prune #清理所有未被使用的鏡像 docker image prune -a #清理所有停止的容器 docker container prune #清理懸掛的匿名卷 docker volume prune #清理未使用的網(wǎng)絡(luò) docker network prune
Docker-Compose實(shí)現(xiàn)
上面的多個步驟,使用單體服務(wù)容器編排Docker-Compose技術(shù)通過一個docker-compose.yaml腳本實(shí)現(xiàn),大致如下
工作目錄 /mydata (在前面的基礎(chǔ)上)
- mkdir /mysql/initdb
- 將數(shù)據(jù)庫文件移動到initdb中
- vi mysql/initdb/surveyking-extend.sql
flush privileges; alter user 'hao'@'%' identified by 'lihao@123456' password expire never; alter user'hao'@'%' identified with mysql_native_password by 'lihao@123456'; grant all privileges on surveyking.* to 'hao'@'%'; flush privileges;
mysql容器運(yùn)行后,默認(rèn)執(zhí)行docker.entrypoint.sh,該腳本會去/docker-entrypoint-initdb.d下尋找所有sh、sql等腳本執(zhí)行
docker-compose.yaml
version: '3' services: nginx: container_name: cus-nginx image: surveyking build: context: /mydata dockerfile: nginx-dockerfile environment: - TZ=Asia/Shanghai ports: - "80:80" volumes: - /mydata/nginx/html:/usr/local/nginx/html - /mydata/nginx/conf/usr/lcoal/nginx/conf/nginx.conf - /mydata/nginx/logs:/usr/local/nginx/logs networks: - mynet-1 mysql: image: mysql:8,0.31 container_name: cus-mysql environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=surveyking - MYSQL_USER=hao - MYSQL_PASSWORD=lihao@123456 ports: - "3306:3306" volumes: - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql/conf.d/ - /mydata/mysql/initdb:/docker-entrypoint-initdb.d networks: - mynet-1 restart: always surveyking: container_name: surveyking image: surveyking build: context: /mydata dockerfile: surveyking-dockerfile ports: - "8080:8080" depends_on: - cus-mysql networks: - mynet-1 restart: always networks: my-network: driver: bridge ipam: config: - subnet: "192.168.0.101/16" gateway: 192.168.0.100
容器編排啟動
docker-compose -f docker-compose.yml up -d
總結(jié)
到此這篇關(guān)于Docker前后端項(xiàng)目部署的文章就介紹到這了,更多相關(guān)Docker前后端項(xiàng)目部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將Docker容器打包并在其他服務(wù)器上運(yùn)行的全過程
Docker容器使得應(yīng)用程序的部署和管理變得更加簡單和高效,有時,我們可能需要將一個運(yùn)行中的Docker容器打包,并在其他服務(wù)器上運(yùn)行,本文將詳細(xì)介紹如何實(shí)現(xiàn)這一過程,需要的朋友可以參考下2024-05-05使用Docker部署Tomcat的實(shí)現(xiàn)示例
在本地編寫好了Spring項(xiàng)目,為了實(shí)現(xiàn)能夠隨時地訪問,所以需要將項(xiàng)目部署到服務(wù)器,本文主要介紹了使用Docker部署Tomcat的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-11-11docker自建rustdesk-server遠(yuǎn)程桌面的解決方案
RustDesk 是一款可以平替 TeamViewer 的開源軟件,旨在提供安全便捷的自建方案,這篇文章主要介紹了docker自建rustdesk-server遠(yuǎn)程桌面的解決方案,需要的朋友可以參考下2024-07-07docker remote api一鍵TLS加密的實(shí)現(xiàn)
本文主要介紹了docker remote api一鍵TLS加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11docker部署Macvlan實(shí)現(xiàn)跨主機(jī)網(wǎng)絡(luò)通信的實(shí)現(xiàn)
這篇文章主要介紹了docker部署Macvlan實(shí)現(xiàn)跨主機(jī)網(wǎng)絡(luò)通信的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10