postgresql容器中安装nacos,redis,jdk

#记录笔记#

背景:领导要求。。。。。。。。。。。解决一些坑

环境:docker26 》postgresql:16.0

           jdk:1.8  

           nacos: 2.3.2

           redis:6.0.4

[root@localhost jdk]# ls
jdk-8u202-linux-x64.tar.gz
[root@localhost nacos]# ls
bin  conf  LICENSE  NOTICE  target
[root@localhost redis]# ls
conf  data  redis-cli  redis-server
#redis-cli  redis-server 是编译安装好从install路径cp的

redis参考(已解决)Linux 离线部署 Redis(下载、安装、配置、启动、连接)_redis离线安装部署linux-CSDN博客

另外容器内还安装了postgis扩展

apt-get update

apt-get install -y apt-get install postgresql-16-postgis-3

----------------------------------------------------------------------

  Dockerfile内容:其中注释掉的操作已经通过手动docker cp 进行部署后,docker commit转为了基础环境镜像。

【#COPY ./jdk /opt/jdk其实用ADD方法较好,复制指定的到容器的中,可以是 Dockerfile 所在的目录的一个相对路径;可以是 URL,也可以是 tar.gz(自动解压)】

【“dclm-all:v2”是已经手动部署了jdk,nacos,redis的postgres镜像。】

【COPY start.sh前先chmod 777 start.sh】

FROM dclm-all:v2
LABEL maintainer="Coocle"

COPY ./start.sh /home

#COPY ./redis /opt/redis
#COPY ./nacos /opt/nacos
#COPY ./jdk /opt/jdk

#RUN cd /opt && mkdir jdk && tar -zxvf /home/jdk-8u202-linux-x64.tar.gz -C /opt/jdk && \
 #   rm -rf /home/jdk-8u202-linux-x64.tar.gz && \
 #   echo "export JAVA_HOME=/opt/jdk/jdk1.8.0_202" >> /etc/profile && \
 #   echo "export JRE_HOME=${JAVA_HOME}/jre" >> /etc/profile && \
 #   echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib " >> /etc/profile && \
 #   echo "export PATH=${JAVA_HOME}/bin:$PATH" >> /etc/profile

 #   echo "export JAVA_HOME=/opt/jdk" >> ~/.bashrc && \
 #   echo "export JRE_HOME=${JAVA_HOME}/jre" >> ~/.bashrc && \
 #   echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib " >> ~/.bashrc && \
 #   echo "export PATH=${JAVA_HOME}/bin:$PATH" >> ~/.bashrc

#RUN cd /home && mkdir log && cd /opt/redis && chmod 777 ./redis-server ./redis-cli && \
    #cd /opt/nacos && chmod 777 ./bin/startup.sh ./bin/shutdown.sh && chmod -R 666 /home/log && \
    
EXPOSE 6379 5432 8848 8849 9848 9849

ENTRYPOINT ["/home/start.sh"]

start.sh内容:

【postgresql只能用非特权用户启动,容器内没有su命令:su - postgres -c '/usr/local/bin/docker-entrypoint.sh postgres'】

#!/bin/bash
source ~/.bashrc 
source /etc/profile

# 启动 Postgres 服务
cd /usr/local/bin
gosu postgres /usr/local/bin/docker-entrypoint.sh postgres &

# 等待一段时间确保 Postgres 启动完成
sleep 30

# 启动 Redis 服务
cd /opt/redis
chmod 777 ./redis-server ./redis-cli
nohup ./redis-server ./conf/redis.conf > /home/log/redis.log 2>&1 &

# 启动 Nacos 服务
cd /opt/nacos
chmod 777 ./bin/startup.sh ./bin/shutdown.sh
nohup ./bin/startup.sh -m standalone > /home/log/nacos.log 2>&1 &

/bin/bash

构建images

docker build -t name:tag .

运行容器:

docker run -itd --privileged=true --name all-test --ulimit nofile=65536:65536  -p 180:8848 -p 181:6379 -p 182:5432 -e POSTGRES_PASSWORD='password' -e ALLOW_IP_RANGE=0.0.0.0/0 -e TZ='Asia/Shanghai' dclm-all:v3

docker 26 版本nacos和java程序启动需要限制文件数nofile=65536:65536 我也不太清楚没考究。

-------------------------------------------------------------------------------------------------------------------------

#踩过的坑#

1:最初用的是postgres14.1镜像,启动redis时报错:

nohup ./redis-server ./conf/redis.conf > /home/log/redis.log 2>&1 &

14版本的GLIBC版本时2.31,redis6.04最低要2.33

后来想通过升级启动redis

echo "deb http://ftp.cn.debian.org/debian sid main" >> /etc/apt/sources.list && \
sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && apt-get install -y libc6-dev

结果数据库又会出问题:看起来虽然连接成功,但是退出容器,容器就死掉了

所以就把pg镜像换成了GLIBC版本版本较高的postgres:16.0解决问题。

-----

2:start.sh作为容器启动服务的脚本,脚本在启动容器时覆盖了 Postgres 的默认启动行为。

之前的start.sh内容是,就会导致nacos和redis启动成功,pg却无法启动。

#!/bin/bash
source ~/.bashrc 
source /etc/profile

# 启动 Redis 服务
cd /opt/redis
chmod 777 ./redis-server ./redis-cli
nohup ./redis-server ./conf/redis.conf > /home/log/redis.log 2>&1 &

# 启动 Nacos 服务
cd /opt/nacos
chmod 777 ./bin/startup.sh ./bin/shutdown.sh
nohup ./bin/startup.sh -m standalone > /home/log/nacos.log 2>&1 &

/bin/bash

start.sh添加pg启动,后续需要启动java后端程序添加在末尾

nohup java -jar babyshark-0.0.1-SNAPSHOT.jar > log.file 2>&1 &

#!/bin/bash
source ~/.bashrc 
source /etc/profile

# 启动 Postgres 服务
cd /usr/local/bin
gosu postgres /usr/local/bin/docker-entrypoint.sh postgres &

# 等待一段时间确保 Postgres 启动完成
sleep 30

# 启动 Redis 服务
cd /opt/redis
chmod 777 ./redis-server ./redis-cli
nohup ./redis-server ./conf/redis.conf > /home/log/redis.log 2>&1 &

# 启动 Nacos 服务
cd /opt/nacos
chmod 777 ./bin/startup.sh ./bin/shutdown.sh
nohup ./bin/startup.sh -m standalone > /home/log/nacos.log 2>&1 &

/bin/bash

gosu 是一个类似于 su 命令的工具,用于以指定用户的身份执行命令。它的主要作用是切换用户身份,并执行特定的命令,而无需使用交互式密码。

su 命令不同的是,gosu 不会创建新的登录会话或改变环境变量,而只是执行命令。这使得它在脚本或 Docker 容器中执行特定用户权限下的命令非常有用。

gosu 的使用格式通常是:

gosu <username> <command>

其中,<username> 是要切换到的用户,<command> 是要执行的命令及其参数。

gosu 的优势之一是它更轻量级,适用于 Docker 等环境中,因为它不需要在容器中安装额外的软件包。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值