精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊如何使用Docker來編排Web應(yīng)用

開發(fā) 前端
考慮這樣一個場景,一個正在運(yùn)行的web應(yīng)用,它用到了vue、java8、java15、tomcat、nginx、php、mysql和redis。如果要將這個應(yīng)用遷移到一臺新的服務(wù)器上運(yùn)行,那么就需要在這臺機(jī)器上重新安裝所需的軟件以及環(huán)境變量,這是很痛苦的。

前言

使用docker可以輕松構(gòu)建一個項(xiàng)目并運(yùn)行,然而在真實(shí)的使用場景中,我們的項(xiàng)目并非是單一的,而是多個項(xiàng)目相互依賴組成一個web應(yīng)用。

考慮這樣一個場景,一個正在運(yùn)行的web應(yīng)用,它用到了vue、java8、java15、tomcat、nginx、php、mysql和redis。如果要將這個應(yīng)用遷移到一臺新的服務(wù)器上運(yùn)行,那么就需要在這臺機(jī)器上重新安裝所需的軟件以及環(huán)境變量,這是很痛苦的。

那么,有沒有什么辦法來解決這個問題呢?當(dāng)然有,那就是本文的主角docker-compose(docker編排)。本文就跟大家分享下我是如何使用它解決我的痛苦的,歡迎各位感興趣的開發(fā)者閱讀本文。

前置知識

閱讀本文前,你需要先提前安裝好Docker[1]和 docker-compose[2]。如果你已經(jīng)安裝,我們先來了解幾個基礎(chǔ)概念。如果你僅僅只是想學(xué)習(xí)我是如何編排整個web應(yīng)用的,請直接從編排容器[3]章節(jié)開始閱讀。

鏡像

操作系統(tǒng)分為內(nèi)核和用戶空間,對于Linux而言,內(nèi)核啟動后,會掛載root文件系統(tǒng),為其提供用戶空間支持。而Docker鏡像就相當(dāng)于一個root文件系統(tǒng)。比如官方的鏡像ubuntu:20.04就包含了完整的一套u(yù)buntu最小系統(tǒng)的rooot文件系統(tǒng)。

Docker的鏡像是一個比較特殊的文件系統(tǒng),它除了提供容器運(yùn)行時所需的東西外,還包含了一些為運(yùn)行時準(zhǔn)備的一些配置參數(shù)(掛載卷、環(huán)境變量、用戶等)。鏡像不會包含任何的動態(tài)數(shù)據(jù),因此在構(gòu)建之后,它的內(nèi)容不會被改變。

如果你還是一頭霧水的話,可以將它比作“備份”,在需要的時候把它拿出來即可原封不動的獲得備份時刻的內(nèi)容。

可能有些開發(fā)者會有疑問,即使是最小的root文件系統(tǒng),它的體積也是龐大的。Docker在設(shè)計(jì)時,就充分利用 Union FS[4] 的技術(shù),將其設(shè)計(jì)為分層存儲的架構(gòu)。這種架構(gòu)使得鏡像的復(fù)用、定制變的更為容易,可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。

??注意:鏡像構(gòu)建時,會一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。因此,在編寫鏡像配置文件的時候,每一層盡量只包含該層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉(比如你在某一層需要刪除前一層的文件,它只是將文件標(biāo)記為了已刪除,最終容器運(yùn)行的時候,雖然不會看到這個文件,但是實(shí)際上該文件會一直跟隨鏡像)。

容器

鏡像與容器之間的關(guān)系,類似于Java中的類與實(shí)例。鏡像是類,容器是實(shí)例化出來的實(shí)例。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。

容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的命名空間。因此容器可以擁有自己的root文件系統(tǒng)、網(wǎng)絡(luò)配置、進(jìn)程空間。容器內(nèi)的進(jìn)程是運(yùn)行在一個隔離的環(huán)境里,使用起來,就好像是在一個獨(dú)立于宿主的系統(tǒng)下操作一樣。

前面我們講過鏡像使用的是分層存儲,容器也是如此。每一個容器運(yùn)行時,以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個當(dāng)前容器的存儲層,這個為容器運(yùn)行時讀寫而準(zhǔn)備的存儲層稱之為容器存儲層。

??注意:容器存儲層的生命周期和容器一樣,容器銷毀時,存儲層也隨之銷毀。因此,任何保存于存儲層的信息都會隨著容器的銷毀而丟失。

因此,當(dāng)我們的容器需要進(jìn)行數(shù)據(jù)寫入時,需要 使用volume數(shù)據(jù)卷 或者 掛載宿主機(jī)的目錄 來實(shí)現(xiàn)數(shù)據(jù)的持久化。

倉庫

當(dāng)我們構(gòu)建好鏡像之后,很容易在當(dāng)前的宿主機(jī)上運(yùn)行,但是,如果需要在其他服務(wù)器上使用這個鏡像,我們就需要一個倉庫來存儲和分發(fā)它們。Docker Registry[5] 就是這樣的服務(wù)。

一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像。

一個倉庫包含同一個軟件不同版本的鏡像,標(biāo)簽就對應(yīng)著軟件的各個版本。我們通過<倉庫名>:<標(biāo)簽>的格式來指定具體是那個版本的鏡像。

我們以ubuntu鏡像為例,ubuntu是倉庫的名字,其內(nèi)包含有不同的版本標(biāo)簽,如:18.04,20.04。我們在編寫配置文件的時候,就可以通過ubuntu:18.04、ubuntu:20.04來指定具體所需版本的鏡像。如果忽略了標(biāo)簽,將視為ubuntu:latest。

公開服務(wù)

Docker Registry 公開服務(wù)是開放給用戶使用,允許用戶管理鏡像的Registry服務(wù)。一般這類公開服務(wù)允許用戶免費(fèi)上傳、下載公開的鏡像。

最常使用的公開服務(wù)是官方的 Docker Hub[6],這個也是默認(rèn)的Registry。擁有大量的官方鏡像。除此之外,還有:

  • Red Hat 的 Quay.io[7]
  • Google 的 Google Container Registry[8]

私有部署

當(dāng)用戶制作好一個鏡像后,不方便在公開服務(wù)上發(fā)布時,就需要在內(nèi)部自己搭建Docker Registry。官方提供了 Docker Registry[9] 鏡像,可以直接使用做為私有 Registry 服務(wù)。

開源的 Docker Registry 鏡像只提供了 Docker Registry API[10] 的服務(wù)端實(shí)現(xiàn),足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護(hù)、用戶管理、訪問控制等高級功能。

除了官方的 Docker Registry 外,還有第三方軟件實(shí)現(xiàn)了 Docker Registry API,提供了用戶界面以及一些高級功能。比如:Harbor[11]

創(chuàng)建鏡像

Docker鏡像的構(gòu)建是通過讀取Dockerfile文件來完成的,它本質(zhì)是一個文本文件,其內(nèi)包含了一條條的指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。

編寫配置文件

此處以我的開源項(xiàng)目chat-system的后端服務(wù)為例,在項(xiàng)目的根目錄創(chuàng)建名為chat-system-server-DockerFile的文件,在文件內(nèi)添加下述代碼:

  • 通過FROM指令來指定基礎(chǔ)鏡像
  • 通過COPY指令來復(fù)制文件到鏡像內(nèi)
  • 通過EXPOSE指令來聲明服務(wù)運(yùn)行時的端口號
FROM tomcat:9.0.41-jdk8-openjdk

COPY ./chat-system-server.war /usr/local/tomcat/webapps/
COPY ./tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml


EXPOSE 8080

圖片圖片

上面的指令:我們用了9.0.41版本的tomcat且jdk版本為1.8的鏡像作為基礎(chǔ)環(huán)境,隨后我們拷貝了項(xiàng)目的war包到tomact的webapps目錄下,拷貝了tomcat的配置文件到了鏡像內(nèi)。聲明了8080為本服務(wù)的訪問端口號。

常用的指令

在DockerFile中,除了前面我們所講的,還有很多內(nèi)置的指令可以用,此處我們挑幾個常用的來做下講解。

  • ADD 用于從URL獲取文件并將其放到目標(biāo)路徑下
  • RUN 用于執(zhí)行命令行命令,支持兩種格式:
  • shell格式,RUN <命令>相當(dāng)于直接在命令行中輸入命令。
  • exec格式,RUN ["可執(zhí)行文件","參數(shù)1","參數(shù)2"]
  • CMD 用于指定容器在啟動時所需要運(yùn)行的程序以及參數(shù),與RUN命令支持的格式相同
  • ENV 用于設(shè)置環(huán)境變量
  • WORKDIR 用于指定工作目錄,鏡像在構(gòu)建過程中,每一行都代表一層,如果你在上一層做了操作,在當(dāng)前層需要基于上層完成其他事情,就需要指定它的工作目錄

如果你想了解完整的的指令列表,請移步:Dockerfile 指令詳解[12]。

??注意:在編寫配置文件的時候,如果需要執(zhí)行多個類似于RUN的指令時,請用&&來拼接。因?yàn)榍懊嫖覀冎v過docker是分層存儲機(jī)制,每一個指令都會建立一層,如果運(yùn)行了多個RUN指令,它就會創(chuàng)建多層鏡像,這是完全沒有意義的,而且很多運(yùn)行時不需要的東西,都被裝進(jìn)了鏡像里,比如編譯環(huán)境、更新的軟件包等等。結(jié)果就是產(chǎn)生非常臃腫、非常多層的鏡像,不僅僅增加了構(gòu)建部署的時間,也很容易出錯。Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方式,以及行首 # 進(jìn)行注釋的格式。

RUN set -x; buildDeps='gcc libc6-dev make wget' \    && apt-get update \    && apt-get install -y $buildDeps \    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" 

構(gòu)建鏡像

打開終端,進(jìn)入Dockerfile文件所在在的目錄,執(zhí)行 docker build -t chat-system-server:1.0.0 -f chat-system-server-DockerFile .命令,即可開始構(gòu)建流程。

  • -t 用于指定容器名
  • -f 用于指定配置文件
  • . 表示當(dāng)前目錄,在終端執(zhí)行build命令時,需要指定構(gòu)建鏡像的上下文路徑。

圖片圖片

image-20231109215729884

??注意:如果你沒有指定配置文件,它默認(rèn)會使用目錄下名為Dockerfile的文件。如果你的配置文件中包含了COPY操作,請務(wù)必指定上下文路徑。

啟動容器

啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另一種是啟動一個處于終止?fàn)顟B(tài)的容器。

新建并啟動

使用docker run 鏡像名即可創(chuàng)建一個容器并啟動它,我們以上個章節(jié)創(chuàng)建的鏡像為例。

docker run chat-system-server:1.0.0

命令執(zhí)行后,你將在控制臺看到相關(guān)的輸出。

圖片圖片

容器啟動之后,通過鏡像中聲明的8080端口訪問,你會發(fā)現(xiàn)訪問不了。這是因?yàn)槿萜鲉雍鬀]有做端口映射,我們需要在啟動命令中添加-p參數(shù)來指定端口。

  • -p 后面跟主機(jī)訪問地址,:后跟的是容器的訪問端口。
  • 容器的訪問端口通常會使用Dockerfile中通過EXPOSE指令所定義的端口號。
docker run -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

啟動已終止容器

使用docker container start 容器名即可啟動一個處于終止?fàn)顟B(tài)的容器。因?yàn)槲覀兪切陆ǖ娜萜鳎瑳]有給它命名,docker會默認(rèn)一個容器名,我們可以通過docker ps -a命令來拿到容器名,或者通過Webstorm的Docker插件來獲取。

圖片圖片

docker container start crazy_wu

常用的參數(shù)與命令

容器在啟動時,有豐富的參數(shù)可以配置,此處我列舉幾個最常用的參數(shù)。

在后臺運(yùn)行容器

我們新建并啟動一個容器[13]時,默認(rèn)會在當(dāng)前終端中運(yùn)行,終端窗口關(guān)閉后,容器也會跟著終止。通過-d參數(shù)即可讓它在后臺運(yùn)行。

docker run -d -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

為容器命名

我們在新建容器時,可以通過--name參數(shù)來給它命名。

docker run --name local_chat_system_server -d -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

圖片圖片

終止與刪除容器

我們可以通過stop和rm指令來終止和刪除容器。

# 終止容器
docker container stop 容器名
# 刪除容器
docker container rm 容器名

進(jìn)入容器

如果容器處于后臺運(yùn)行時,我們需要進(jìn)入容器,做一些操作。就需要使用docker exec -it 容器名 bash來實(shí)現(xiàn)。

docker exec -it local_chat_system_server bash

執(zhí)行命令后,就能看到熟悉的終端了。

圖片圖片

數(shù)據(jù)掛載

前面我們說過,容器內(nèi)存儲的數(shù)據(jù)會隨著容器的終止而丟失,需要掛載數(shù)據(jù)卷來實(shí)現(xiàn)數(shù)據(jù)的持久化存儲。通常有兩種做法:

  • 數(shù)據(jù)卷
  • 目錄映射

通過數(shù)據(jù)卷來做存儲需要先使用docker volume create 卷名 命令來創(chuàng)建,新建并啟動一個容器[14]的時候通過--mount指令或者-v 數(shù)據(jù)卷:容器目錄地址來掛載。

# 創(chuàng)建一個數(shù)據(jù)卷
docker volume create chat-system-data
# 啟動容器并掛載數(shù)據(jù)卷
docker run -d  \
    --name local_chat_system_server \
    --mount source=chat-system-data,target=/usr/local/data \
   chat-system-server:1.0.0

容器啟動后,會將日志寫到我掛載的數(shù)據(jù)卷中。當(dāng)我想在主機(jī)上查看寫入的日志數(shù)據(jù)時,發(fā)現(xiàn)怎么找也找不到。查了很多資料,最后發(fā)現(xiàn)他的數(shù)據(jù)卷存儲很復(fù)雜,并沒有集中存儲,而是分布式的。

這種方式顯然不是我想要的,而目錄映射的方式正好滿足我的需求。我們只需要將數(shù)據(jù)卷改為主機(jī)的路徑即可,此處我們以-v參數(shù)為例。

docker run -d  \
    --name local_chat_system_server \
    -v /Users/likai/Documents/chat-system-server-data:/usr/local/data \
   chat-system-server:1.0.0

??注意:目錄映射的形式會把指定的主機(jī)路徑與容器內(nèi)的目標(biāo)路徑做關(guān)聯(lián),本地主機(jī)做的操作會響應(yīng)到容器內(nèi),反之亦然。

編排容器

現(xiàn)在,我們回到文章開頭所說的那個場景,一開始我打算使用ubuntu:20.04作為基礎(chǔ)鏡像,寫DockerFile安裝我需要的依賴包,設(shè)置環(huán)境變量,打包成鏡像來使用。我在做事情之前,喜歡先請教下這方面玩的比較好的朋友。

他們告訴我說,如果全部打包到一個鏡像里 ,后期維護(hù)與擴(kuò)展將成為惡夢,后面你要添加新項(xiàng)目,想訪問一些之前項(xiàng)目里提供的服務(wù),你就得做很大的改動。一般這種場景我們都會使用Docker Compose來實(shí)現(xiàn)的。

簡而言之,Docker Compose的作用就是將多個獨(dú)立的容器組合起來,讓容器之間可以輕易的互相訪問,最終實(shí)現(xiàn)我們的需求。

編寫配置文件

容器的編排是通過編寫docker-compose.yml配置文件來實(shí)現(xiàn)的,一般我們會將這個文件創(chuàng)建在項(xiàng)目的根目錄。它的配置文件中包含有很多配置項(xiàng),此處我們只列舉本文需要用到的。

  • version,用于指定 Docker Compose 文件的格式版本,以確保正確解析和處理文件中的配置,截止目前(2023-11-15)比較主流的版本為3
  • networks,用于自定義網(wǎng)絡(luò)
  • services,用于定義各種服務(wù)(mysql、redis、nginx等)將它們組合到一起,形成一個web應(yīng)用

定義網(wǎng)絡(luò)

在物理機(jī)上部署服務(wù)時,多個服務(wù)之間相互訪問,需要物理機(jī)必須處于同一個網(wǎng)關(guān)下(防火墻也要正確的配置),這樣就能實(shí)現(xiàn)多個容器之間的互聯(lián)互通。

在docker-compose中流程也是一樣的,因此我們就需要先定義一個網(wǎng)絡(luò),設(shè)置好網(wǎng)關(guān)。如下所示,我們定義了一個名為kaisir-docker-network的自定義網(wǎng)絡(luò)。

  • external: true 表示該網(wǎng)絡(luò)為外部網(wǎng)絡(luò),其他Docker容器可以連接到這個網(wǎng)絡(luò)
  • name 指定了網(wǎng)絡(luò)名稱
  • driver: bridge指定網(wǎng)絡(luò)的連接模式為橋接,他還有很多其他模式可供選擇(host、overlay等)具體請自行查閱相關(guān)資料
  • ipam用于IP地址的配置

driver: default,用于指定IP地址管理的驅(qū)動程序,此處選擇默認(rèn)即可

config,用于配置IP地址池,在這里我們定義了一個子網(wǎng)為192.168.30.0/24,其中包含了192.168.30.1到192.168.30.254的所有IP地址。gateway指定了網(wǎng)關(guān)地址為 192.168.30.1

networks:
    kaisir-docker-network:
        external: true
        name: kaisir-docker-network
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 192.168.30.0/24
                  gateway: 192.168.30.1

通過上述配置,我們就可以在服務(wù)中連接這個網(wǎng)絡(luò)了。有些開發(fā)者可能對192.168.30.0/24比較疑惑,這里就稍作下解釋 。這是一個 CIDR(Classless Inter-Domain Routing)表示法,用于表示 IP 地址范圍。CIDR 表示法包括兩部分:IP 地址的網(wǎng)絡(luò)部分和主機(jī)部分,通過斜杠后面的數(shù)字表示網(wǎng)絡(luò)的長度。

在 192.168.30.0/24 中:

  • 192.168.30.0 是網(wǎng)絡(luò)的基礎(chǔ) IP 地址。
  • /24 表示網(wǎng)絡(luò)的前綴長度,即網(wǎng)絡(luò)中有多少個連續(xù)的 IP 地址。在這里,它表示有24位用于網(wǎng)絡(luò),剩余的 32 - 24 = 8 位用于主機(jī)。

具體地,192.168.30.0/24 表示從 192.168.30.0 到 192.168.30.255 的IP地址范圍,其中包括了 192.168.30.1 到 192.168.30.254 的所有IP地址。192.168.30.0 是網(wǎng)絡(luò)地址,192.168.30.255 是廣播地址。

定義服務(wù)

我可以在services指令下定義我們需要的服務(wù),為他們連接網(wǎng)絡(luò)、掛載數(shù)據(jù)卷、設(shè)置時區(qū)、定義訪問端口等,我們以mysql為例來做講解,如下所示:

  • mysql為服務(wù)名稱
  • image為鏡像名稱
  • container_name為容器名稱
  • volumes為我們需要掛載的數(shù)據(jù)卷
  • ports為端口映射
  • networks為服務(wù)需要接入的網(wǎng)絡(luò),定義服務(wù)需要分配的ip地址
  • environment 設(shè)置容器的環(huán)境變量,此處我們設(shè)置了mysql的root用戶密碼以及時區(qū)
services:
    mysql:
        image: mysql:5.7.42
        container_name: local_mysql
        volumes:
             - /Users/likai/Documents/mysql_data:/var/lib/mysql
             - /Users/likai/Documents/mysql_conf/my.cnf:/etc/my.cnf
        ports:
            - 3306:3306
        networks:
            kaisir-docker-network:
                ipv4_address: 192.168.30.11
        environment:
            - MYSQL_ROOT_PASSWORD=xxxx
            - TZ=Asia/Shanghai

通過這幾行配置,我們就擁有了一個mysql服務(wù)。并且其他服務(wù)可以通過192.168.30.11:3306訪問到這個服務(wù)。

我們再來定義Java服務(wù)和nginx服務(wù),以我的chat-system-server為例,在打包Java服務(wù)時,將數(shù)據(jù)庫的地址指向我們剛才的mysql服務(wù)即可。

圖片圖片

chat-system-server:
        image: tomcat:9.0.41-jdk8-openjdk
        container_name: chat_system_server
        ports:
            - 8080:8080
        volumes:
            - /Users/likai/Documents/docker_tomcat/webapps:/usr/local/tomcat/webapps
            - /Users/likai/Documents/chat-system-server-data:/usr/local/data
            - /Users/likai/Documents/docker_tomcat/conf/:/usr/local/tomcat/conf
        environment:
            - TZ=Asia/Shanghai
        networks:
            kaisir-docker-network:
                ipv4_address: 192.168.30.12
    nginx-server:
        image: nginx:1.18.0
        container_name: local_nginx
        ports:
            - 80:80
            - 443:443
        volumes:
            - /Users/likai/Documents/nginx_config:/etc/nginx
            - /Users/likai/Documents/nginx_data:/usr/share/nginx/data
        environment:
            - TZ=Asia/Shanghai
        networks:
            - kaisir-docker-network
        depends_on:
            - redis
            - mysql
            - chat-system-server
            - kodbox
            - halo

同樣的,其他的服務(wù)也通過這種格式進(jìn)行定義即可。上面的配置中,我還定義了redis、kodbox、halo這三個服務(wù)。

  • kodbox 是我之前搭建的網(wǎng)盤服務(wù)[15],依賴php環(huán)境
  • halo 是我的個人網(wǎng)站[16],依賴Java15環(huán)境

因?yàn)橛卸鄠€服務(wù)都需要用到數(shù)據(jù)庫,我需要確保數(shù)據(jù)庫先啟動,因此上面的配置中,我還用depends_on指令定義了服務(wù)的啟動順序。

??注意:上面的配置文件中,本地路徑是寫死在配置文件中的,實(shí)際在使用的時候一般會通過變量的形式注入一個路徑前綴進(jìn)來,如下所示:

  • 如果 MY_VOLUME_PATH 環(huán)境變量存在并且非空,則使用它的值
  • 否則,使用默認(rèn)值 /default/path

        volumes:            - ${MY_VOLUME_PATH:-/default/path}/docker_tomcat/webapps:/usr/local/tomcat/webapps

啟動服務(wù)

最后,我們在終端通過docker-compose up命令即可啟動我們定義好的所有服務(wù)。因?yàn)槲覀冇成淞吮镜氐?080端口為chat_system_server的服務(wù),我們在postman內(nèi)通過127.0.0.1:8080即可訪問到這個容器所提供的服務(wù)了。

docker-compose up

圖片圖片

圖片圖片

在nginx的配置文件中我也暴露了80端口出來,指向了halo服務(wù),在瀏覽器中直接訪問127.0.0.1就能看到服務(wù)所提供的內(nèi)容了。

圖片圖片

??注意:如果你的配置文件中定義了路徑變量則需要在啟動時傳入這個變量,如下所示:

MY_VOLUME_PATH=/path/to/your/volume docker-compose up

踩坑記錄

我在配置mysql服務(wù)時,走了很多彎路,不知道哪步搞錯了,啟動服務(wù)后會報(bào)錯find: '/var/lib/mysql/mysql.sock': No such file or directory,導(dǎo)致啟動失敗,我嘗試過刪除容器、刪除鏡像,清空主機(jī)映射的目錄文件,都解決不了。

最后,發(fā)現(xiàn)是權(quán)限原因,在 docker-compose.yml文件中,給mysql服務(wù)添加下述配置即可解決。問題解決后,再把這些去掉即可。

command:
      - /bin/bash
      - -c
      - |
        chmod +rw /var/lib/mysql
        mysqld

責(zé)任編輯:武曉燕 來源: 神奇的程序員
相關(guān)推薦

2023-08-04 08:20:56

DockerfileDocker工具

2024-07-26 09:47:28

2023-11-16 08:01:31

2023-03-26 00:00:01

應(yīng)用程序LLM策略

2024-11-27 16:07:45

2024-09-30 09:33:31

2023-06-30 08:18:51

敏捷開發(fā)模式

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-10 21:42:31

2024-02-20 21:34:16

循環(huán)GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-09-09 00:00:00

編寫技術(shù)文檔

2023-04-03 00:09:13

2024-12-10 00:00:25

2021-12-10 07:45:48

字節(jié)音頻視頻

2025-01-09 07:54:03

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計(jì)算機(jī)平板微信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久久久久久久久久久久久久| av免费观看大全| 99热这里只有精品99| 黄色精品一区| 亚洲区在线播放| 色噜噜狠狠永久免费| 日韩另类在线| 国产欧美精品日韩区二区麻豆天美| 国产精品免费视频xxxx| 永久免费看黄网站| 免费看日本一区二区| 91精品综合久久久久久| 大j8黑人w巨大888a片| 亚洲搞黄视频| av在线播放成人| 国产精品久久久久久久9999| 久久久久亚洲av无码专区| 中文字幕中文字幕精品| 欧美一级国产精品| 激情婷婷综合网| 欧美videosex性欧美黑吊| 久久精品视频网| 波多野结衣久草一区| 中文字幕xxxx| 99国产精品私拍| 久久香蕉频线观| 少妇无套高潮一二三区| 精品欧美午夜寂寞影院| 91精品国产综合久久久久久久久久| 国模无码视频一区二区三区| 日本片在线看| 亚洲欧洲精品一区二区精品久久久 | 日韩视频一区二区在线观看| 大香煮伊手机一区| av第一福利在线导航| 综合久久国产九一剧情麻豆| 日本精品二区| 婷婷在线观看视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 西西人体一区二区| 久久久久国色av免费观看性色| 一二三四在线观看视频| 亚洲永久精品唐人导航网址| 欧美精品一区二区高清在线观看| 久久久精品高清| 在线一区视频观看| 日韩欧美中文免费| 日韩精品xxxx| 激情黄产视频在线免费观看| 亚洲一区二区三区免费视频| 糖心vlog在线免费观看| 久草免费在线观看| 亚洲欧美日韩久久| 欧美日韩在线免费观看视频| 欧美日本高清| 中文字幕一区二| 影音先锋欧美在线| 免费黄色在线看| 国产精品成人免费在线| 在线成人性视频| 成人三级网址| 亚洲精品视频免费看| 99re6这里有精品热视频| 黄色av电影在线观看| 亚洲色大成网站www久久九九| 一区二区三区不卡在线| 快射视频在线观看| 亚洲精品中文在线影院| 免费观看亚洲视频| 黑人极品ⅴideos精品欧美棵| 亚洲国产欧美日韩另类综合 | 精品久久久久久亚洲| 天天干天天摸天天操| 91美女视频网站| 欧美一级日本a级v片| 97在线观看免费观看高清| 国产精品久久毛片| 黄色污污在线观看| а_天堂中文在线| 天天综合天天做天天综合| 美女福利视频在线| 久久精品国产精品亚洲毛片| 91精品国产手机| 久久人妻少妇嫩草av无码专区| 神马午夜久久| 日韩中文字幕在线视频播放| 精品无码久久久久成人漫画 | 久久成人综合视频| 国产在线观看免费av| 久久久久久自在自线| 91精品久久久久久久久久久久久| 国产不卡精品视频| 97久久超碰国产精品| 图片区小说区区亚洲五月| av免费在线网站| 色偷偷久久一区二区三区| 久国产精品视频| 老牛国内精品亚洲成av人片| 国产午夜精品视频免费不卡69堂| 久草手机视频在线观看| 影音国产精品| 国产精品丝袜久久久久久高清 | 国产成a人亚洲精品| 久久99精品国产一区二区三区| 国产98在线| 亚洲一区影音先锋| 日韩欧美黄色大片| 91麻豆精品激情在线观看最新| 国产一区二区三区网站| 久久婷婷国产麻豆91| 日韩高清在线一区| 国产成人精品免费视频大全最热 | 污污的网站免费| 任我爽精品视频在线播放| 伦伦影院午夜日韩欧美限制| 男人天堂视频网| 不卡的av网站| 日韩精品一区二区三区电影| 99久久婷婷国产综合精品首页 | 99精彩视频| 在线免费观看黄色| 色婷婷av一区| 给我免费观看片在线电影的| 欧美国产91| 91久久精品在线| 波多野结衣一区二区| 黑人巨大精品欧美一区二区三区| 男人女人拔萝卜视频| 9999国产精品| 国产精品午夜视频| jizz亚洲| 欧美亚洲尤物久久| 黑人巨大精品欧美| 久久成人国产| 欧美日韩国产一二| 男人av在线播放| 精品少妇一区二区三区视频免付费 | 高清福利在线观看| 精品福利免费观看| 精品国产午夜福利在线观看| 国产真实有声精品录音| 久久久视频在线| 国产www免费观看| 中文字幕日韩av资源站| 国产天堂在线播放| 天天做夜夜做人人爱精品 | 爱久久·www| 精品国产鲁一鲁一区二区张丽| 午夜免费一级片| 久久在线播放| 国产精品吊钟奶在线| 头脑特工队2在线播放| 亚洲国产wwwccc36天堂| 中文字幕剧情在线观看| 欧美电影免费观看高清| 国产精品爱啪在线线免费观看| 国产日韩精品在线看| 狠狠色狠狠色综合日日五| 妖精视频一区二区| 欧美国产91| 51国偷自产一区二区三区的来源 | 91九色国产ts另类人妖| 六九午夜精品视频| 一区二区三区久久精品| 日韩精品一区不卡| 久久久久久日产精品| 黄色三级视频在线| 久久日文中文字幕乱码| 国产区精品在线观看| 一广人看www在线观看免费视频| 欧美色区777第一页| 国产第一页精品| 久久精品国产99国产| 一本一本a久久| www.成人在线.com| 九九热精品视频在线播放| 一级aaaa毛片| 五月婷婷久久综合| 性久久久久久久久久 | 日日噜噜夜夜狠狠| 亚洲国产精品久久久久蝴蝶传媒| 91亚洲永久免费精品| 最新日本在线观看| 精品福利二区三区| 久久久久久在线观看| 久久久亚洲精品一区二区三区| 99sesese| 亚洲成人tv| 国产精品我不卡| 亚洲精品动漫| 日韩一级裸体免费视频| 国产福利资源在线| 色噜噜狠狠色综合中国| 在线观看天堂av| 国产精品自在在线| 欧美无砖专区免费| 国产精品美女久久久久久不卡| 国产精品久久久久久久久久尿| 久操视频在线免费播放| 亚洲成人久久电影| 国产精品51麻豆cm传媒| 《视频一区视频二区| 岛国精品一区二区三区| 久久最新视频| 91免费视频黄| 欧洲亚洲一区二区三区| 91久久嫩草影院一区二区| 2020日本在线视频中文字幕| 亚洲欧美三级在线| 午夜精品在线播放| 91国内精品野花午夜精品| 精品无码人妻一区二区三区| 久久亚洲二区三区| 成人黄色一级大片| 亚洲少妇一区| 超薄肉色丝袜足j调教99| 欧美日韩一区二区三区视频播放| 91久久大香伊蕉在人线| a欧美人片人妖| 久久影院在线观看| 美女欧美视频在线观看免费| 欧美一级日韩免费不卡| 天天干天天干天天| 洋洋成人永久网站入口| 四季av中文字幕| 99久久er热在这里只有精品15 | 怡红院成人在线| 久久免费国产视频| 黄色大片在线免费观看| 日韩av一卡二卡| 国产乱叫456在线| 欧美无人高清视频在线观看| 日本少妇裸体做爰| 亚洲香肠在线观看| 久久国产波多野结衣| 国产欧美一区二区三区网站| 少妇一级淫免费观看| 国产一区二区女| www.桃色.com| 久久激情五月激情| 毛葺葺老太做受视频| 国产亚洲毛片| 久久精品国产sm调教网站演员| 一本精品一区二区三区| 亚洲无玛一区| 欧美一区二区麻豆红桃视频| 欧美成人在线免费观看| 一道在线中文一区二区三区| 国产一区不卡在线观看| 亚洲免费一区三区| 91在线精品播放| 天天免费亚洲黑人免费| 国产精品国产自产拍高清av水多| 久久uomeier| 国产91精品青草社区| 成年网站在线视频网站| 91精品国产91久久久久福利| 成人女同在线观看| 性色av一区二区三区| 国产啊啊啊视频在线观看| 久久国产精品久久久久久久久久 | 国内精品久久久| h片在线观看视频免费| 性色av一区二区三区在线观看| 澳门成人av网| 国产精品444| 精品成人免费一区二区在线播放| 日本乱人伦a精品| 久久夜夜久久| 亚洲已满18点击进入在线看片| 天天综合91| 亚洲专区中文字幕| 国产精品成人国产| 97欧洲一区二区精品免费| 深夜福利一区二区三区| 国产精品v欧美精品v日韩精品| 超碰成人在线免费| 欧美一区二区视频在线| 日韩激情免费| 日韩福利视频| 91精品国产91久久久久久黑人| 8x8ⅹ国产精品一区二区二区| 欧美一区精品| 国产高清不卡无码视频| 模特精品在线| 一起操在线视频| 国产激情一区二区三区桃花岛亚洲| 91蝌蚪视频在线| 91老师片黄在线观看| 日本一卡二卡在线播放| 亚洲欧洲99久久| 国产精品theporn动漫| 在线观看91精品国产入口| 在线观看黄色网| 精品嫩草影院久久| 欧美成人免费| 色综合老司机第九色激情| 免费在线小视频| 国产精品视频男人的天堂| 2021年精品国产福利在线| 日韩电影在线播放| 欧美午夜不卡| 欧美一级片中文字幕| 极品美女销魂一区二区三区| 久久久精品人妻无码专区| 亚洲人一二三区| 五月婷婷亚洲综合| 3d成人h动漫网站入口| 亚洲av片在线观看| 久久亚洲私人国产精品va| 国产美女精品写真福利视频| 国产精品永久免费| 亚洲成aⅴ人片久久青草影院| 一区二区在线中文字幕电影视频| 亚洲精品字幕| 成人av毛片在线观看| 国产午夜亚洲精品午夜鲁丝片| 九九热最新地址| 色噜噜狠狠成人网p站| 国产福利第一页| 另类天堂视频在线观看| 欧美韩国亚洲| 国产一区二区三区av在线| 欧美日韩国产欧| 牛夜精品久久久久久久| www.66久久| 午夜写真片福利电影网| 在线播放中文一区| 国自产拍在线网站网址视频| 久久全国免费视频| 2019中文亚洲字幕| 在线视频福利一区| 丝瓜av网站精品一区二区| 色哟哟视频在线| 国产精品久久久久久户外露出| 久久久精品毛片| 日韩成人小视频| 金瓶狂野欧美性猛交xxxx| 亚洲一区中文字幕| 羞羞答答成人影院www| 少妇一级淫免费放| 国产日韩高清在线| 波多野结衣视频在线观看| 日韩精品在线观看网站| 日本在线观看高清完整版| 国产精品无av码在线观看| 国产精品99久久精品| 欧美精品无码一区二区三区| 91一区二区在线| 老熟妇仑乱一区二区av| 亚洲福利视频免费观看| 免费在线看污片| 69堂成人精品视频免费| 亚洲欧洲另类| 完美搭档在线观看| 香蕉影视欧美成人| 青青青手机在线视频观看| 欧美中文字幕在线观看| 亚洲欧美日本伦理| 国产午夜伦鲁鲁| 国产不卡在线一区| 久久久久久久久久久久国产| 精品剧情在线观看| 99在线视频影院| 国产高清一区视频| 亚洲欧洲午夜| 一级肉体全黄裸片| 5858s免费视频成人| sm国产在线调教视频| 91成人理论电影| 亚洲永久免费| 干b视频在线观看| 在线观看视频一区| 欧美激情午夜| 亚洲va欧美va在线观看| 午夜视频一区| 国产精品一区二区人妻喷水| 欧美性xxxxx| 在线免费看黄网站| 国产精品一区专区欧美日韩| 国产精品多人| 中文精品在线观看| 欧美三级在线播放| bl在线肉h视频大尺度| 久久免费一区| 日本欧美在线观看| 国产亚洲精品女人久久久久久| 亚洲国产成人精品久久| 在线精品亚洲欧美日韩国产| 亚洲国产一区二区在线| 国产麻豆精品theporn| 国产免费观看av| 中文字幕亚洲一区| 日韩三级一区| 大肉大捧一进一出好爽视频| 中文字幕精品一区| 国产夫妻在线观看| 国产日产久久高清欧美一区| 国产精品地址| 成人午夜剧场视频网站|