一、前言
我們常常見(jiàn)到很多比較棒的開(kāi)源項(xiàng)目,但在本地安裝運(yùn)行的話就會(huì)很復(fù)雜,要配置不同的環(huán)境,安裝不同的依賴(lài),好一點(diǎn)的會(huì)用docker直接拉取,或者打包好。
這些無(wú)疑都會(huì)增加初學(xué)者上手的成本,所以這篇文章總結(jié)了下目前比較常用的解決方法之一:
使用docker-compose同時(shí)管理多個(gè)服務(wù),只需要一行命令docker compose up -d,就可以啟動(dòng)一個(gè)包含后端項(xiàng)目、前端項(xiàng)目、數(shù)據(jù)庫(kù)的完整服務(wù)。
而docker-compose作為docker容器的編排工具,可以幫助我們實(shí)現(xiàn)管理多個(gè)docker容器。
其實(shí)整體的過(guò)程并不難,但要配置完成,也要很多步驟,這篇文章主要是從實(shí)戰(zhàn)的角度,將整個(gè)過(guò)程串起來(lái)。涉及的知識(shí)點(diǎn)包括:nginx、docker、docker-compose、node、mysql也需要了解下。適合讀下去的朋友:
- 對(duì)Docker有基本的了解
- 同時(shí)需要部署多個(gè)項(xiàng)目
- 需要開(kāi)源項(xiàng)目或者自建項(xiàng)目的整體部署
- 需要打包部署一整個(gè)網(wǎng)站
- Docker安裝并啟動(dòng)(演示版本如下)

- docker-compose(安裝Docker同時(shí)會(huì)自動(dòng)安裝,如果沒(méi)有可以自行安裝,也很簡(jiǎn)單)
- 一個(gè)前端項(xiàng)目(這里演示使用React SPA)
- 一個(gè)后端項(xiàng)目(這里使用Express)

如圖所示,通過(guò)docker-componse.yml文件一次啟動(dòng)不同的容器,然后他們都可以對(duì)外提供服務(wù)。
二、前端項(xiàng)目構(gòu)建
1、前端項(xiàng)目處理
首先我們通過(guò)CRA下載一個(gè)項(xiàng)目模版,為了可以模擬實(shí)際的項(xiàng)目需要,對(duì)下載的模版做一些處理,讓這個(gè)項(xiàng)目可以
1、區(qū)分當(dāng)前項(xiàng)目是預(yù)發(fā)環(huán)境還是生產(chǎn)環(huán)境
2、引入Axios可以請(qǐng)求接口
接著我們打包yarn build:prod,打包后的文件夾build就是我們要部署的靜態(tài)資源。 在前面工程化實(shí)踐過(guò)程中提過(guò)相關(guān)內(nèi)容,如果有問(wèn)題可以參考下- 前端工程化實(shí)踐 - React項(xiàng)目配置預(yù)發(fā)環(huán)境和生產(chǎn)環(huán)境(三)[1]
2、拉取Nginx鏡像部署
我們通過(guò)Docker部署前面打包的靜態(tài)資源
當(dāng)前項(xiàng)目的路徑是/Users/user/Desktop/mine/fronted-demo2/build
直接運(yùn)行下面命令行,啟動(dòng)前端服務(wù)dockerrun-d-p80:80-v/Users/user/Desktop/mine/fronted-demo2/build:/usr/share/nginx/html--namefrontend-testnginx

3、提取Nginx配置到項(xiàng)目中
首先,我們進(jìn)入上一步的Docker容器,可以看到Nginx的路徑。
docker exec -it frontend-test /bin/bash

然后通過(guò)掛載的方式,啟動(dòng)容器,發(fā)現(xiàn)訪問(wèn)正常。server {
listen 80;
server_name localhost;
underscores_in_headers on;
root /home/frontend;
location / {
try_files $uri $uri/ @router;
index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
}
4、編寫(xiě)Dockerfile文件
在項(xiàng)目根目錄下,新建Dockerfile文件,其中包括基礎(chǔ)鏡像、工作目錄、將項(xiàng)目copy到鏡像,將Nginx配置文件復(fù)制到鏡像中。FROM nginx
WORKDIR /home/frontend
COPY build .
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
5、構(gòu)建前端服務(wù)鏡像并啟動(dòng)
可以發(fā)現(xiàn)前端服務(wù)的鏡像已經(jīng)打包完成并啟動(dòng),打開(kāi)本地80端口訪問(wèn),測(cè)試完畢可以刪除,然后留鏡像frontend備用。也可以將鏡像推送鏡像倉(cāng)庫(kù),后面直接通過(guò)遠(yuǎn)程來(lái)拉取也可以。docker build -t frontend .
docker images
docker run -d -p 80:80 --name frontend-v1 frontend
主意:如果之前的Docker容器啟動(dòng),需要先關(guān)掉,否則會(huì)報(bào)端口被占用,如果不刪除,就需要修改重新啟動(dòng)容器的名字。
三、數(shù)據(jù)庫(kù)啟動(dòng)
1、拉取并啟動(dòng)數(shù)據(jù)庫(kù)、連接數(shù)據(jù)庫(kù)
dockerrun-p3306:3306--restart=always--privileged=true--namemysql-v/Users/user/Desktop/mysql/data:/var/lib/mysql-v/Users/user/Desktop/mysql/my.cnf:/etc/mysql/my.cnf-eMYSQL_ROOT_PASSWORD="123456"-dmariadb
一行命令啟動(dòng)Mariadb,這里選擇Mariadb是由于我m1的電腦,不支持mysql鏡像,所以改成了Mariadb,使用是一樣。上面的命令除了啟動(dòng)數(shù)據(jù)庫(kù)服務(wù),還設(shè)置了數(shù)據(jù)的一些配置,密碼,將數(shù)據(jù)庫(kù)的數(shù)據(jù)放在了本地。
[mysqld]
skip-name-resolve
user=root
character-set-server=utf8
default_authentication_plugin=mysql_native_password
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1 #忽略表名大小寫(xiě)
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
2、新建庫(kù)和表
這里可以進(jìn)入容器中操作數(shù)據(jù)庫(kù),還可以使用客戶端連接數(shù)據(jù)庫(kù)
四、后端項(xiàng)目啟動(dòng)
1、下載Express項(xiàng)目模版并連接數(shù)據(jù)庫(kù)
這里配置數(shù)據(jù)庫(kù),寫(xiě)好項(xiàng)目接口,確保本地啟動(dòng)服務(wù)正常。
2、拉起鏡像,部署鏡像
部署服務(wù),我們選擇使用pm2,為了區(qū)分生產(chǎn)環(huán)境和預(yù)發(fā)環(huán)境,我們?cè)诟夸浵滦陆╬m2.config.js,然后通過(guò)傳入不同的參數(shù),啟動(dòng)對(duì)應(yīng)的環(huán)境
啟動(dòng)預(yù)發(fā)環(huán)境pm2 start pm2.config.js --env development 啟動(dòng)生產(chǎn)環(huán)境pm2 start pm2.config.js --env production 再項(xiàng)目中通過(guò)process.env.NODE_ENV讀取module.exports = {
apps : [
{
name: "myapp",
script: "./bin/www",
watch: true,
env: {
"NODE_ENV": "development"
},
env_production: {
"NODE_ENV": "production",
}
}
]
}
3、編寫(xiě)Dockerfile并構(gòu)建新的鏡像
FROM keymetrics/pm2
RUN mkdir -p /home/backend
WORKDIR/home/backend
審核編輯:湯梓紅
-
開(kāi)源
+關(guān)注
關(guān)注
3文章
3492瀏覽量
43055 -
容器
+關(guān)注
關(guān)注
0文章
503瀏覽量
22234 -
nginx
+關(guān)注
關(guān)注
0文章
158瀏覽量
12346 -
Docker
+關(guān)注
關(guān)注
0文章
498瀏覽量
12289
原文標(biāo)題:Docker-compose打包項(xiàng)目一鍵部署
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用Helm 在容器服務(wù)k8s集群一鍵部署wordpress
云計(jì)算核心技術(shù)Docker教程:Docker Compose的pull和push命令詳解
Docker-compose常用的解決方法
Jenkins+docker+springboot一鍵自動(dòng)部署項(xiàng)目
Jenkins+Docker一鍵自動(dòng)化部署SpringBoot最簡(jiǎn)流程
Jenkins+Docker一鍵自動(dòng)化部署SpringBoot項(xiàng)目
Jenkins+Docker實(shí)現(xiàn)一鍵自動(dòng)化部署項(xiàng)目!
關(guān)于Jenkins+docker+springboot一鍵自動(dòng)部署項(xiàng)目

Jenkins+Docker一鍵自動(dòng)化部署SpringBoot應(yīng)用最精簡(jiǎn)流程

docker部署mysql的壞處
docker核心組件有哪些
寶塔面板一鍵免費(fèi)部署LobeChat聊天機(jī)器人開(kāi)發(fā)自己私有的ChatGPT

寶塔面板Docker一鍵安裝:部署GPTAcademic,開(kāi)發(fā)私有GPT學(xué)術(shù)優(yōu)化工具

評(píng)論