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