Skip to content

Commit 209a1e2

Browse files
author
xiongcc
committed
添加第58章:How to use Docker to run Postgres
1 parent 75de717 commit 209a1e2

File tree

1 file changed

+185
-0
lines changed

1 file changed

+185
-0
lines changed

How to use Docker to run Postgres.md

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
# How to use Docker to run Postgres
2+
3+
> 我每天都会发布一篇新的 PostgreSQL "howto" 文章。加入我的旅程吧 — 订阅、提供反馈、分享!
4+
5+
本指南适用于那些使用或需要使用 Postgres,但对 Docker 不熟悉的用户。
6+
7+
在容器中运行 Docker 进行开发和测试可以帮助你在多个环境之间对齐库、扩展和软件版本集。
8+
9+
## Docker安装 – macOS
10+
11+
使用 [Homebrew](https://brew.sh/) 安装:
12+
13+
```bash
14+
brew install docker docker-compose
15+
```
16+
17+
## Docker安装 – Ubuntu
18+
19+
```bash
20+
sudo apt-get update
21+
sudo apt-get install -y \
22+
apt-transport-https \
23+
ca-certificates \
24+
curl \
25+
gnupg-agent \
26+
software-properties-common
27+
28+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
29+
30+
sudo add-apt-repository -y \
31+
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
32+
33+
sudo apt-get update && sudo apt-get install -y \
34+
docker-ce \
35+
docker-ce-cli \
36+
containerd.io \
37+
docker-compose-plugin
38+
```
39+
40+
避免使用 `sudo` 运行 `docker` 命令:
41+
42+
```bash
43+
sudo groupadd docker
44+
sudo usermod -aG docker $USER
45+
newgrp docker
46+
```
47+
48+
## 在带有持久化PGDATA的容器中运行Postgres
49+
50+
假设我们希望数据目录 (`PGDATA`) 位于 `~/pgdata`,并将容器命名为 `pg16`
51+
52+
```bash
53+
sudo docker run \
54+
--detach \
55+
--name pg16 \
56+
-e POSTGRES_PASSWORD=secret \
57+
-v ~/pgdata:/var/lib/postgresql/data \
58+
--shm-size=128m \
59+
postgres:16
60+
```
61+
62+
## 检查日志
63+
64+
查看过去 5 分钟的日志 (带有时间戳) 并观察新的日志条目:
65+
66+
```bash
67+
docker logs --since 5m -tf pg16
68+
```
69+
70+
## 使用psql连接
71+
72+
创建表:
73+
74+
```bash
75+
❯ docker exec -it pg16 psql -U postgres -c 'create table t()'
76+
CREATE TABLE
77+
78+
❯ docker exec -it pg16 psql -U postgres -c '\d t'
79+
Table "public.t"
80+
Column | Type | Collation | Nullable | Default
81+
--------+------+-----------+----------+---------
82+
```
83+
84+
交互式 psql 连接:
85+
86+
```bash
87+
docker exec -it pg16 psql -U postgres
88+
```
89+
90+
## 从外部应用程序连接
91+
92+
要从主机所在机器连接应用程序,我们需要映射端口。为此,我们将停止并删除现有容器,并创建一个新容器,并创建一个具有适当端口映射的新容器 — 注意 `PGDATA` 仍然存在 (我们创建的表就在那里):
93+
94+
```bash
95+
❯ docker stop pg16
96+
pg16
97+
98+
❯ docker rm pg16
99+
pg16
100+
101+
❯ docker run \
102+
--detach \
103+
--name pg16 \
104+
-e POSTGRES_PASSWORD=secret \
105+
-v ~/pgdata:/var/lib/postgresql/data \
106+
--shm-size=128m \
107+
-p 127.0.0.1:15432:5432 \
108+
postgres:16
109+
8b5370107e1be7d3fd01a3180999a253c53610ca9ab764125b1512f65e83b927
110+
111+
❯ PGPASSWORD=secret psql -hlocalhost -p15432 -U postgres -c '\d t'
112+
Timing is on.
113+
Table "public.t"
114+
Column | Type | Collation | Nullable | Default
115+
--------+------+-----------+----------+---------
116+
```
117+
118+
## 包含额外扩展的自定义镜像
119+
120+
例如,我们可以创建一个基于原始镜像的自定义镜像,包含 `plpython3u` 扩展 (继续使用相同的 `PGDATA`):
121+
122+
```bash
123+
docker stop pg16
124+
docker rm pg16
125+
126+
echo "FROM postgres:16
127+
RUN apt update
128+
RUN apt install -y postgresql-plpython3-16" \
129+
> postgres_plpython3u.Dockerfile
130+
131+
sudo docker build \
132+
-t postgres-plpython3u:16 \
133+
-f postgres_plpython3u.Dockerfile \
134+
.
135+
136+
docker run \
137+
--detach \
138+
--name pg16 \
139+
-e POSTGRES_PASSWORD=secret \
140+
-v ~/pgdata:/var/lib/postgresql/data \
141+
--shm-size=128m \
142+
postgres-plpython3u:16
143+
144+
docker exec -it pg16 \
145+
psql -U postgres -c 'create extension plpython3u'
146+
```
147+
148+
## 共享内存
149+
150+
如果你看到如下错误:
151+
152+
```bash
153+
FATAL: could not resize shared memory segment "/PostgreSQL.12345" to 1048576 bytes: No space left on device1
154+
```
155+
156+
`docker run` 命令中增加 `--shm-size` 值。
157+
158+
## 如何升级Postgres并保留数据
159+
160+
1. 原地升级:
161+
- 传统的 Postgres Docker 镜像仅包含一个主版本的二进制文件,因此无法执行 `pg_upgrade`,除非扩展这些镜像。
162+
- 另一种选择是使用包含多个二进制文件的镜像,例如 [Spilo by Zalando](https://github.com/zalando/spilo).
163+
164+
2. 简单的转储/恢复 (这里我展示了在没有不兼容的情况下进行降级;升级可以以相同的方式完成):
165+
166+
```bash
167+
docker exec -it pg16 pg_dumpall -U postgres | bzip2 > dumpall.bz2
168+
docker rm -f pg16
169+
170+
rm -rf ~/pgdata
171+
mkdir ~/pgdata
172+
173+
docker run \
174+
--detach \
175+
--name pg15 \
176+
-e POSTGRES_PASSWORD=secret \
177+
-v ~/pgdata:/var/lib/postgresql/data \
178+
--shm-size=128m \
179+
postgres:15
180+
181+
bzcat dumpall.bz2 \
182+
| docker exec -i pg15 psql -U postgres \
183+
>>dump_load.log \
184+
2> >(tee -a dump_load.err >&2)
185+
```

0 commit comments

Comments
 (0)