iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0

Hi all, 來到第23天 昨天已經展示過如果要減少專案呼叫DB的次數,今天就來把專案的依賴( redis, DB) 整合一下,讓我們往後使用的時候直接一個指令執行即可。 要怎麼做呢,這邊就使用 docker-compose 來做處理。

Docker-Compose

Docker Compose 是一個用於定義和運行多容器 Docker 應用程序的工具。通過使用 Docker Compose,開發者可以在單個文件中定義需要的application, network, volume等設定,並使用簡單的命令來啟動和管理所有這些服務。

Docker Network

由於我們使用的是 docker-compose,我是希望讓服務間的網路都在docker 內部做打通,而不是連接到外面主機再透過 docker port mapping的方式連回去 (即網路隔離性)。

因此我們需要一個小工具,那就是 docker network。稍微解釋下什麼是 docker network:

Docker Network 是 Docker 提供的一組功能,用於在不同的容器之間建立通訊,允許它們互相發送和接收數據。Docker Network 使得在容器化應用中,各個服務之間的通訊更加安全和靈活。透過 Docker Network,開發者可以輕鬆定義容器之間的網絡拓撲結構,實現微服務架構的應用。

弄髒手時間

列一下驗收條件

  • Application (此次的區塊鏈專案
  • MySql
    • 需要讓服務起來的時候自動執行 init.sql
  • Redis
  • 透過 docker-network 讓三個服務網路是互通的

Docker-compose.yaml

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 的內容如下:

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)
);

執行 docker-compose

目前yaml 跟 sql 都準備就緒了,就可以讓服務們跑起來惹,指令如下:

docker-compose up -d --build

接著就可以透過 docker ps 就可以看到三個服務都在運行囉

Conclusion

今天把專案跟一些依賴的服務都打包成透過一個 yaml檔就可以帶著跑惹~~

結語: 明天星期一嗚嗚嗚


上一篇
Day 22 Redis- 小優化
下一篇
Day24 Redis SDK
系列文
Side-Project:: 為自己打造個可編輯的區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言