准备工作
创建一个docker bridge 网路用于测试
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 pgnetwork
# 查看
docker network ls
设置了网段为 192.168.0.0,规划主从库IP端口如下:
主库 192.168.0.101:5432
从库 192.168.0.102:5433
创建一个文件夹用来挂载数据(自定义)
mkdir -p /data/docker/pg/{master,slave,repl}
【可选】拉取镜像
docker pull postgres
版本:PostgreSQL 13.3
运行主库(用来写)
docker run -d \
--name postgres-master \
--network pgnetwork --ip 192.168.0.101 \
-p 5432:5432 \
-e TZ=Asia/Shanghai \
-e POSTGRES_PASSWORD=123456 \
-v /data/docker/pg/master:/var/lib/postgresql/data \
postgres:latest
使用数据库连接工具(例如navicat)创建同步账号
CREATE ROLE repuser WITH
LOGIN
REPLICATION
CONNECTION LIMIT 5
PASSWORD 'a12345';
进入挂载/data/docker/pg/master/目录
编辑pg_hba.conf文件,在尾部追加一条
host replication repuser 192.168.0.102/32 md5
说明 上面repuser是同步账号,192.168.0.102是从库的IP地址,md5是加密方式
修改postgresql.conf配置,修改点如下
将归档文件统一放archivelog目录,注意使用的是相对路径
archive_mode = on
archive_command = 'mkdir -p archivelog && test ! -f archivelog/%f && cp %p archivelog/%f'
restore_command = 'cp archivelog/%f %p'
max_wal_senders = 10
synchronous_standby_names = '*'
技巧:使用 【:/archive_mode】搜索
重启主库使配置生效
docker exec -it -u postgres postgres-master pg_ctl stop
docker start postgres-master
运行从库(用来读)
docker run -d \
--name postgres-slave \
--network pgnetwork --ip 192.168.0.102 \
-p 5433:5432 \
-e TZ=Asia/Shanghai \
-e POSTGRES_PASSWORD=123456 \
-v /data/docker/pg/slave:/var/lib/postgresql/data \
-v /data/docker/pg/repl:/var/lib/postgresql/repl \
postgres:latest
进入从库内部
docker ps
docker exec -it 14c77b64a4d7 bash
同步初始主库数据到 repl 目录
pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h 192.168.0.101 -p 5432 -U repuser
1
提示输入密码:输入上面创建的账号repuser对应的密码(a12345)
备注成功推出
exit
1
通过上一步的初始备份,使用data/docker-data/pg/repl里的数据重建 slave容器
停止并删除从库容器
docker stop postgres-slave && docker rm postgres-slave
1
删除原slave挂载目录,将刚复制的repl重命名为slave
rm -rf slave
mv repl slave
检查slave下的postgresql.auto.conf文件是否包含primary_conninfo = 'user=repuser password=a12345...
重新运行从库(重点是挂载目录位置与上面保持一致)
docker run -d \
--name postgres-slave \
--network pgnetwork --ip 192.168.0.102 \
-p 5433:5432 \
-e TZ=Asia/Shanghai \
-e POSTGRES_PASSWORD=123456 \
-v /data/docker/pg/slave:/var/lib/postgresql/data \
postgres:latest
查看主从复制信息
# 验证主从
ps -aux | grep postgres
# 主库有 walsender 进程如下
postgres: walsender repuser
# 从库有 walreceiver 进程如下
postgres: walreceiver
检查是否成功
连接到主库
select * from pg_stat_replication;
1
注意
同步主数据库之后,连接从库需要使用主库对应的账号密码
当开启archive_mode=on,发现pg_wal文件巨大,可能不base文件还大时,一定是archive_command异常或未生效,可采取紧急措施降低pg_wal文件大小(不建议生产环境使用)
步骤:
进入容器内部docker exec -it 容器ID或名称 bash回车
执行指令su postgres
执行指令pg_controldata $PGDATA,结果如下
表示000000010000001700000046之前的文件可以删除
执行指令pg_archivecleanup -d $PGDATA/pg_wal 000000010000001700000046
退出容器后,查看pg_wal文件大小du -h发现只有几十Mb
这种方法治标不治本,紧急情况下可参考下,不建议正式环境使用
-------pgadmin
docker搭建pgadmin并挂载
docker搭建pgadmin并挂载
1.创建文件
2.给文件夹授权
3.运行pgadmin
4.使用
1.创建文件
mkdir -p /data/docker/pgadmin/{data, logs}
1
2.给文件夹授权
cd /data/docker/pgadmin
chown -R 5050:5050 pgadmin/
3.运行pgadmin
docker run -d --name pgadmin -p 5434:80 \
-e "PGADMIN_DEFAULT_EMAIL=admin@xxx.cn" \
-e "PGADMIN_DEFAULT_PASSWORD=123456" \
-v /data/docker/pgadmin/data:/var/lib/pgadmin \
-v /data/docker/pgadmin/logs:/var/log/pgadmin \
dpage/pgadmin4
不用外部卷
拉取postgresql可视化工具pgadmin4
-
拉取postgresql可视化工具pgadmin4:
docker pull dpage/pgadmin4
运行pgadmin4:
[root@dockerpg logs]# docker run -d -p 5434:80 --name pgadmin4 -e PGADMIN_DEFAULT_EMAIL=test@123.com -e PGADMIN_DEFAULT_PASSWORD=123456 dpage/pgadmin4 2e8fce268b69be666156e0b793bcd3603b0ea66a76a03a4905bda68b4b59735c [root@dockerpg logs]# docker ps
如图:
3、查看服务
4、打开浏览器访问pgadmin4 Content Filter - Access Deniedhttp://192.168.1.150:5434/
-
抱歉,您的访问无响应
您(10.0.128.44)访问的页面无响应!
原因如下:
192.168.1.150 请求未响应
若有任何疑问,请与管理员联系。
-
如果因为IP限制,可以通过端口映射回物理IP
-
pgAdmin 4http://10.0.128.44:5434/browser/
-
输入我们设置的邮箱test@123.com和密码123456,点击Login
连接server:
打开
链接配置
点击
提示无法解析,其实宿主机的hosts文件里host.docker.internal对应的还是容器IP
那你用postgres那个容器的IP去连
查看容器ip
docker exec -it 836 bash //进入容器 836为这个容器的id cat /etc/hosts //查看容器的ip
-
[root@dockerpg logs]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e8fce268b69 dpage/pgadmin4 "/entrypoint.sh" About a minute ago Up About a minute 443/tcp, 0.0.0.0:5434->80/tcp, :::5434->80/tcp pgadmin4
ed345f4a33a6 postgres:latest "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgres-slave
6a4f3aa6420d postgres:latest "docker-entrypoint.s…" 27 minutes ago Up 21 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres-master
[root@dockerpg logs]# docker exec -it postgres-master bash
root@6a4f3aa6420d:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.101 6a4f3aa6420d
root@6a4f3aa6420d:/#
-
如图
更改链接
结果