2016-02-05 105 views
4

我是新來的碼頭工人。我仍然試圖把我的頭圍繞着這一切。我該如何使用Postgresql docker鏡像/容器?

我建立一個節點的應用程序(REST API),使用PostgreSQL來存儲我的數據。

我花了幾天的學習泊塢窗,但我不知道我是否做的事情,我應該的方式。

因此,這裏是我的問題:

  1. 我使用的是正式的Postgres泊塢窗9.5圖像爲基礎,以建立自己的(我Dockerfile只增加plpython在它的上面,並安裝一個定製的Python模塊用於plpython存儲過程中)。我建立了我的容器作爲suggedsted Postgres的圖像文檔:

    搬運工運行--name一些-的Postgres -e POSTGRES_PASSWORD = mysecretpassword Postgres的-d

    後,我停止容器再次使用上述命令我不能運行,因爲容器已經存在。所以我使用docker start而不是docker run來啓動它。這是做事情的正常方式嗎?我通常會第一次使用碼頭運行並且碼頭每隔一段時間啓動一次?

  2. 持久性:我創建了一個數據庫,並填充它的運行容器上。我使用pgadmin3進行連接。我可以停止並啓動容器,數據仍然存在,但我不確定這是爲什麼發生的。我可以在正式的Postgres圖像將卷創建(VOLUME的/ var/lib中/ PostgreSQL的/數據)的Dockerfile看到的,但我不知道這是持久性工作的原因。你能否簡單地解釋一下(或者指出一個解釋)這一切是如何運作的?

  3. 架構:從我讀,似乎對於這種應用程序最合適的架構,可運行3個獨立的容器中。一個用於數據庫,一個用於保存數據庫數據,另一個用於節點應用程序。這是做這件事的好方法嗎?如何使用數據容器改善事情? AFAIK我目前的設置工作正常,沒有一個。

  4. 還有什麼我要atention什麼?

感謝

編輯:增加了我的困惑,我只是跑一個新的容器從Debian官方照片(不Dockerfile,只是碼頭工人運行-i -t -d --name debtest的debian /箱/ bash)的。隨着容器在後臺運行,我使用docker attach debtest連接到它,然後進入apt-get安裝postgresql。一旦安裝,我運行(仍然在容器內)psql,並在默認的postgres數據庫中創建一個表,並用1條記錄填充它。然後我退出了外殼,並且由於外殼不再運行,容器自動停止。我使用docker start debtest啓動了容器,然後連接到它並最終再次運行psql。自第一次運行以來,我發現一切都持續存在。 Postgresql被安裝,我的表在那裏,而且我的插入記錄也在那裏。我真的很困惑,爲什麼我需要一個VOLUME來保存數據,因爲這個快速測試沒有使用一個,所有的apears都能正常工作。我在這裏錯過了什麼嗎?

再次感謝

回答

3

1.

搬運工運行--name一些-postgres的-e POSTGRES_PASSWORD = mysecretpassword -d postgres的

後我停止容器再次使用上述 命令我不能運行它,因爲該容器已經存在。

正確。因此,在開始新文件之前,您必須先刪除舊文件(--name some-postgres),然後才能刪除舊文件。 docker rm -f some-postgres

所以我把它用 搬運工開始,而不是搬運工運行啓動。這是做 事情的正常方法嗎?我一般會第一次使用碼頭運行,並且docker 每隔一段時間啓動一次?

不,這絕不是正常的碼頭工人。 Docker進程容器通常應該是ephemeral,它很容易被丟棄並重新啓動。

  • 持久性:......我可以停止和啓動 容器和數據持久化,雖然我不知道爲什麼還是 怎麼會發生這種情況。 ...

  • 那是因爲你正在重用同一個容器中。取出容器,數據不見了。

  • 架構:從我讀,似乎最合適 架構,這種應用程序將運行3個獨立的 容器。一個用於數據庫,一個用於保存數據庫,另一個用於節點應用程序。這是做這件事的好方法嗎? 如何使用數據容器改善事物? AFAIK我目前的設置是 工作好沒有一個。

  • 是的,這是由具有不同的關注單獨的容器去的好辦法。這在許多情況下非常方便,例如,當您需要升級postgres基本映像而不丟失數據時(特別是數據容器開始扮演角色的地方)。

    1. 我還有什麼要注意的嗎?

    當與泊塢窗基本熟悉,你可以看看Docker compose或類似工具,將幫助你運行的多容器應用程序更加容易。

    +0

    您認爲持久性容器是個好主意! –

    +0

    @RobertGrant取決於你的情況。在某些情況下,它可能已經足夠好了,有時候您可能希望擁有主機卷。有些設置完全禁止卷。 –

    +0

    這似乎是一個邊緣情況下,而不是在答案中沒有一個大的警告標誌應該寫的東西。 –

    3

    短而簡單:

    1. 你從官方的Postgres的圖像得到的是一個現成的Postgres去安裝一些噱頭,可以通過環境變量來配置一起。隨着docker run你創建一個容器。容器生命週期命令是docker start/stop/restart/rm是的,這是Docker的方式。
    2. 卷內的所有內容都會保留。每個容器可以有任意數量的卷。卷是在Dockerfile,父Dockerfile內或通過命令docker run ... -v /yourdirectoryA -v /yourdirectoryB ...定義的目錄。卷外的所有內容都會丟失docker rm。包括卷在內的所有內容都會丟失docker rm -v
    3. 顯示比解釋更容易。請參閱本自述文件,在Github上使用Docker命令,閱讀如何使用官方PostgreSQL鏡像用於Jira,並將NGINX添加到混合中:Jira with Docker PostgreSQL。另外一個數據容器是一個便宜的技巧,可以在不移動持久數據的情況下移除,重建和更新容器。
    4. 恭喜,您已經掌握了基本知識!繼續!嘗試docker-compose以更好地管理那些令人討厭的docker run ...-命令並能夠管理多容器和數據容器。

    注意:您需要一個阻塞線程,以保持一個容器中運行!此命令必須在Dockerfile中明確設置,請參閱CMD或在命令末尾給出。如果你的命令是非阻塞的,例如/bin/bash,那麼在執行該命令後,容器將總是立即停止。