原来只知道根据教程帖子简单使用docker安装MySQL、tomcat,搞了这个docker内安装应用半学半上手的操作,花了一周。记录一下
docker根据DockerFile配置构建镜像(可以取不同的名构建多个镜像)
一个镜像可以构建多个不同名的容器,容器就是一个小型服务器,通过映射端口以及和宿主机(服务器)共享目录来达到和宿主机交互。
使用podman操作
最终结果如图:
1.ApacheOpenoffice官网下载openoffice的linux版本安装包
安装包rpm名为:Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN.tar.gz
服务器上 mkdir 新建目录为
/root/openoffice/
将安装包放到/root/openoffice/目录下
2.搭建jdk环境
下载jdk-8u311-linux-x64.rpm
将安装包放到/root/openoffice/目录下
3.确保安装docker的情况下,编写DockerFile
新建DockerFile文件(无后缀)
内容如下,按照自己实际情况的修改
#基础镜像为centos8
FROM centos
#java环境
COPY jdk-8u311-linux-x64.rpm /tmp/jdk-8u311-linux-x64.rpm
#引入openoffice
ADD Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN.tar.gz /tmp/Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN
RUN yum install -y /tmp/jdk-8u311-linux-x64.rpm
#解压缩 ADD进来后已经解压了,变成了目录。此处不用解压
#tar -xvf Apache_OpenOffice*.tar.gz
#安装JDK(太慢,改从lib库里add进来了)
#yum install -y java-1.8.0-openjdk.x86_64
#安装wget
#yum -y install wget && \
#安装OpenOffice,会安装到/opt/openoffice4/目录下
RUN yum install -y /tmp/Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN/zh-CN/RPMS/*.rpm
run cd /tmp/Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN/zh-CN/RPMS/desktop-integration/ && ls -r
RUN yum install -y /tmp/Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN/zh-CN/RPMS/desktop-integration/openoffice4.1.11-redhat-menus-4.1.11-9808.noarch.rpm
#必要的库
RUN yum install -y libXext.x86_64
RUN yum install -y gcc
RUN yum install -y gcc-c++
RUN yum install -y freetype-devel
RUN yum install -y glib2-devel
RUN yum install -y cairo-devel
RUN yum install -y libXt.x86_64
# 修改时区
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#安装中文字体,解决中文乱码
# \ 为换行符,后面不能有空格,相当于为了方便查看与美观的时候换行,这时候下一行也只目前这一行,只有这一行一起执行
RUN yum install -y mkfontscale
RUN yum install -y fontconfig
RUN cd /usr/share/fonts/ && \
chmod -R 755 /usr/share/fonts && \
mkfontscale && \
mkfontdir
##上面的不知道为什么安装失败。应该是centos8的缘故吧
##从这个贴子找方法,用docker构建的时候一并执行完毕,链接在下面:CentOS8安装中文字体
RUN mkdir /usr/share/fonts/chinese && \
chmod -R 755 /usr/share/fonts/chinese && \
chmod -R 755 /etc/fonts
ADD chinese/msyhbd.ttc /usr/share/fonts/msyhbd.ttc
ADD chinese/msyhl.ttc /usr/share/fonts/msyhl.ttc
ADD chinese/msyh.ttc /usr/share/fonts/msyh.ttc
ADD chinese/simhei.ttf /usr/share/fonts/simhei.ttf
ADD chinese/simsun.ttc /usr/share/fonts/simsun.ttc
## fonts.conf 是字体配置文件也是安装CentOS8安装中文字体贴子修改后,直接提取出来,方便每次构建的时候打包进镜像
ADD fonts.conf /etc/fonts/fonts.conf
#刷新缓存字体生效
RUN fc-cache -fv
#适配 centos 8 中文安装包
RUN yum install -y glibc-langpack-zh && \
yum install -y glibc-common && \
yum install -y langpacks-zh_CN && \
yum install -y langpacks-zh_CN.noarch
RUN echo "export LC_ALL=zh_CN.utf8" >> /etc/profile && source /etc/profile
ENV LANG en_US.utf8
#清除yum缓存
RUN yum clean all
#删除压缩包
RUN rm -Rf /tmp/jdk-8u311-linux-x64.rpm
RUN rm -Rf /tmp/Apache_OpenOffice_4.1.11_Linux_x86-64_install-rpm_zh-CN
#删除解压缩的文件
#rm -Rf zh-CN
VOLUME /tmp
#暴露接口
EXPOSE 8080
#启动服务,占用8080端口
RUN mkdir /home/jar
ADD startjar.sh /home/startjar.sh
RUN chmod 777 /home/startjar.sh
## &是后台执行home目录下的startjar.sh,控制台日志输出到 > startjar.log
ENTRYPOINT [ "sh","/home/startjar.sh",">","/home/startjar.log","&" ]
链接:CentOS8安装中文字体
chinese目录也是按照上面的教程,把Windows的字体文件放上来,随便找个微软雅黑、宋体的文件
4.startjar.sh文件(可不要)
这个shell脚本是检查固定目录下是否有jar包,并启动它,并记录文件时间戳,有新打包后的jar文件,杀死旧jar进程并启动新进程
#!/bin/bash
route=/home/jar
num=0
date=0
while [ ture ]
do
let num++
echo "--------------------------------------------第$num次扫描$route--------------------------------------------"
for file in `ls $route`
do
app_name=$route"/"$file
echo 尝试获取目录文件:$app_name
while [ -f $route"/wait" ]
do
echo waitting...
sleep 60
done
if [ -f $app_name ] && [ "${app_name##*.}" = "jar" ];
then
echo 目录文件:$app_name
ps -fe|grep $app_name |grep -v grep
if [ $? -eq 0 ]
then
echo "$file正在运行.....不进行启动操作"
else
echo "$file没有运行.....正在尝试启动"
java -jar -Dserver.port=8080 -Dfile.encoding=UTF-8 -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider -jar $app_name > /home/log &
date=`date +%s -r $app_name`
echo "存储文件时间:$date"
sleep 30
fi
sleep 2
new_date=`date +%s -r $app_name`
echo "new_date:$new_date date:$date"
if [[ "$new_date"0 -gt "$date"0 ]]
then
echo "检测到新文件,将杀死进程重新启动"
pid=`ps -ef | grep $app_name | grep -v "grep" | awk '{print $2}'`
kill -15 $pid
echo "killed $pid"
ps -ef | grep /opt/openoffice4 | grep -v grep | awk '{print $2}' | xargs kill -9
echo "kill openoffice进程进行中,检测kill结果:"
ps -fe|grep /opt/openoffice4 |grep -v grep
if [ $? -eq 0 ]
then
echo "openoffice正在运行,再次执行kill"
ps -ef | grep /opt/openoffice4 | grep -v grep | awk '{print $2}' | xargs kill -9
else
echo "没有openoffice进程,kill完成"
fi
else
echo "无新文件,不执行kill"
fi
else
echo "jar文件不存在"
fi
done
echo ""
echo ""
sleep 10
done
效果图如下:
5.在学习的过程中使用过的相关命令
--------------------------------------------2021年11月25日指令--------------------------------------------
查看当前应用所占用端口
netstat -nltp | grep 8080
查找端口
lsof -i :8080
杀死进程
kill -9 3724281
查找名为startjar的进程端口并杀死
ps -ef | grep startjar | grep -v grep | awk '{print $2}' | xargs kill -9
查看jar进程
ps aux|grep jar
ps -ef|grep java
ps -ef| grep file-api.jar
启动file-api.jar包 输出控制台日志到log
设置端口为8080 :-Dserver.port=8080
设置编码-Dfile.encoding=UTF-8
好像是防止乱码的:-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider
nohup java -jar -Dserver.port=8080 -Dfile.encoding=UTF-8 -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider -jar file-api.jar >log &
1.构建镜像 podman = pm
pm build -t openoffice -f DockerFile
查看镜像
podman images
删除多余镜像 + 镜像id
podman rmi ba4af1f9fb16
2.构建镜像之后创建容器,
设置名字:--name openoffice
设置映射目录,顺序是从宿主机的/home/jar目录,映射到容器中的/home/jar目录,两边的目录相当于一个:-v /home/jar:/home/jar
设置端口映射宿主机的10013端口映射了容器中的8080端口,相当于访问宿主机的10013端口,就是访问了容器的8080端口:-p 10013:8080
pm create -it --name openoffice --privileged=true -v /etc/localtime:/etc/localtime:ro \
-v /home/jar:/home/jar \
-v /home/WebLogs/file-api/`uname -n`:/usr/local/tomcat/logs \
-p 10013:8080 localhost/openoffice
查看所有容器 -a
podman ps -a
3.创建容器后启动容器
pm start 385
查看容器日志
podman logs -f --tail=100 eff
4.进入容器 容器名openoffice
podman exec -ti openoffice /bin/bash
停止容器
podman stop 6fbf0216d07d
删除容器
podman rm 6fbf0216d07d
删除文件夹
rm -rf 目录名
重新启动容器
podman restart 容器id
宿主机上面执行命令:容器拷文件到宿主机
pm cp openoffice:/home/jar/start_jar.sh /root/openoffice/start_jar.sh
宿主机上面执行命令:宿主机拷文件到容器
pm cp /root/openoffice/start_jar.sh openoffice:/home/jar/start_jar.sh
pm cp /root/openoffice/chinese/msyhbd.ttc openoffice:/usr/share/fonts/msyhbd.ttc
pm cp /root/openoffice/chinese/msyhl.ttc openoffice:/usr/share/fonts/msyhl.ttc
pm cp /root/openoffice/chinese/msyh.ttc openoffice:/usr/share/fonts/msyh.ttc
pm cp /root/openoffice/chinese/simhei.ttf openoffice:/usr/share/fonts/simhei.ttf
pm cp /root/openoffice/chinese/simsun.ttc openoffice:/usr/share/fonts/simsun.ttc
查看容器所有语言环境(解决中文乱码时使用到,查看是否有中文语言)
locale -a
中文乱码
java -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider 修改成下面
java -Dfile.encoding=UTF-8 -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider
查看当前字符集
locale
编辑修改语言
vim /etc/locale.conf
服务器重启
reboot
注意事项
其中有一些问题,这一段是镜像在构建的时候一并写入
1.ADD添加文件到容器里面
2.赋予777权限
3.执行startjar.sh文件
4.这个时候去从构建好的镜像中去构建容器,并启动容器的时候,这个程序也开始启动了,并且是1号进程,kill -9都杀不死