0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker-compose常用的解決方法

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-09-05 15:22 ? 次閱讀

前言

我們常常見到很多比較棒的開源項(xiàng)目,但在本地安裝運(yùn)行的話就會(huì)很復(fù)雜,要配置不同的環(huán)境,安裝不同的依賴,好一點(diǎn)的會(huì)用docker直接拉取,或者打包好。

這些無疑都會(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í)整體的過程并不難,但要配置完成,也要很多步驟,這篇文章主要是從實(shí)戰(zhàn)的角度,將整個(gè)過程串起來。涉及的知識(shí)點(diǎn)包括:nginx、docker、docker-compose、node、mysql也需要了解下。

適合讀下去的朋友:

對(duì)Docker有基本的了解

同時(shí)需要部署多個(gè)項(xiàng)目

需要開源項(xiàng)目或者自建項(xiàng)目的整體部署

需要打包部署一整個(gè)網(wǎng)站

需要提前準(zhǔn)備的

Docker安裝并啟動(dòng)(演示版本如下)

97b9695c-2acf-11ed-ba43-dac502259ad0.png

docker-compose(安裝Docker同時(shí)會(huì)自動(dòng)安裝,如果沒有可以自行安裝,也很簡(jiǎn)單)

一個(gè)前端項(xiàng)目(這里演示使用React SPA)

一個(gè)后端項(xiàng)目(這里使用Express)

97e7227a-2acf-11ed-ba43-dac502259ad0.png

如圖所示,通過docker-componse.yml文件一次啟動(dòng)不同的容器,然后他們都可以對(duì)外提供服務(wù)。

前端項(xiàng)目構(gòu)建

前端項(xiàng)目處理

首先我們通過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)資源。

拉取Nginx鏡像部署

我們通過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

980ab9a6-2acf-11ed-ba43-dac502259ad0.png

通過本機(jī)80端口訪問,發(fā)現(xiàn)當(dāng)前服務(wù)是生產(chǎn)環(huán)境,并且由于后端服務(wù)沒有部署,此時(shí)數(shù)據(jù)庫(kù)拿到的數(shù)據(jù)為空。

9818cbcc-2acf-11ed-ba43-dac502259ad0.png

測(cè)試,我們切換路由,發(fā)現(xiàn)頁(yè)面404了,是因?yàn)閱雾?yè)面應(yīng)用路由在前端,需要nginx轉(zhuǎn)發(fā)下,接著我們用項(xiàng)目中的Nginx配置覆蓋容器中的配置

提取Nginx配置到項(xiàng)目中

首先,我們進(jìn)入上一步的Docker容器,可以看到Nginx的路徑。

dockerexec-itfrontend-test/bin/bash

98269ce8-2acf-11ed-ba43-dac502259ad0.png

在項(xiàng)目根目錄下新建nginx/default.conf

server{
listen80;
server_namelocalhost;
underscores_in_headerson;
root/home/frontend;
location/{
try_files$uri$uri/@router;
indexindex.html;
}
location@router{
rewrite^.*$/index.htmllast;
}
}

然后通過掛載的方式,啟動(dòng)容器,發(fā)現(xiàn)訪問正常。

編寫Dockerfile文件

FROMnginx

WORKDIR/home/frontend

COPYbuild.

COPY./nginx/default.conf/etc/nginx/conf.d/default.conf

EXPOSE80

在項(xiàng)目根目錄下,新建Dockerfile文件,其中包括基礎(chǔ)鏡像、工作目錄、將項(xiàng)目copy到鏡像,將Nginx配置文件復(fù)制到鏡像中。

構(gòu)建前端服務(wù)鏡像并啟動(dòng)

dockerbuild-tfrontend.

dockerimages

dockerrun-d-p80:80--namefrontend-v1frontend

可以發(fā)現(xiàn)前端服務(wù)的鏡像已經(jīng)打包完成并啟動(dòng),打開本地80端口訪問,測(cè)試完畢可以刪除,然后留鏡像frontend備用。也可以將鏡像推送鏡像倉(cāng)庫(kù),后面直接通過遠(yuǎn)程來拉取也可以。

主意:如果之前的Docker容器啟動(dòng),需要先關(guān)掉,否則會(huì)報(bào)端口被占用,如果不刪除,就需要修改重新啟動(dòng)容器的名字。

數(shù)據(jù)庫(kù)啟動(dòng)

拉取并啟動(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#忽略表名大小寫

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

新建庫(kù)和表

這里可以進(jìn)入容器中操作數(shù)據(jù)庫(kù),還可以使用客戶端連接數(shù)據(jù)庫(kù)

984ccb2a-2acf-11ed-ba43-dac502259ad0.png

后端項(xiàng)目啟動(dòng)

下載Express項(xiàng)目模版并連接數(shù)據(jù)庫(kù)

這里配置數(shù)據(jù)庫(kù),寫好項(xiàng)目接口,確保本地啟動(dòng)服務(wù)正常。

拉起鏡像,部署鏡像

部署服務(wù),我們選擇使用pm2,為了區(qū)分生產(chǎn)環(huán)境和預(yù)發(fā)環(huán)境,我們?cè)诟夸浵滦陆╬m2.config.js,然后通過傳入不同的參數(shù),啟動(dòng)對(duì)應(yīng)的環(huán)境

module.exports={
apps:[
{
name:"myapp",
script:"./bin/www",
watch:true,
env:{
"NODE_ENV":"development"
},
env_production:{
"NODE_ENV":"production",
}
}
]
}

啟動(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)目中通過process.env.NODE_ENV讀取

編寫Dockerfile并構(gòu)建新的鏡像

FROMkeymetrics/pm2

RUNmkdir-p/home/backend

WORKDIR/home/backend

COPY.//home/backend

RUNyarninstall

ENVNPM_CONFIG_LOGLEVELwarn

EXPOSE9000

CMD["pm2-runtime","start","pm2.config.js","--env","production"]

然后構(gòu)建鏡像docker build -t backend .

docker-compose.yml 配置

截止目前,我們有了三個(gè)Docker鏡像,分別是前端服務(wù)的鏡像,后端服務(wù)的鏡像和數(shù)據(jù)庫(kù)的鏡像。然后我們編寫docker-compose.yml來同時(shí)啟動(dòng)這三個(gè)服務(wù),并且保證三者的啟動(dòng)順序。

編寫docker-compose配置文件

新建一個(gè)目錄,然后再目錄下新建docker-compose.yml和目錄mysql,mysql中包含了mysql的數(shù)據(jù)和日志信息,這樣就不用重啟服務(wù)導(dǎo)致數(shù)據(jù)庫(kù)信息丟失

version:'3'

networks:
app-web:
driver:bridge

services:
mysql:
image:mariadb
ports:
-3306:3306
command:--default-authentication-plugin=mysql_native_password
restart:always
networks:
-app-web
environment:
-TZ=Asia/Shanghai
-MYSQL_USER=root
-MYSQL_ROOT_PASSWORD=123456
volumes:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/mysql/my.cnf
-/etc/localtime:/etc/localtime
backend:
image:backend
ports:
-9000:9000
depends_on:
-mysql
networks:
-app-web
frontend:
image:frontend
ports:
-80:80
depends_on:
-backend

看到這個(gè)配置不要怕,拆分開,其實(shí)很簡(jiǎn)單,整個(gè)配置文件就是一個(gè)完整的項(xiàng)目,包括了mysql、backend、frontend,每個(gè)部分和配置Dockerfile差不多,增加了depends_on,很好理解,前置的服務(wù)需要提前部署,networks,讓不同的容器在相同的網(wǎng)絡(luò)中運(yùn)行。當(dāng)然這只是提供了最基礎(chǔ)的配置,更復(fù)雜的配置需要根據(jù)使用場(chǎng)景來完善。

啟動(dòng)服務(wù)

dockercomposeup-d

-d#是以守護(hù)進(jìn)程的方式運(yùn)行,通過docker ps可以查看當(dāng)前所有運(yùn)行中的服務(wù)。

9864b820-2acf-11ed-ba43-dac502259ad0.png

dockercomposedown

#停止當(dāng)前集群下的所有服務(wù),并刪除容器。

到這里,我們的docker-compose整體打包部署一個(gè)網(wǎng)站已經(jīng)完成了,過程中可能存在各種各樣的坑,但只要配置報(bào)錯(cuò)日志進(jìn)行查詢,就能一一解決。

如果需要重新部署一套,或者發(fā)布新版本,只需要更新docker-compose.yml就可以了

注意點(diǎn)

1、mysql配置

數(shù)據(jù)庫(kù)和項(xiàng)目的一些信息需要靈活配置,根據(jù)自己的需要。

自動(dòng)遷移數(shù)據(jù)庫(kù)

我們發(fā)現(xiàn),一些新的數(shù)據(jù)庫(kù)表,沒有進(jìn)行初始化,導(dǎo)致需要手動(dòng)處理,在項(xiàng)目中我們可以用腳本去,或者使用一些數(shù)據(jù)庫(kù)封裝的orm進(jìn)行自動(dòng)遷移。

一些報(bào)錯(cuò)信息

986ff348-2acf-11ed-ba43-dac502259ad0.png

解決辦法,修改mysql配置host為mysql

9887cf72-2acf-11ed-ba43-dac502259ad0.png

1、docker拉取鏡慢的話,可以考慮國(guó)內(nèi)鏡像

2、前端、后端項(xiàng)目可以使用任意的語言,只要構(gòu)架不同的鏡像就可以了。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8254

    瀏覽量

    149942
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3711

    瀏覽量

    64021
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    12113
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    446

    瀏覽量

    11738

原文標(biāo)題:使用 Docker-compose 打包整個(gè)網(wǎng)站項(xiàng)目一鍵部署

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【昉·星光 2 高性能RISC-V單板計(jì)算機(jī)體驗(yàn)】為 Ubuntu 安裝 Docker常用軟件

    docker sudo apt install docker.io 安裝 docker-compose sudo apt-get install docker-compose
    發(fā)表于 02-21 17:54

    docker常用命令有哪些?

    docker常用命令:Docker鏡像相關(guān)Docker容器相關(guān)Docker倉(cāng)庫(kù)相關(guān)
    發(fā)表于 11-06 06:48

    基于DOCKER容器的ELK日志收集系統(tǒng)分析

    工具docker-compose,一鍵式構(gòu)建基于Docker容器的ELK日志收集系統(tǒng)的實(shí)驗(yàn)環(huán)境,證明了本系統(tǒng)收
    發(fā)表于 11-06 14:15 ?3次下載
    基于<b class='flag-5'>DOCKER</b>容器的ELK日志收集系統(tǒng)分析

    POP噪音及其常用解決方法

    POP噪音及其常用解決方法
    發(fā)表于 11-27 14:56 ?14次下載

    云計(jì)算核心技術(shù)Docker教程:Docker Compose的pull和push命令詳解

    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務(wù)關(guān)聯(lián)的鏡像,Docker-Compose pu
    的頭像 發(fā)表于 11-17 18:22 ?9032次閱讀

    云計(jì)算核心技術(shù)DockerCompose中的環(huán)境變量

    :${TAG}” 如果您有多個(gè)環(huán)境變量,則可以通過提供環(huán)境變量文件的路徑來替換它們。默認(rèn)情況下,該docker-compose 命令將.env在您運(yùn)行該命令的目錄中查找一個(gè)名為的文件。通過將文件作為參數(shù),你
    的頭像 發(fā)表于 02-16 09:58 ?3635次閱讀

    Docker Compose Docker應(yīng)用構(gòu)建管理工具

    ./oschina_soft/compose.zip
    發(fā)表于 05-12 15:58 ?1次下載
    <b class='flag-5'>Docker</b> <b class='flag-5'>Compose</b> <b class='flag-5'>Docker</b>應(yīng)用構(gòu)建管理工具

    docker compose一鍵打包部署項(xiàng)目的實(shí)踐

    【導(dǎo)讀】本文介紹了 docker compose 一鍵打包部署項(xiàng)目的實(shí)踐。
    的頭像 發(fā)表于 08-30 11:03 ?1383次閱讀

    使用podman-compose部署wordpress的示例

    我們對(duì)于docker-compose并不陌生,它是一個(gè)用于編排多個(gè)可能相互依賴的容器的工具。
    的頭像 發(fā)表于 10-17 10:59 ?2549次閱讀

    SpringBoot接入輕量級(jí)分布式日志框架GrayLog

    老樣子,直接上docker-compose,如果一直跟著我的步伐,應(yīng)該對(duì)著不陌生了。docker-compose.yml 的內(nèi)容其實(shí)我也是抄官網(wǎng)的,這里還是貼下吧(就不用你們翻了)
    的頭像 發(fā)表于 10-27 10:29 ?1010次閱讀

    使用Docker安裝WordPress教程

    本教程將向您展示如何使用 Docker ComposeDocker 容器中運(yùn)行 WordPress 安裝。
    的頭像 發(fā)表于 07-28 11:39 ?1360次閱讀
    使用<b class='flag-5'>Docker</b>安裝WordPress教程

    docker進(jìn)入容器的方法有哪些

    Docker是一種流行的容器化平臺(tái),它能夠快速構(gòu)建、交付和運(yùn)行應(yīng)用程序。在使用Docker時(shí),我們經(jīng)常需要進(jìn)入容器進(jìn)行調(diào)試、管理和運(yùn)行命令等操作。本文將詳細(xì)介紹Docker進(jìn)入容器的各種方法
    的頭像 發(fā)表于 11-23 09:45 ?8896次閱讀

    如何利用樹莓派安裝DockerDocker-compose呢?

    本文主要演示了樹莓派如何安裝DockerDocker-compose的過程。
    的頭像 發(fā)表于 12-14 16:19 ?2312次閱讀
    如何利用樹莓派安裝<b class='flag-5'>Docker</b>和<b class='flag-5'>Docker-compose</b>呢?

    基于Docker-Compose的Apollo部署安裝與使用

    為什么選擇 Apollo:穩(wěn)定&簡(jiǎn)單,雖然比不上 Nacos 的性能,也沒有服務(wù)發(fā)現(xiàn)功能,但是穩(wěn)定啊?。?! 在我自己部署前,會(huì)覺得這個(gè)東西好難,好重,好麻煩。寫這篇文章的時(shí)候的感受只有兩個(gè)字:牛*
    的頭像 發(fā)表于 01-02 10:15 ?1222次閱讀
    基于<b class='flag-5'>Docker-Compose</b>的Apollo部署安裝與使用

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

    使用寶塔Docker-compose,5分鐘內(nèi)在海外服務(wù)器上搭建gpt_academic。這篇文章講解如何使用寶塔面板的Docker服務(wù)搭建GPT 學(xué)術(shù)優(yōu)化 (GPT Academic)。 ? 在
    的頭像 發(fā)表于 07-02 11:58 ?2028次閱讀
    寶塔面板<b class='flag-5'>Docker</b>一鍵安裝:部署GPTAcademic,開發(fā)私有GPT學(xué)術(shù)優(yōu)化工具