docker volumes sql

使用docker-compose啟動服務時,初始化資料庫和資料(以Mysql為例)

李佶峯 Mark Lee 2020/02/17 16:00:49
18597

以往大家在使用docker-compose時,只要設定yml服務參數(如下設定),然後輸入docker-compose up容器內就會產生一個該映像檔的服務

version: "3"
services:
  db:
    image: mysql/mysql-server:5.7
    restart: always
    environment:
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: testdb
    ports:
      - 3306:3306

 

但是對於剛學習docker的人來說,為了測試docker其他功能與參數調整,會不斷的docker-compose updownupdownupdownupdown

由於只要docker-compose down後,docker會直接刪除container,此時想要再啟動docker-compose內的服務,就會一切回歸到最初的感動,抱歉,是回到最原始的模樣

為了使每次服務建構時,資料庫裡面就自動創建(或保存)好對應資料,有兩個方向可以著手研究

 

1.docker-compose down時,想辦法讓資料不要自動清除,沒錯,關鍵字就是volumes

我們可以設定docker-compose volumes使資料持久化,volumes 讓你處理資料共享與資料持久(persist)有關volumes更多的介紹

不過當服務越來越多,若是每個服務都掛出volumes,這時候若須備份以及轉移主機和快速部屬,要攜帶每個volumes就不太符合docker輕量容器化的目標了

 

2.docker-compose up時,設定自動執行sql檔案(本文目的)

docker hub搜尋mysql映像檔時,可以清楚看到DescriptionInitializing a fresh instance標題

由此說明可知,官方映像檔已經有定義出如何初始化資料庫的規格,我們只要實現他就好

 

 

著手進行步驟:

由於mysql image自己就有定義一個docker-entrypoint-initdb.d資料夾是在資料庫初始化就執行的資料夾,有兩個方法可以在初始化就掛載檔案進去

第一個方法是使用volumes掛載進去給docker-entrypoint-initdb.d資料夾需要執行的sqlsh檔案

第二個方法是自製images,用command line透過CP指令直接複製至images裡面的docker-entrypoint-initdb.d資料夾

以下兩種方法都會實作給各位參考

 

第一個方法

1.     首先先創建一個資料夾,暫定名稱為sqls,把我們需要初始化的sql檔案丟進去

 

2.     在同目錄底下,新增一個docker-compose.yml檔案,並輸入以下參數內容

 

version: "3"
services:
  db:
    image: mysql/mysql-server:5.7
    restart: always
    environment:
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
    ports:
      - 3306:3306
    volumes:
      - ./sqls:/docker-entrypoint-initdb.d

 

3.     此時再輸入docker-compose up,查看該服務的log就可以發現

這個映像檔就會自己幫我們啟動放在sqls資料夾裡面的.sql檔案,而當停止容器後再啟動會發現並不會再啟動一次,所以可以達到我們初始化資料庫的目標

 

第二個方法

1.      一樣先創建一個資料夾,暫定名稱為sqls,把我們需要初始化的sql檔案丟進去

 

2.     新增一個Dockerfile檔案,並輸入以下參數內容

FROM mysql/mysql-server:5.7
COPY ./sqls/init.sql /docker-entrypoint-initdb.d/init.sql

參數解釋:

  FROM (指定這個映像檔需要以哪一個映像檔為基底)

  COPY (複製本地端的檔案/目錄到映像檔的指定位置中)

 

3.     新增一個docker-compose.yml,並輸入以下參數內容,這裡需要把原本為Image的參數設定成build,選擇用我們剛剛自製的image

version: "3"
services:
  db:
    build: .
    restart: always
    environment:
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
    ports:
      - 3306:3306

 

此時檔案的目錄會呈現下列狀態

 

4.    輸入docker-compose up,查看該服務的log就可以發現

一樣有初始化我們複製給imagesql檔案,是不是很簡單呢?

 

 

結語: 使用docker可以讓服務很迅速的建構起來,不必再擔心換了一台電腦就需要重新安裝大大小小的軟體,而且輕量化的容量是使攜帶非常方便,再也不用備份大量的資料,對於開發者來說真的是一大福音

 

參考連結:

1.docker volumeshttps://docs.docker.com/compose/compose-file/#volume-configuration-reference

2.docker hub (mysql): https://hub.docker.com/_/mysql

3.docker file: https://docs.docker.com/engine/reference/builder/

李佶峯 Mark Lee
王麒 Chi Wang
2020/03/09 13:26:11

太強辣