原來只知道根據教程帖子簡單使用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都殺不死