使用docker部署PostgreSQL數據庫

關於Docker的基本原理

原理上, 深刻淺出Docker 一文講的語言會更科學,我只撿不必定準確但直觀而符合表面理解的一些講一下。linux

Docker提供了基於操做系統級和應用級虛擬化的應用部署解決方案。它的出現讓在服務器上部署應用免去了操做系統,支持系統等一系列的搭建,而把它們簡化爲鏡像,容器,實現快速部署。git

Docker將應用所須要的底層系統支持,操做系統支持,數據庫支持,應用自己和應用的數據分離開來,能夠從任意層級上在一個擁有docker技術的電腦上對應用進行部署。每一層被抽象成了鏡像(image),而鏡像跑在服務器上便成了容器(container),至關於虛擬機。跑起一個應用級別的容器,會自動獲取它所須要的向下級別的鏡像。這些均可以經過雲端大量現成的資源和幾行腳本命令實現。github

Docker解決了服務器應用快速部署的問題。僅須要一個dockerfile或是一兩行命令,即可以將一個應用部署到服務器上並馬上投入使用。存在的問題也有一些,好比數據層遷移的命令蹩腳,容器啓動後不能從新端口綁定,目前只能跑在linux上等。還有許多有待我這個剛入手沒多久的小白還要探索的問題。sql

安裝docker

在正題以前,你須要:docker

  • 安裝docker數據庫

  • 肯定docker鏡像服務器已經跑在你的服務器上windows

兩點實際上是一點,可是二者各有側重。筆者在mac上安裝docker時,下載了官網提供的docker toolbox。安裝了docker服務器自己,快速啓動命令以及Virtualbox來管理虛擬機。在安裝Virtualbox的時候安裝程序掛了。至今不知爲什麼。解決方案是本身裝一個服務器

brew install Caskroom/cask/virtualbox

第二點,確保docker鏡像服務器跑起來。在mac下須要運行quickstart,你會注意到它其實就是啓動一個腳本,讓linux虛擬機的服務器能夠經過虛擬網絡被mac訪問到。若是直接打開命令行,會提示網絡

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

在linux上,docker指令必須sudo。不然也會提示找不到。app

在mac上或者windows上尤爲注意一點。docker服務器跑在linux虛擬機上。因此後續牽扯到目錄掛載的時候最好能夠直接進入虛擬機寫指令。

如何快速部署數據庫

在docker上快速部署Postgresql數據庫,其實能夠直接參考https://hub.docker.com/_/postgres/,這裏提供了docker-postgres的官方解決方案。
其實核心只有一句話。

docker run --name yourappname -e POSTGRES_PASSWORD=mysecretpassword -e POSTGRES_USER=xxx -d -p xxxx:5432 postgres

其中的-p 的意思是端口綁定。這是docker裏很重要的概念。docker能夠理解爲虛擬機。你須要將真機的端口和虛擬機端口進行綁定,這樣能夠經過訪問docker鏡像服務器在真機上的端口,訪問到psql數據庫端口5432,進入docker鏡像之中。若是不指定-p,外界是沒法訪問docker內部,沒法對數據庫增刪改查。

這時服務器會新建一個卷目錄用來存放真正的數據庫內容。換句話說,這個卷是隻讀的,經過容器備份提交什麼的根本沒法保留數據庫數據,甚至是表的結構。這個時候就須要介紹一個docker的新概念:數據卷。相似於linux掛載的概念。

具體能夠參考https://github.com/widuu/chinese_docker/blob/master/userguide/dockervolumes.md

這裏只說怎麼快速部署。

第一步:在任意機子上創建一個鏡像,指定數據卷位置,並將其掛載到虛擬機上

docker run --name yourappname -e POSTGRES_PASSWORD=xxx -e POSTGRES_USER=xxx\
    -v ./data:/var/lib/postgresql/data/pgdata -d -p xxxx:5432 postgres

多的這一句

-v ./data:/var/lib/postgresql/data/pgdata

意思是:講本機當前目錄下新建一個data目錄,與虛擬機裏的數據庫目錄對應起來。注意這裏必須是linux下的目錄。若是在mac或者windows上操做務必注意。若是你把mac/windows目錄映射到了「虛擬機的虛擬機」裏,會由於訪問權限不足而讓docker崩掉。

第二步:按照你指定的端口訪問數據庫,作數據初始化。包括建表和插入初始數據。

第三步:備份數據卷。也就是上面的./data目錄。

第四步,將這個數據卷放到你的服務器上

第五步和第一步同樣。可是此時,你的數據卷裏面已經有以前保存的內容了。

讓我來通俗地闡釋一下這個過程。其實至關於你在家裏電腦插個空U盤,放點歌在裏面,而後帶到單位去就能夠聽了。家裏的電腦和單位的電腦都是WindowsXP的系統,都裝了什麼音樂播放器,可是歌曲必定是放在優盤裏,由於電腦是隻讀的。

相似。docker也常常被設計成只讀的,做爲應用程序的初始狀態。其實這麼複製挺麻煩的,還須要新建一個數據卷。向上面那個例子裏,「家裏的電腦」其實沒用。教程裏甚至提供了即時建立並刪除容器的命令只爲保存一個數據卷和容器名稱的對應關係,往後掛載方便。

docker的最佳實踐

dockerfile最佳實踐

相關文章
相關標籤/搜索