系列教程丨用 Docker 探索開源軟件 —— PostgreSQL(二)

系列教程丨用 Docker 探索開源軟件 —— PostgreSQL(二)

每週一、三、五,與您不見不散!


Docker 的一大優點是可以讓您快速使用它來試用應用程序,而無需直接在開發人員的計算機上安裝它。如果您不想在自己的計算機上安裝 Java 或 erlang 等運行時環境,那麼您就可以不安裝它們,因為容器封裝了所有依賴項,並在刪除時可以不留下任何痕跡。在上一篇文章《 》中,我們介紹了 Docker Volumes 是如何運行的,今天,我將帶來本篇文章的第二部分內容。


停止並重新啟動容器


讓我們驗證一下,如果我們停止並重新啟動容器,我們將不會丟失數據。

docker stop postgres1
docker start postgres1

與其再次連接到這個容器,不如從另一個連接的容器進行測試,使用與在 Redis 演示中看到的連接容器相同的技術。

docker run -it --rm --link postgres1:pg --name client1 postgres sh

啟動“psql”,但連接到另一個容器(-h),我們給它們命名為“pg”:

# psql -U postgres -h pg mydb

現在,通過這個“client1”容器,我們可以訪問存儲在“postgres1” 數據庫容器中的數據:

mydb=# SELECT * FROM people;
id | name
----+------
1 | Mark
(1 row)

現在,我們可以退出“psql”以及我們的 shell,這將刪除“client1”容器,因為我們使用了“—rm”標誌,以便在容器退出時自動刪除該容器。

mydb=# \q
# exit

檢查 volume


我們可以找到有關使用“docker volume inspect”創建的 volume 信息,包括我們本地磁盤上存儲該 volume 中數據的位置。下面是一些典型的輸出:

$ docker volume inspect postgres-data
[
{
"CreatedAt": "2018-09-03T19:50:23Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/postgres-data/_data",
"Name": "postgres-data",
"Options": null,
"Scope": "local"

}
]

如果我們查看 Docker 主機上的本地文件夾,我們就可以看到該 volume 中存儲的所有數據。

$ ls /var/lib/docker/volumes/postgres-data/_data/
PG_VERSION pg_multixact pg_tblspc
base pg_notify pg_twophase
global pg_replslot pg_wal
pg_commit_ts pg_serial pg_xact
pg_dynshmem pg_snapshots postgresql.auto.conf
pg_hba.conf pg_stat postgresql.conf
pg_ident.conf pg_stat_tmp postmaster.opts
pg_logical pg_subtrans postmaster.pid

顯然,Docker volume 不需要存儲在 Docker 主機上的本地磁盤中。在像 Azure 這樣的生產環境中,您很可能將 Azure 文件共享作為 volume 掛載。


丟棄容器,但保留數據


讓我們使用一個命令停止並刪除“postgres1”容器(-f強制它刪除正在運行的容器)。因為數據存儲在 volume 中,所以它仍然是安全的。

docker rm -f postgres1

將現有 volume 附加到新容器


現在讓我們啟動一個名為postgres2的全新容器,但是要附加包含我們現有數據庫的“postgres-data”volume:

docker run -d -p 5432:5432 -v postgres-data:/var/lib/postgresql/data --name postgres2 postgres

啟動後,讓我們在其中運行一個“psql”會話,並檢查數據庫、表和數據是否仍然存在且正確:

docker exec -it postgres2 sh
# psql -U postgres mydb
mydb=# SELECT * FROM people;
id | name
----+-------
1 | Mark
(1 row)

然後再次退出:

mydb=# \q
# exit

清理一切


現在,我們來清理一下。我們不僅要刪除“postgres2”容器,還要刪除“postgres-data”volume。所以,此時數據庫的內容也被刪除了。

docker rm -f postgres2
docker volume rm postgres-data

總 結


如您所件,Docker 不僅可以讓您輕鬆使用 PostgreSQL,還可以輕鬆配置 volume,從而可以獨立於容器的生命週期管理數據的生命週期。如果願意,我們還可以直接連接到5432端口上的這個 PostgreSQL 容器,並將其用於一些本地開發。

在下一篇系列文章中,我將向您展示如何在容器中運行 Elasticsearch,這將使我們有機會探索 docker-compose 的實際應用。


分享到:


相關文章: