docker方式部署postgresql

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: docker方式部署postgresql 1 安装docker 1.1 通过二进制包安装docker 到官网下载自己需要安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-19.

docker方式部署postgresql

1 安装docker

1.1 通过二进制包安装docker

到官网下载自己需要安装包

wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.4.tgz

1.2 将安装包解压到/home/docker目录下

chmod 777 /home/docker/docker-19.03.4/*
cp /home/docker/docker-19.03.4/* /usr/local/bin/

1.3 将docker加入到系统服务

生成docker.service的文件并设定到/usr/lib/systemd/system目录下

cat > /usr/lib/systemd/system/docker.service <<"EOF"
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
[Service]
Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/local/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

1.4 重启docker

systemctl restart docker

2 docker 上部署postgresql

2.1制作postgresql的镜像

创建Dockerfile等制作镜像脚本的目录

mkdir /home/postgresql10_docker
cd /home/postgresql10_docker

创建Dockerfile

vim Dockerfile    

Dockerfile 内容如下

FROM centos:7.6.1810

ENV PGDATA=/var/lib/pgsql/10/data
ENV PGHOME=/usr/pgsql-10/ 
ENV LANG en_US.UTF-8

RUN  set -eux; \
    echo "export LANG=en_US.utf8" >> /root/.bash_profile \
    && yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm -y  \
    && yum install postgresql10-contrib postgresql10-server postgresql10-devel.x86_64 -y \
    && echo "export PATH=/usr/pgsql-10/bin:$PATH" >> /etc/profile.d/pg_env.sh \
    && echo "export LD_LIBRARY_PATH=$PGHOME/lib" >> /etc/profile.d/pg_env.sh \
    && echo "export PGDATA=$PGDATA"  >> /etc/profile.d/pg_env.sh \
    && echo "export PGHOME=$PGHOME"  >> /etc/profile.d/pg_env.sh \
    && echo "export LANG=en_US.utf8" >> /etc/profile.d/pg_env.sh \
    && chmod 777 /etc/profile.d/pg_env.sh \
    && echo "source /etc/profile.d/pg_env.sh" >> /var/lib/pgsql/.bash_profile \
    && /etc/profile.d/pg_env.sh \
    && su - postgres -c "initdb -E utf8" \
    #&& systemctl enable postgresql-10.service \
    && yum  install wget net-tools epel-release -y \
    && yum install postgis25_10 postgis25_10-client -y \
    && yum install ogr_fdw10 -y \
    && yum install pgrouting_10 -y \
    && yum install osm2pgrouting_10 -y \
    && yum install gcc -y \
    && yum install make -y \
    && yum install git -y \
    && git clone git://git.postgresql.org/git/pldebugger.git \
    && mv pldebugger /usr/pgsql-10/share/contrib \
    && yum install openssl-devel -y \
    && yum install postgresql10-devel.x86_64 -y \
    && cd /usr/pgsql-10/share/contrib/pldebugger \
    && source /etc/profile.d/pg_env.sh \
    && USE_PGXS=1 make clean \
    && USE_PGXS=1 make  \
    && USE_PGXS=1 make install \
    && sed -i s/"#shared_preload_libraries = ''"/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so'"/g $PGDATA/postgresql.conf \
    && yum install pgagent_10.x86_64 -y \
    && su - postgres -c "pg_ctl start" && psql -U postgres -d postgres -f /usr/share/pgagent_10-4.0.0/pgagent.sql \
    && yum install lbzip2.x86_64 -y \
    && cd /home \
    && wget -P /home http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 \
    && git clone https://github.com/amutu/zhparser.git \
    && tar -xf scws-1.2.3.tar.bz2 \
    && cd scws-1.2.3 && ./configure && make install \
    && export SCWS_HOME=/usr/local \
    && cd /home/zhparser &&  PG_CONFIG=/usr/pgsql-10/bin/pg_config make && make install \
    #&& yum -y install perl perl-devel \
    #&& yum install -y php php-devel \
    #&& yum install -y httpd \
    #&& yum -y install httpd-devel \
    #&& yum -y install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker \
    #&& yum -y install perl-CPAN \
    #&& cpan Text::CSV \
    #&& cpan JSON::XS \
    #&& wget -P /home/ https://github.com/darold/pgbadger/archive/v10.3.tar.gz \
    #&& cd /home/ && tar -xvf v10.3.tar.gz \
    #&& cd pgbadger-10.3 \
    #&& perl Makefile.PL \
    #&& make && make install \
    && yum install -y cmake3 && ln -s /usr/bin/cmake3 /usr/bin/cmake    \
    && wget -P /home/ https://github.com/timescale/timescaledb/archive/1.3.0.tar.gz \
    && cd /home/ && tar -xvf 1.3.0.tar.gz && cd timescaledb-1.3.0 \
    && ./bootstrap \
    && cd ./build && make \
    && make install \
    && sed -i s/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so'"/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so,timescaledb'"/g $PGDATA/postgresql.conf \
    &&  wget -P /home https://github.com/pipelinedb/pipelinedb/releases/download/1.0.0rev4/pipelinedb-postgresql-10-1.0.0-4.centos7.x86_64.rpm \
    && cd /home \
    && rpm -ivh pipelinedb-postgresql-10-1.0.0-4.centos7.x86_64.rpm \
    && sed -i s/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so,timescaledb'"/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so,timescaledb,pipelinedb'"/g $PGDATA/postgresql.conf  \
    && wget -P /home https://yum.postgresql.org/10/redhat/rhel-7-x86_64/citus_10-9.0.1-1.rhel7.x86_64.rpm \
    && cd /home \
    && rpm -ivh citus_10-9.0.1-1.rhel7.x86_64.rpm \
    && sed -i s/"shared_preload_libraries ='\/usr\/pgsql-10\/lib\/plugin_debugger.so,timescaledb,pipelinedb'"/"shared_preload_libraries ='citus,\/usr\/pgsql-10\/lib\/plugin_debugger.so,timescaledb,pipelinedb'"/g $PGDATA/postgresql.conf


COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod -R 777 /usr/local/bin/docker-entrypoint.sh
RUN ln -s /usr/local/bin/docker-entrypoint.sh /
ENTRYPOINT ["docker-entrypoint.sh"]

VOLUME $PGDATA

EXPOSE 5432

CMD ["postgres"]

创建docker-entrypoint.sh

cd /home/postgresql10_docker
vim docker-entrypoint.sh

内容如下:

#!/bin/bash

if [ "$1" = "postgres" ];then
        echo "kernel.sem = 250 64000 32 256" >> /etc/sysctl.conf
        free -b | awk '/Mem/ {print "kernel.shmmax="$2/2}' >> /etc/sysctl.conf
        free -k | awk '/Mem/ {print "kernel.shmall="$2*0.8}' >> /etc/sysctl.conf
        echo "kernel.shmmni = 819200" >> /etc/sysctl.conf
        sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" $PGDATA/postgresql.conf
        echo "host      all     all     0.0.0.0/0       md5" >> $PGDATA/pg_hba.conf
        su - postgres -c "/usr/pgsql-10/bin/postgres -D $PGDATA -c config_file=$PGDATA/postgresql.conf"
fi

build 镜像

cd /home/postgresql10_docker
docke build -t postgres_10_centos7.6:1.0 .

查看镜像

docker images

输出结果:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres_10_centos7.6   1.0                 232ef0628e1f        6 hours ago         952MB
centos              7.6.1810            f1cb7c7d58b7        7 months ago        202MB

2.2 启动一个postgresql容器,放后台运行

设置启动端口也为5432

docker run --name pgtest1 -d -p 5431:5432 postgres_10_centos7.6:1.0

检查启动的容器


docker ps -a

输出如下

CONTAINER ID        IMAGE                       COMMAND                  CREATED              STATUS              PORTS                    NAMES
534149dc7726        postgres_10_centos7.6:1.0   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp   sharp_pasteur

进入容器查看postgres进程是否正常启动

[root@iZuf678t3hp8rp7xchc3aoZ ~]# docker exec -it 534149dc7726 ps -ef | grep postgres

输出结果如下

root        10     1  0 15:53 ?        00:00:00 su - postgres -c /usr/pgsql-10/b
postgres    11    10  0 15:53 ?        00:00:00 /usr/pgsql-10/bin/postgres -D /v
postgres    24    11  0 15:53 ?        00:00:00 postgres: logger process   
postgres    26    11  0 15:53 ?        00:00:00 postgres: checkpointer process  
postgres    27    11  0 15:53 ?        00:00:00 postgres: writer process   
postgres    28    11  0 15:53 ?        00:00:00 postgres: wal writer process   
postgres    29    11  0 15:53 ?        00:00:00 postgres: autovacuum launcher pr
postgres    30    11  0 15:53 ?        00:00:00 postgres: stats collector proces
postgres    31    11  0 15:53 ?        00:00:00 postgres: bgworker: scheduler   
postgres    32    11  0 15:53 ?        00:00:00 postgres: bgworker: TimescaleDB 
postgres    33    11  0 15:53 ?        00:00:00 postgres: bgworker: logical repl

宿主机上查看5432端口是否启动

netstat -nlap | grep 5432

输出结果如下

tcp6       0      0 :::5432                 :::*                    LISTEN      22287/docker-proxy  

此时一个基于docker的postgresql已经启动成功。

2.3 在一个宿主机上启动两个postgresql容器,并将

2.3.1 启动两个容器

创建docker的volume

   docker volume create pgdata_5431
   docker volume create pgdata_5433

查看volume列表

[root@iZuf678t3hp8rp7xchc3aoZ ~]# docker volume list
DRIVER              VOLUME NAME
local               pgdata_5431
local               pgdata_5433

查看volume的存储位置

[root@iZuf678t3hp8rp7xchc3aoZ postgresql10_docker]# docker inspect pgdata_5431
[
    {
        "CreatedAt": "2019-11-16T19:23:40+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata_5431/_data",
        "Name": "pgdata_5431",
        "Options": {},
        "Scope": "local"
    }
]

[root@iZuf678t3hp8rp7xchc3aoZ postgresql10_docker]# docker inspect pgdata_5433
[
    {
        "CreatedAt": "2019-11-16T19:24:38+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata_5433/_data",
        "Name": "pgdata_5433",
        "Options": {},
        "Scope": "local"
    }
]

如果需要将数据盘单独挂载,可以新建个目录mount到分区上,然后将/var/lib/docker/volumes/pgdata_5433目录下的文件移动过来,使用软连接的方式

mkdir /data/pgsql
mv /var/lib/docker/volumes/pgdata_5433 /data/pgsql
ln -s /data/pgsql/pgdata_5433 /var/lib/docker/volumes/pgdata_5433

分别启动两个容器,端口分别为5431,5433


docker run --name pgtest_5431 -d -p 5431:5432 -v pgdata_5431:/var/lib/pgsql/10/data postgres_10_centos7.6:3.0 & disown
docker run --name pgtest_5433 -d -p 5433:5432 -v pgdata_5433:/var/lib/pgsql/10/data postgres_10_centos7.6:3.0 & disown

查看容器启动情况

[root@iZuf678t3hp8rp7xchc3aoZ ~]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
338f82d2e4e5        postgres_10_centos7.6:3.0   "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:5433->5432/tcp   pgtest_5433
3c027bee7482        postgres_10_centos7.6:3.0   "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       0.0.0.0:5431->5432/tcp   pgtest_5431

查看宿主机端口

[root@iZuf678t3hp8rp7xchc3aoZ ~]# netstat -nlap | grep 5431
tcp6       0      0 :::5431                 :::*                    LISTEN      26246/docker-proxy  
[root@iZuf678t3hp8rp7xchc3aoZ ~]# netstat -nlap | grep 5433
tcp6       0      0 :::5433                 :::*                    LISTEN      26367/docker-proxy  

2.3.2 容器间数据库互相访问

分别进入两个容器,创建超级数据库用户

docker exec -it pgtest_5431 /bin/bash
su - postgres
psql
create user app_user with superuser password 'app_user';

docker exec -it pgtest_5433 /bin/bash
su - postgres
psql
create user app_user with superuser password 'app_user';

查看容器的ip

[root@iZuf678t3hp8rp7xchc3aoZ postgresql10_docker]# docker exec -it pgtest_5433 'ifconfig'
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 37  bytes 3449 (3.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42  bytes 3519 (3.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@iZuf678t3hp8rp7xchc3aoZ postgresql10_docker]# docker exec -it pgtest_5431 'ifconfig'
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 43  bytes 3622 (3.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 37  bytes 3388 (3.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

登陆对端和本地数据库

root@iZuf678t3hp8rp7xchc3aoZ ~]# docker exec -it pgtest_5433 /bin/bash
-bash-4.2$ psql 'user=app_user password=app_user dbname=postgres host=172.17.0.2'
psql (10.11)
Type "help" for help.

postgres=# create table tab_test(id text);
CREATE TABLE


-bash-4.2$ psql 'user=app_user password=app_user dbname=postgres host=172.17.0.3'
psql (10.11)
Type "help" for help.

postgres=# create table tab_test(id text);
CREATE TABLE

补充说明

推荐将数据目录挂载在宿主机上

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6天前
|
存储 关系型数据库 分布式数据库
数据管理的艺术:PolarDB开源版详评与实战部署策略(二)
PolarDB-PG是阿里云的一款云原生关系型数据库,100%兼容PostgreSQL,支持Oracle语法,采用Shared-Storage存储计算分离架构,提供极致弹性、毫秒级延迟的HTAP能力。具备高可用、高可靠和弹性扩展特性,支持单机、存储计算分离和X-Paxos三节点等多种部署形态。通过Docker可快速部署实例,包括单节点、一主一备和HTAP(一主两备)实例。此外,文章还介绍了在ECS上使用ESSD云盘搭建PolarDB-PG的详细步骤,适合开发和测试环境。
123355 16
|
6天前
|
运维 监控 Java
开源PolarDB-X部署安装评测报告
在部署PolarDB-X时,需先准备符合要求的OS环境和安装JDK等依赖库。遇到的问题包括`protobuf`版本不兼容、`cmake`参数配置错误和启动服务时的配置挑战。文档更新滞后和错误信息不明确增加了安装难度。建议优化文档、提升错误信息引导性、提供自动化安装脚本、加强社区支持和产品功能。尽管安装过程复杂,但产品潜力值得认可,期待改进以提升用户体验。
105 7
|
6天前
|
存储 关系型数据库 MySQL
数据管理的艺术:PolarDB开源版详评与实战部署策略(一)
PolarDB-X是阿里巴巴自研的高性能云原生分布式数据库,基于共享存储的Shared-nothing架构,支持MySQL生态,具备金融级高可用、分布式水平扩展、HTAP混合负载等能力。它通过CN(计算节点)和DN(存储节点)实现计算与存储分离,保证数据强一致性,并支持全局二级索引和多主多写。PolarDB-X开源版提供更高程度的定制化和控制权,适合追求技术自主性和成本优化的开发者。部署方式包括RPM包、PXD工具和Kubernetes,其中PXD工具提供了一键部署的便利性。
119455 15
|
6天前
|
关系型数据库 MySQL 分布式数据库
快速体验开源PolarDB -X 部署安装
在CentOS上部署PolarDB-X标准版集群的体验包括三步:安装python3和docker(如果未预装),然后使用venv创建环境,安装pxd并验证。接着,通过`pxd tryout -t standard`部署集群,该过程需拉取大量镜像,可能耗时且占用数GB空间,建议事先清理空间并了解资源需求。部署后,可查询集群状态和健康信息。最终,使用`pxd cleanup`清理。过程中因磁盘空间不足遇到问题,建议体验前提供系统配置需求,并允许用户自定义MySQL参数。
|
6天前
|
关系型数据库 Linux 分布式数据库
源码编译实现PolarDB-X部署安装的体验报告
本文档记录了编译安装PolarDB-X的步骤,包括设置CentOS开发环境、从GitHub获取源码、编译(耗时较长)、解决依赖和权限问题、安装部署及测试验证。作者建议优化文档细节、减少编译时间、改进错误提示,并提议提供一键安装依赖脚本、新手视频教程及加强社区支持。整个过程虽有挑战,但具有成就感。
20 0
|
6天前
|
关系型数据库 Java 数据库
docker部署postgresql数据库和整合springboot连接数据源
docker部署postgresql数据库和整合springboot连接数据源
22 0
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
553 0
【云原生】阿里云服务器部署 Docker Swarm集群
|
弹性计算 Linux Shell
阿里云一键部署 Docker Datacenter
使用阿里云ROS一键部署Docker Datacenter
12230 1
|
弹性计算 Shell Docker
阿里云一键部署 Docker Datacenter
使用ROS模板在阿里云上一键部署Docker Datacenter
7723 0