Docker前后端項目部署完整步驟記錄
前言
本文詳細講解了如何使用 Docker 構建鏡像并部署前后端項目,包括如何編寫 Dockerfile 和啟動容器的方式。在實踐過程中,作者發(fā)現(xiàn)了一些常見問題,并提供了解決方案,例如如何解決無法連接數(shù)據(jù)庫的問題、如何配置 nginx 代理等。本文將對想要深入了解 Docker 鏡像部署前后端項目的讀者提供幫助。
安裝docker
此時你有一臺服務器,首先安排上docker
# 檢查是否安裝
yum list installed | grep docker
# 在線安裝docker必備依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加阿里云有關 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默認配置文件中設置阿里云的鏡像地址,更多配置參考 https://www.cnblogs.com/yakniu/p/16329611.html
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://gg3gwnry.mirror.aliyuncs.com"]}
開始前
為本項目創(chuàng)建一個虛擬網(wǎng)絡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ù)據(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)先導入/etc/mysql/conf.d目錄下的所有擴展名為cnf的配置文件
- /var/lib/mysql/
mysql的日志、數(shù)據(jù)存放目錄,如導入一個數(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容器初始化
宿主機拷貝后端項目數(shù)據(jù)庫到mysql容器中
新增后端項目數(shù)據(jù)庫所需的用戶和密碼,并賦予該數(shù)據(jù)庫所有的權限
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) 可以開啟免密登錄,初始化完成再關閉免密登錄
因為mysql8更改了登錄方式使用密碼加密(明文和密文打八輩子也不等好吧)
如果容器內(nèi)可以正常進入mysql,其它容器或者我們的navicat遠程工具無法連上mysql,需要檢查登錄的用戶是否是允許的主機地址,select user,host from mysql.user;
如果host是%即允許任何主機地址,那么不可遠程連接很有可能是配置文件bind-address設置了localhost或者127.0.0.1(我遇到的問題),改為0.0.0.0即可
將主機目錄下的文件夾掛載到容器的文件夾后,進入到docker容器內(nèi)對應的掛載目錄中,運行命令ls后提示
ls: cannot open directory .: Permission denied原因是CentOS7中的安全模塊selinux把權限禁掉了,解決方法容器啟動時--privileged=true
部署后端項目
拷貝后端jar包到工作目錄 /mydata
構建鏡像
/mydata/surveyking-dockerfile文件如下
FROM openjdk:8 RUN mkdir -p /home/app # 設置工作目錄 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 # 設置容器啟動時運行的命令 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àn)異常
docker logs surveyking-server 檢查啟動日志
按網(wǎng)上的資料說同一個自定義network下的多個容器間可以 ping 容器名,但是一直測試報錯ping的容器名是未知的地址,原因未遂,最后還是決定使用固定ip即--ip的參數(shù)在容器run的時候指定
后端項目容器連接數(shù)據(jù)庫的容器的url:
jdbc:mysql://192.168.0.2:3306/surveyking?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&useUnicode=true
項目啟動沒有問題,但是一旦訪問到數(shù)據(jù)庫響應異常docker logs surveyking-server查看后端項目日志,訪問數(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包運行在主機電腦連接遠程服務器容器的數(shù)據(jù)庫,居然數(shù)據(jù)庫訪問就正常了。
解決嘗試:navicat試連,用戶要有權限,最重要url上的mysql地址在jar包運行的容器中能ping通 (使用自定義的network,能ping通后訪問就解決了)
??注意,mysql在初始化完后一定要關閉免密登錄,否則也會導致上面的問題
Nginx部署前端項目
創(chuàng)建掛載卷目錄(/mydata工作目錄)
1. mkdir nginx nginx/conf /nginx/html /nginx/logs
2. 拷貝前端打包項目到/nginx/html下
3. vi nginx/conf/nginx.conf
#定義Nginx運行的用戶和用戶組
#user nobody;
#開啟的線程數(shù)(默認為1),一般跟邏輯CPU核數(shù)一致
worker_processes 1;
#制定日志路徑,級別。這個設置可以放入全局塊,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進程運行文件存放地址
#pid logs/nginx.pid;
events {
accept_mutex on; #設置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認為on
multi_accept on; #設置一個進程是否同時接受多個網(wǎng)絡連接,默認為off
use epoll; #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
#單個進程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進程數(shù))
#根據(jù)硬件調(diào)整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進程允許的最多連接數(shù),理論上每臺nginx服務器的最大連接數(shù)為。
worker_connections 1024;
}
http {
#文件擴展名與文件類型映射表
include mime.types;
#默認文件類型
default_type application/octet-stream;
#access_log off; #取消服務日志
#引用日志main
#access_log logs/access.log main;
#下面代碼為日志格式的設定,main為日志格式的名稱,可自行設置,后面引用
#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ù)來輸出文件,對于普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網(wǎng)絡I/O處理速度,降低系統(tǒng)的負載。注意:如果圖片顯示不正常把這個改成off。
#sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來輸出文件,對于普通應用,必須設為on。如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網(wǎng)絡IO處理速度,降低系統(tǒng)uptime。
sendfile on;
# 當使用sendfile 函數(shù),tcp_nopush 才起作用,是tcp協(xié)議棧中的知識點
# 當tcp_nopush = on 時,會調(diào)用tcp_cork 方法,是默認的,就是收到的數(shù)據(jù)報不會立即發(fā)送出去,而是等到數(shù)據(jù)報最大時,一次性傳輸出去,有利于解決網(wǎng)絡堵塞。
#tcp_nopush on;
# 客戶端連接超時時間
# = 0 : 表示禁用長連接。
# = x :表示長連接timeout
#keepalive_timeout 0;
keepalive_timeout 65;
#HttpGZip模塊配置
#開啟gzip壓縮
#gzip on;
#設置允許壓縮的頁面最小字節(jié)數(shù)
#gzip_min_length 1k;
#申請4個單位為16K的內(nèi)存作為壓縮結果流緩存
#gzip_buffers 4 16k;
#設置識別http協(xié)議的版本,默認為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;
#讓前端的緩存服務器進過gzip壓縮的頁面
#gzip_vary on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 設置虛擬主機的網(wǎng)站根目錄
root html/website-surveyking;
# history 模式下需要加上這一行,防止刷新頁面時404
try_files $uri $uri/ /index.html;
#設置虛擬主機默認訪問的網(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服務器可以通過X-Forwarded-For獲取用戶真實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跟后端服務器連接超時時間(代理連接超時)
#proxy_send_timeout 300; #后端服務器數(shù)據(jù)回傳時間(代理發(fā)送超時)
#proxy_read_timeout 300; #連接成功后,后端服務器響應時間(代理接收超時)
#proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩沖區(qū)大小
#proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話,這樣設置
#proxy_busy_buffers_size 64k; #高負荷下緩沖大?。╬roxy_buffers*2)
#proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大于這個值,將從upstream服務器傳
#}
#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;
# }
#}
}
構建nginx鏡像
/mydata/nginx-dockerfile文件如下
FROM centos:7 #給基礎鏡像centos安裝必備的環(huán)境 # 加上“rpm --rebuilddb &&”是為了防止數(shù)據(jù)庫損壞而影響yum安裝。 # 注意,比較保險的做法是有多少個yum命令,就加多少個“rpm --rebuilddb &&”在yum前面。 # 另外yum install一定要安裝的是pcre,zlib,net-tools,make,gcc,wget,tar及其相關內(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命令將包加入到基礎鏡像/usr/src目錄中) RUN wget http://nginx.org/download/nginx-1.17.1.tar.gz # 解壓到當前目錄 RUN tar -zxvf nginx-1.17.1.tar.gz # 設置環(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 .
啟動容器
因為上面鏡像的dockerfile文件中指定了編譯安裝nginx的路徑為/usr/local/nginx
掛載的卷
- /usr/local/nginx/conf/nginx.conf:掛載nginx配置文件到宿主機中
- /usr/local/nginx/html:nginx的網(wǎng)站根目錄
- /usr/local/nginx/logs:nginx的運行、錯誤等日志
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
到此項目部署完畢
部署多個網(wǎng)站(擴展)
nginx的配置基礎
root和alias都是用于指定請求的靜態(tài)文件的根目錄
root:當Nginx接收到請求時,會將location后面的路徑與root拼接起來作為文件的實際路徑。這意味著,實際文件路徑為root路徑/location后面的路徑。
例如 location /surveyking { root: html/p1; }
請求: /surveyking/index.html 實際:/surveyking/p1/surveyking/index.html
alias:alias在構建文件路徑時會直接使用location后面的路徑匹配請求之后請求的剩余路徑。這意味著,實際文件路徑為alias路徑/請求路徑 - location后面的路徑。
例如 location /surveyking { alias: html/p1; }
請求: /surveyking/project/index.html 實際:/surveyking/p1/project/index.html
反向代理
nginx反向代理可以實現(xiàn)每個api前綴的代理映射到不同的服務器端口進行處理
反向代理主要是解決后端服務器負載均衡和保證安全性,而請求轉發(fā)則是實現(xiàn)服務器請求處理的調(diào)度和功能靈活性
location /sk-api { proxy_pass http://192.168.0.3:8080; }
需求:比如我想一個nginx部署多個網(wǎng)站項目,而不是根路徑/直接映射到root指向的項目路徑,而導致其它網(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”的模塊加載失敗。
因為vue工程打包后目錄結構為
- assets
-xxx.js
- index.html
index.html對所有資源assets內(nèi)的訪問路徑為http://xxx.xxx.xx.x/assets/xxx.js
需要給所有資源的訪問路徑拼接surveyking前綴,讓nginx能夠匹配location
vue項目中使用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..}
}
}到這問題還沒結束,index.html頁面可以正常加載css、js等靜態(tài)資源渲染顯示了
但是如果vue中點擊就了路由跳轉,使用了history的地址欄是不是surveyking前綴又沒了,如果此時刷新,nginx將該刷新請求解析為/路由地址而不是使try_files $uri $uri/ /surveyking/index.html生效的/surveyking/路由地址
最后,將路由前綴也添加上即可解決,vue3 + vue-router解決方案
const router = createRouter({
history: createWebHistory("/surveyking"),
routes: constantRoutes
});善后工作
如果是1核1G三個容器跑起來,慢慢地越來越卡,一直到程序崩潰,查看服務器的儀表盤,發(fā)現(xiàn)磁盤讀流量異常的高,總是突然飆升,而cpu使用率則并沒有太大的動靜。
這里應該考慮服務器為容器調(diào)整合適的配置參數(shù),如mysql中的InnoDB緩沖池大小、InnoDB日志文件大小、查詢緩存大小等參,后端項目運行日志存儲策略等
通過不斷的摸索改造,可算得出以下的較為合適的配置??
mysql自定義配置中
vi /mydata/mysql/conf/cus-docker.cnf,新增
# mysql8 換了密碼加密方式,要讓數(shù)據(jù)庫使用舊的密碼加密方式 authentication_policy = mysql_native_password #密碼失效時間-永不過期 default_password_lifetime=0 # 設置數(shù)據(jù)庫時區(qū)為正8區(qū) default-time_zone = '+8:00' # 設置MySQL使用的字符集 character-set-server = utf8mb4 # 設置MySQL使用的存儲引擎 default-storage-engine = InnoDB # 設置InnoDB的緩沖池大小,總內(nèi)存的一半或更小的值 innodb_buffer_pool_size = 256M # 設置InnoDB的日志文件大小(根據(jù)服務器性能和數(shù)據(jù)量進行調(diào)整),控制InnoDB事務日志的容量。將其設置為128M可能過高,尤其是在1核1G的服務器上??梢钥紤]將其降低一些,例如設置為64M或者更低,以減少磁盤I/O負載 innodb_redo_log_capacity = 32M # 性能要求不高的環(huán)境,可以將其設置為0或2,以減少寫入日志的頻率,會增加數(shù)據(jù)丟失風險 innodb_flush_log_at_trx_commit = 0 # 限制磁盤I/O的資源使用 innodb_io_capacity = 150 innodb_io_capacity_max = 300 # 寫入和讀取I/O線程的數(shù)量,降低能減少I/O線程對服務器資源的競爭 innodb_write_io_threads = 8 innodb_read_io_threads = 4 # 讓InnoDB自動調(diào)整并發(fā)線程的數(shù)量。這樣可以充分利用服務器的CPU和I/O資源 innodb_thread_concurrency = 0 # 由于資源受限(1G),限制連接數(shù) max_connections = 50 # 設置查詢緩存大?。ㄈ绻鸐ySQL版本>=8.0,請注釋或刪除此行) # query_cache_size = 0 # 設置臨時表的最大數(shù)量(根據(jù)服務器性能和應用程序需求進行調(diào)整) tmp_table_size = 64M # 設置排序緩存大?。ǜ鶕?jù)服務器性能和應用程序需求進行調(diào)整) sort_buffer_size = 2M # 設置線程棧大?。ǜ鶕?jù)應用程序需求進行調(diào)整) thread_stack = 256K # 禁用DNS反向解析(根據(jù)服務器網(wǎng)絡環(huán)境進行調(diào)整) skip-name-resolve innodb_log_buffer_size = 8M # 此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會丟失數(shù)據(jù)。MySQL開發(fā)人員建議設置為1-8M之間 # 以下兩個參數(shù)控制InnoDB事務日志文件的大小和緩沖區(qū)大小。在1核1G的服務器上,可以嘗試將它們降低一些, # 例如分別設置為256M和8M,以減少日志文件對磁盤空間的使用。(mysql>8,刪除或注釋,使用innodb_redo_log_capacity替換) #innodb_log_file_size = 128M # 此參數(shù)確定數(shù)據(jù)日志文件的大小,更大的設置可以提高性能,但也會增加恢復故障數(shù)據(jù)庫所需的時間, #innodb_log_files_in_group = 3 # 為提高性能,MySQL可以以循環(huán)方式將日志文件寫到多個文件。推薦設置為3
jar容器啟動時 ,指定日志配置
--log-driver k8s-file --log-opt max-size=10m --log-opt max-file=3
這里列舉一些分析和清理的一些命令
#運行容器CPU、內(nèi)存、網(wǎng)絡等系統(tǒng)資源指標 docker stats #運行的容器的總大小 docker ps -s #分析磁盤空間占用 docker system df ## 以下注意備份 #清理無用的容器、鏡像和資源 docker system prune #清理所有未被使用的鏡像 docker image prune -a #清理所有停止的容器 docker container prune #清理懸掛的匿名卷 docker volume prune #清理未使用的網(wǎng)絡 docker network prune
Docker-Compose實現(xiàn)
上面的多個步驟,使用單體服務容器編排Docker-Compose技術通過一個docker-compose.yaml腳本實現(xiàn),大致如下
工作目錄 /mydata (在前面的基礎上)
- 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容器運行后,默認執(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
總結
到此這篇關于Docker前后端項目部署的文章就介紹到這了,更多相關Docker前后端項目部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
docker自建rustdesk-server遠程桌面的解決方案
RustDesk 是一款可以平替 TeamViewer 的開源軟件,旨在提供安全便捷的自建方案,這篇文章主要介紹了docker自建rustdesk-server遠程桌面的解決方案,需要的朋友可以參考下2024-07-07
docker remote api一鍵TLS加密的實現(xiàn)
本文主要介紹了docker remote api一鍵TLS加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
docker部署Macvlan實現(xiàn)跨主機網(wǎng)絡通信的實現(xiàn)
這篇文章主要介紹了docker部署Macvlan實現(xiàn)跨主機網(wǎng)絡通信的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10

