2017-08-28 25 views
0

我有一個小型的web應用程序在Docker容器中運行。它使用基於官方的「mariadb」圖像在同一個盒子上的另一個容器中運行的mariadb數據庫。如何正確地將mariadb數據庫從容器移動到主機

當我第一次設置這些容器時,我使用「內部」數據庫啓動了mariadb容器。我給了「/ var/lib/mysql」一個卷名,但我沒有將它映射到主機上的一個目錄(「-v vol-name:/ var/lib/mysql」)。其實,我甚至不知道爲什麼我給它一個卷名。我在幾個月前就設置好了,我不確定爲什麼我會這樣做。

在任何情況下,我已經斷定有一個數據庫內部的容器是不是一個好主意。我決定真的需要將實際的數據庫存儲在主機上,並使用卷映射來引用它。我知道如何做到這一點,如果我從頭開始設置它,但現在應用程序正在運行,我需要將數據庫移動到主機並重新啓動容器以指向該容器。我不確定所有適當的步驟來實現這一點。

此外,我還需要設置此應用程序的第二個實例,使用基於相同圖像的容器。第二個數據庫也將存儲在主機上,在另一個目錄旁邊。我可以用第一個備份文件初始化第二個數據庫,但我可能會在第二個實例中手動清空大部分表。

我沒有使用容器內的mysqldump轉儲數據庫,然後我將該備份文件複製到主機。

我知道如何在「docker run」中設置卷映射,以將容器中的/ var/lib/mysql映射到主機上的某個位置。

此時,我不確定如何處理此備份文件,以便我可以使用修改的卷映射重新啓動容器。我知道我可以運行「mysql dbname < backup.sql」,但我不確定這會帶來什麼後果。

回答

1

容器運行時,運行docker cp-a CONTAINER:/var/lib/mysql /local/path/to/folder將MariaDB數據庫從容器複製到本地計算機。將「CONTAINER」替換爲MariaDB容器的名稱或ID。

完成此操作後,您可以停止該容器,並重新啓動將其綁定到容器的/var/lib/mysql路徑的/local/path/to/folder

如果您使用的docker的舊版本不支持-a--archive標誌,則可以複製沒有該標誌的文件,但需要確保主機上的文件夾具有正確的所有權:文件夾的UID和GID必須與Docker容器中文件夾的UID和GID相匹配。

注:如果您使用SELinux的,則可能需要設置適當的權限,以及作爲documentation爲MariaDB的圖像狀態:

需要注意的是與SELinux的主機系統的用戶啓用可能會看到這個問題。目前的解決辦法是分配相關的SELinux策略類型到新的數據目錄,以便容器將被允許訪問:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir

+0

當我運行在此基礎上我的命令,我得到「未知速記旗:'a'in -a「。我檢查了「docker-cp」的手冊頁,它說:「cp命令的行爲與Unix cp -a命令的行爲相同,即在可能的情況下保留權限,遞歸複製該目錄。」沒有提及「docker cp」的「-a」選項。 –

+0

嘗試完整的形式('--archive')。該文檔指出:「複製到本地機器的文件是用調用'docker cp'命令的用戶的UID:GID創建的,但是,如果指定'-a'選項,則'docker cp'將所有權設置爲來源的用戶和主要羣組「。當您稍後將本地文件夾映射回來時,這將是必需的。 – rickdenhaan

+0

「未知標誌: - 存檔」。請注意,這是「Docker版本1.12.6,版本96d83a5/1.12.6」。 –

相關問題