基于Docker備份PostgreSQL 應(yīng)用示例
免責(zé)聲明:當(dāng)我第一次寫這篇文章的時候,我曾因為內(nèi)容中沒有任何新的東西而丟棄它。的確,在這個博客上沒有新的或復(fù)雜的,你將學(xué)習(xí)通過閱讀它的唯一的事就是,您可以將使用pg_dump備份PostgreSQL服務(wù)器的過程運行在一個容器中。
有一件事觸動了我。當(dāng)我解釋和回答Docker初學(xué)者提出的問題時,我發(fā)現(xiàn)其中一個很普遍,那就是當(dāng)老的解決方案仍然可以解決現(xiàn)有問題時,大家又在尋找新的解決方案。
工程師有一個癖好,就是忘記他們所知道的,然后他們可以不用做太多改變,而在一個新的范例中很大程度上運用這些已經(jīng)掌握的知識。所以最終,這篇博客有三個目的:
- 給你一個例子使用Docker執(zhí)行使用
- 提醒你,你在docker到來之前所獲得的知識仍然是有用的
- 幫助你構(gòu)建將這個知識放到容器中的思維
真的,這篇文章可以被稱為備份RDBMS和Docker,但我需要一些具體的例子。因為這篇文章是關(guān)于PostgreSQL觸發(fā)的問題,我決定就這樣做。
這里的情況。有一個PostgreSQL服務(wù)器運行在一個Docker容器,和你非常滿意的這兩個很棒的軟件的結(jié)合。但是你是一個聰明的人,你知道,遲早,您將需要備份的數(shù)據(jù)庫。也許硬件將會失敗,或者新的實習(xí)生將會失敗,你永遠(yuǎn)不會知道的。所以你決定定期備份數(shù)據(jù)庫。
但是如何做到這一點。PostgreSQL運行在Docker中,并沒有明顯的方式訪問數(shù)據(jù)。
問題可以歸結(jié)為對您的PostgreSQL實例運行pg_dump,和你有三種方式實現(xiàn)這一目標(biāo)。
根據(jù)您的版本的Docker,使用nsenter或Docker執(zhí)行以獲得shell在容器內(nèi),并將您的數(shù)據(jù)(使用pg_dump)轉(zhuǎn)儲到一個共享卷(postgres容器運行PostgreSQL的名稱):
- docker exec postgres pg_dump -h db -f /shared/backup.sql
但我們可以做的更好,對嗎?理想的流程將涉及能夠連接到PostgreSQL無需一個shell的容器。有兩種方法可以做到這一點。
首先,用容器的一切方法。你建立一個pg_dump容器(這是一個容器,pg_dump作為它的入口點),并將其鏈接到PostgreSQL容器在運行時。這里有一個 pg_dump容器的Dockerfile
- FROM debian:wheezy
- RUN apt-get update -y && \
- apt-get install -y postgresql-client && \
- apt-get clean -y
- ENTRYPOINT ["/usr/bin/pg_dump"]
用 docker build 構(gòu)建
- $ docker build -t pg_dump - < Dockerfile
注意:建立一個特定的容器pg_dump不是強制性的。Damien如上所述的評論,你重新使用 包含 pg_dump
在內(nèi)的PostgreSQL鏡像一點兒問題都沒有。我們在這里建立一個容器是因為要練習(xí)。
運行:
- $ docker run -it --link postgres:db pg_dump -h db
在你的PostgreSQL postgres的容器中運行。