在現(xiàn)代的軟件開發(fā)過程中,Docker已經(jīng)成為了一個(gè)不可或缺的工具。作為一個(gè)容器平臺(tái),Docker能夠方便地將應(yīng)用程序和它們的依賴打包在一起,從而實(shí)現(xiàn)了部署的快速、簡單和可靠。在Docker中,一個(gè)堆棧(stack)是指一組相互關(guān)聯(lián)的服務(wù),它們可以一起組合成一個(gè)完整的應(yīng)用程序。在這篇文章中,我們將簡單介紹一些Docker堆棧代碼的基本知識(shí)。
version: "3.9" services: web: # 指定Docker鏡像 image: nginx:latest # 申明服務(wù)所需的網(wǎng)絡(luò) networks: - app_net # 申明服務(wù)需要的卷 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # 申明服務(wù)需要的環(huán)境變量 environment: - APP_ENV=production # 申明服務(wù)所需的端口 ports: - "80:80" db: image: mysql:8 networks: - app_net volumes: - ./db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=secret networks: app_net: driver: bridge
在這個(gè)例子中,我們定義了一個(gè)包含兩個(gè)服務(wù)的堆棧。第一個(gè)服務(wù)是Nginx,它是一個(gè)經(jīng)典的Web服務(wù)器。我們使用了官方的Nginx Docker鏡像,并申明了它需要的網(wǎng)絡(luò)、卷、環(huán)境變量和端口。其中,申明網(wǎng)絡(luò)的方式是在堆棧中定義一個(gè)networks節(jié)點(diǎn),然后為它申明一個(gè)driver。這個(gè)網(wǎng)絡(luò)可以使得多個(gè)服務(wù)之間能夠互相通信,同時(shí)它還可以被其他堆棧所使用。另外,我們在Nginx服務(wù)中用到了一個(gè)卷,它可以將我們本地的nginx.conf文件掛載到容器中,從而讓我們可以在不停止容器的情況下更新Nginx的配置。最后,我們將Nginx服務(wù)的80端口暴露給了主機(jī)。
第二個(gè)服務(wù)是Mysql,它是一個(gè)關(guān)系型數(shù)據(jù)庫。同樣地,我們使用了官方的Mysql Docker鏡像。在這個(gè)服務(wù)中,我們使用了一個(gè)卷,它能夠?qū)⑽覀儽镜氐膁b_data目錄掛載到容器中,從而讓我們可以將數(shù)據(jù)庫的數(shù)據(jù)保存在本地磁盤上。此外,我們申明了一個(gè)MYSQL_ROOT_PASSWORD環(huán)境變量,它是用于設(shè)置Mysql的root賬戶的密碼。
最后,在堆棧的頂層,我們定義了一個(gè)networks節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)能夠?qū)⑺蟹?wù)用到的網(wǎng)絡(luò)連接起來,從而形成一個(gè)完整的堆棧。我們定義了一個(gè)bridge驅(qū)動(dòng),它是Docker默認(rèn)的網(wǎng)絡(luò)驅(qū)動(dòng)。這個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)能夠讓多個(gè)服務(wù)在同一個(gè)網(wǎng)絡(luò)空間中運(yùn)行,并且它支持跨主機(jī)的通信。