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