Docker筆記 - 進入Container,建立並操作 PostgreSQL Container

Albert Hg
alberthg-docker-notes
13 min readJan 27, 2021

上一篇─基礎教學的部分我們提到了 image 與 container 的基礎用法,現在將要探討的是如何進入一個正在執行的 container 中並且操作他。

這篇文章一開始會先說明 docker exec 怎麼使用,接著會建立 PostgreSQL 的 Container 並使用 exec 操作,最後會示範如何在 PostgreSQL Container 中建立使用者以及資料庫。

文章架構

  • 1. 進入 container
    - exec options 說明
    - 啟動可操作的 bash 終端機
    - 操作 container 的 command
  • 2. 建立一個可連線的 PostgreSQL container
    - 建立 container,使用 pull + create + start
    - 建立 container,使用 run
    - 使用 exec 操作 PostgreSQL
  • 3. 建立使用者 與 新增資料庫
    - 透過 docker exec 建立使用者 與 新增資料庫
    - 透過 container 的 bash 建立使用者 與 新增資料庫
    - 透過 PostgreSQL 的 CLI 命令列 建立使用者 與 新增資料庫

1. 進入 container

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

這裡的 exec 代表的意思是「execute」,也就是對指定的 container 執行命令的意思。

- exec options 說明

[OPTIONS] 的部分,能使用的選項如下:

-d, --detach       Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching
a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format:<name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container

比較常使用到的是 -i 以及 -t。

  • -i:讓容器的 STDIN 保持開啟的狀態,這樣才可以進行輸入。
  • -t:分配一個虛擬終端 (pseudo-TTY) 並綁定到容器的 STDIN 上,這樣才可以執行所輸入的內容。

這兩個選項不用每次都寫成 docker exec -i -t ,你可以簡化他,像是:

$ docker exec -it CONTAINER COMMAND [ARG...]

- 啟動可操作的 bash 終端機

啟動一個可以操作的 bash 終端機非常簡單,只需要在尾端加上 bash 即可:

$ docker exec -it CONTAINER bash

例如:

# 建立一個名字叫做my-httpd的httpd的container在背景執行
$ docker run -d --name my-httpd httpd
# 啟動可操作的bash終端機
$ docker exec -it my-httpd bash

如此一來就可以透過終端機來操作這個 container 底下的內容(資料)了。另外,如果要離開 container 的 bash,只要輸入「exit」即可。

- 操作 container 的 command

剛剛 bash 的例子,其實就是在 docker exec 指令中,在 COMMAND的位置上使用了 bash。

除了使用 bash 外,也可以依照使用 container 的不同,使用對應的 COMMAND 。例如有一個 PostgreSQL 的 container,那麼就能夠使用 psql 命令,這個部分我們在後續會有範例演示。

2. 建立一個可連線的 PostgreSQL container

這裡將會示範如何用 docker 建立一個可以連線的 PostgreSQL container。

- 建立 container,使用 pull + create + start

# 先 pull image
$ docker pull postgres
# 建立 container,設定 port 號,設定 postgres 最高權限的登入密碼
$ docker create --name my-postgres -p 8080:5432 -e POSTGRES_PASSWORD=admin postgres
# 執行 container
$ docker start my-postgres

- 建立 container,使用 run

如果不想要分這麼步驟執行,也可以直接使用 docker run:

$ docker run -d --name my-postgres -p 8080:5432 -e POSTGRES_PASSWORD=admin postgres

- 使用 exec 操作 PostgreSQL

接著來看看 docker exec 的幾個使用範例:

  • 查看 psql 的說明
$ docker exec my-postgres psql --help
  • 查看所安裝的 PostgreSQL 版本
$ docker exec my-postgres psql -V
  • 查看當前存在的 Database Name
    這裡會需要使用 psql 的 -U 參數來指定建立連線的使用者
$ docker exec my-postgres psql -U postgres -l
  • 進入 PostgreSQL 的 CLI 命令列介面
    這裡會使用 exec 的 -i 與 -t 參數,讓終端機保持開啟。當進入 PostgreSQL 後若想離開,則可輸入 「\q」即可。
$ docker exec -it my-postgres psql -U postgres

更多關於 psql 的使用方法可以參考官方網站的說明:

3. 建立使用者 與 新增資料庫

如果要建立其他可連線的使用者以及其他新的資料庫有幾種不同的方法:

  • 透過 docker exec 完成
  • 透過進入 container 的 bash 完成
  • 透過進入 PostgreSQL 的 CLI 命令列完成

- 透過 docker exec 建立使用者 與 新增資料庫

這個方式最簡單也最直接,可以透過 exec 執行 psql 的 -c 來對資料庫執行 command。

建立使用者,其中的 <user-name> <password>是可以自行修改的:

$ docker exec -it my-postgres psql -U postgres -c "create role <user-name> with login password '<password>';"

建立資料庫,其中的 <database-name> <user-name>是可以自行修改的:

$ docker exec -it my-postgres psql -U postgres -c "create database <database-name> owner <user-name>"

檢查資料庫列表:

$ docker exec -it my-postgres psql -U postgres -c "\l"

你會發現在 -c 的參數中,都是常見的那些 SQL Command。更多關於 PostgreSQL 的 SQL Command 可以參考這裡:

- 透過 container 的 bash 建立使用者 與 新增資料庫

這個方法則是進入 container 的 bash,並且找到 PostgreSQL 的路徑,透過相關的執行檔進行資料庫的操作。

首先我們要進入container 的 bash 終端機,這裡要記得使用 exec 的 -i -t 參數,以保持終端機的開啟狀態:

$ docker exec -it my-postgres bash

接著進入到 PostgreSQL 的路徑:

root@74eae223a989:/# cd /usr/lib/postgresql/13/bin/
root@74eae223a989:/usr/lib/postgresql/13/bin# ls -l
total 11464
-rwxr-xr-x 1 root root 72360 Nov 10 12:45 clusterdb
-rwxr-xr-x 1 root root 84712 Nov 10 12:45 createdb
-rwxr-xr-x 1 root root 76808 Nov 10 12:45 createuser
-rwxr-xr-x 1 root root 64104 Nov 10 12:45 dropdb
-rwxr-xr-x 1 root root 64040 Nov 10 12:45 dropuser
...
-rwxr-xr-x 1 root root 712136 Nov 10 12:45 psql
...

在這個路徑底下,可以看到有兩個執行檔,一個是 createuser,另一個是 createdb。

用 createuser 執行檔建立使用者,其中的 <user-name> <password>是可以自行修改的:

root@...postgresql/13/bin# createuser -U postgres -P <user-name>Enter password for new role: <password>
Enter it again: <password>

用 createdb 執行檔建立資料庫,,其中的 <database-name> <user-name>是可以自行修改的:

root@...postgresql/13/bin# createdb -U postgres -O <user-name> <database-name>

最後也可以透過 psql 執行檔,查看資料庫列表,以檢查是否有將資料庫順利加入:

root@...postgresql/13/bin# psql -l

結束操作後如果要離開 container 的 bash,則輸入「exit」即可。

更多關於 PostgreSQL 的 執行檔使用方式可以參考這裡:

- 透過 PostgreSQL 的 CLI 命令列 建立使用者 與 新增資料庫

這個方法則是透過執行 psql 來進入 PostgreSQL 的命令列,與服務進行連線。

首先我們要進入 PostgreSQL 的 CLI 命令列,這裡要記得使用 exec 的 -i -t 參數,以保持終端機的開啟狀態:

$ docker exec -it my-postgres psql -U postgrespsql (13.1 (Debian 13.1-1.pgdg100+1))
Type "help" for help.
postgres=#

接著就是在 PostgreSQL 中,對資料庫進行常見的操作方式了。

建立使用者,其中的 <user-name> <password>是可以自行修改的:

postgres=# create role <user-name> with login password '<password>';

建立資料庫,其中的 <database-name> <user-name>是可以自行修改的:

postgres=# create database <database-name> owner <user-name>;

檢查資料庫列表:

postgres=# \l

結束操作後可以直接輸入 「\q」即可。

更多關於基本的 PostgreSQL command 操作可以參考這裡:

文末

這篇筆記主要紀錄了如何操作 Container 的多種方式,並以 PostgreSQL 為例,用不同的方式新增了使用者與建立了資料庫。如此一來,你就可以方便的為你的服務建立資料庫的環境以方便進行測試。

當 Container 建立好後,就只能依照當初所設定的 Config 執行 Container,可是當如果其中的設定想要更動的時候,目前最簡單的方式都是先移除 Container 後,再重新建立一個。但我們不可能每次都這樣做,因此接下來的下一篇文章,將會討論如何修改已經建立好的 Container 的 Config。

前往

上一篇

下一篇

其他參考連結

--

--

Albert Hg
alberthg-docker-notes

I am a programmer but love other things. I am a nobody but keep myself going. I am a person who wishes to reach the heaven but lost the wings.