#记录笔记#
背景:领导要求。。。。。。。。。。。解决一些坑
环境: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-优快云博客
另外容器内还安装了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 等环境中,因为它不需要在容器中安装额外的软件包。