Hi all, 來到第23天 昨天已經展示過如果要減少專案呼叫DB的次數,今天就來把專案的依賴( redis, DB) 整合一下,讓我們往後使用的時候直接一個指令執行即可。 要怎麼做呢,這邊就使用 docker-compose 來做處理。
Docker Compose 是一個用於定義和運行多容器 Docker 應用程序的工具。通過使用 Docker Compose,開發者可以在單個文件中定義需要的application, network, volume等設定,並使用簡單的命令來啟動和管理所有這些服務。
由於我們使用的是 docker-compose,我是希望讓服務間的網路都在docker 內部做打通,而不是連接到外面主機再透過 docker port mapping的方式連回去 (即網路隔離性)。
因此我們需要一個小工具,那就是 docker network。稍微解釋下什麼是 docker network:
Docker Network 是 Docker 提供的一組功能,用於在不同的容器之間建立通訊,允許它們互相發送和接收數據。Docker Network 使得在容器化應用中,各個服務之間的通訊更加安全和靈活。透過 Docker Network,開發者可以輕鬆定義容器之間的網絡拓撲結構,實現微服務架構的應用。
列一下驗收條件
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: my_dotnet_app
ports:
- "8080:80"
environment:
- ASPNETCORE_ENVIRONMENT=Development
- DB_SERVER=mysql
- DB_NAME=Blockchain
- DB_USER=root
- DB_PASS=<!Your-Strong-Password>
- REDIS_SERVER=redis
depends_on:
- mysql
- redis
networks:
- app-network
redis:
image: redis:latest
container_name: redis
ports:
- "6379:6379"
networks:
- app-network
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 1234qwer
ports:
- "3306:3306"
volumes:
- ./DbScheme/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- app-network
networks:
app-network:
driver: bridge
由上面的 yaml 檔,可以得知我在文件中定義了 docker network 名字叫做 app-network
,並在各個服務指定用這個 network。
另外比較特別的就是我在 mysql 服務掛載了一個 DbScheme
資料夾底下的 init.sql
到容器內的 /docker-entrypoint-initdb.d/init.sql
,這個其實是MySQL 官方 Docker 映像有一個特殊的機制:在容器啟動時,它會自動執行 /docker-entrypoint-initdb.d/
目錄下的所有 .sql
、.sh
、或 .sql.gz
文件,至於 init.sql
的內容如下:
create database Blockchain;
use Blockchain;
CREATE TABLE Blocks (
Id INT PRIMARY KEY AUTO_INCREMENT,
Data TEXT NOT NULL,
Hash VARCHAR(64) NOT NULL,
PreviousHash VARCHAR(64) NOT NULL,
TimeStamp DATETIME NOT NULL,
Nonce INT NOT NULL,
ChameleonSignature NVARCHAR(256)
);
目前yaml 跟 sql 都準備就緒了,就可以讓服務們跑起來惹,指令如下:
docker-compose up -d --build
接著就可以透過 docker ps
就可以看到三個服務都在運行囉
今天把專案跟一些依賴的服務都打包成透過一個 yaml檔就可以帶著跑惹~~
結語: 明天星期一嗚嗚嗚