之前验证了OnlyOffice验证(二)在Centos7上部署OnlyOffice编译结果,由于现在普遍都是容器化部署,所以还是验证下Docker镜像打包是否可行,因为最终部署还是会上到K8S,所以这步必须要验证一下。
提前安装好docker
和docker-compose
,安装docker-compose
是为了简化容器启动方式。菜鸟教程传送门
首先准备好,要打包镜像的资源。
[root@test documentserver]# pwd
/opt/documentserver
[root@test documentserver]# ll
总用量 822720
-rwxr-xr-x. 1 root root 1220 3月 2 14:10 docker-entrypoint.sh
-rw-r--r--. 1 root root 1366 3月 2 13:34 Dockerfile
drwxr-xr-x. 2 root root 37 3月 1 21:53 DocService
-rw-r--r--. 1 root root 764 3月 1 21:10 documentServer.conf
-rw-r--r--. 1 root root 842447109 2月 24 10:40 documentserver.tar.gz
drwxr-xr-x. 2 root root 37 3月 1 21:53 FileConverter
-rw-r--r--. 1 root root 167 3月 2 13:38 run.sh
此处说明一下相关文件的功能。
docker-entrypoint.sh
容器启动的时候会调用该脚本(基础镜像ubuntu/nginx:1.18-20.04_beta)Dockerfile
用于构建镜像的配置文件DocService
文档服务文件夹,里面放的后台启动脚本documentServer.conf
Nginx代理配置文件documentserver.tar.gz
编译结果压缩包,相当于安装程序FileConverter
转换服务文件夹,里面放的后台启动脚本run.sh
主启动脚本,文档服务和转换服务最终会由该脚本负责执行启动#!/bin/sh
# 启动转换服务
cd /opt/documentserver/server/FileConverter
sh ./start.sh
# 启动文档服务
cd /opt/documentserver/server/DocService
sh ./start.sh
[root@test documentserver]# cd FileConverter/
[root@test FileConverter]# pwd
/opt/documentserver/FileConverter
[root@test FileConverter]# ll
总用量 8
-rw-r--r--. 1 root root 233 2月 28 21:31 start.sh
-rw-r--r--. 1 root root 215 3月 1 21:53 stop.sh
start.sh
#!/bin/sh
server_path=$(dirname $(pwd))
LD_LIBRARY_PATH=$PWD/bin
export PATH=$PATH:$LD_LIBRARY_PATH
export NODE_ENV=development-linux
export NODE_CONFIG_DIR="$server_path/Common/config"
nohup ./converter > $PWD/out.log 2>&1 &
stop.sh
#!/bin/sh
pid_file=pids
ps -ef | grep converter | grep -v grep | awk '{print $2}' > $PWD/pids
pid_arg=$(awk '{print $1}' $pid_file)
for pid in ${pid_arg}
do
echo "to kill pid = $pid"
kill -9 $pid
done
[root@test documentserver]# cd DocService/
[root@test DocService]# pwd
/opt/documentserver/DocService
[root@test DocService]# ll
总用量 8
-rw-r--r--. 1 root root 172 2月 28 21:32 start.sh
-rw-r--r--. 1 root root 216 3月 1 21:53 stop.sh
start.sh
#!/bin/sh
server_path=$(dirname $(pwd))
export NODE_ENV=development-linux
export NODE_CONFIG_DIR="$server_path/Common/config"
nohup ./docservice > $PWD/out.log 2>&1 &
stop.sh
#!/bin/sh
pid_file=pids
ps -ef | grep docservice | grep -v grep | awk '{print $2}' > $PWD/pids
pid_arg=$(awk '{print $1}' $pid_file)
for pid in ${pid_arg}
do
echo "to kill pid = $pid"
kill -9 $pid
done
此处具体得看用的什么基础镜像(此次验证用的是ubuntu/nginx:1.18-20.04_beta)。主要是将run.sh
执行添加到这个脚本中,如下所示./opt/run.sh
是唯一添加的内容,其余的都是原本的内容。这样转换服务和文档服务就都可以跟随容器一起启动了。
#!/bin/sh
# vim:sw=4:ts=4:et
./opt/run.sh
set -e
if [ -z "${NGINX_ENTRYPOINT_QUIET_LOGS:-}" ]; then
exec 3>&1
else
exec 3>/dev/null
fi
if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then
if /usr/bin/find "/docker-entrypoint.d/" -mindepth 1 -maxdepth 1 -type f -print -quit 2>/dev/null | read v; then
echo >&3 "$0: /docker-entrypoint.d/ is not empty, will attempt to perform configuration"
echo >&3 "$0: Looking for shell scripts in /docker-entrypoint.d/"
find "/docker-entrypoint.d/" -follow -type f -print | sort -n | while read -r f; do
case "$f" in
*.sh)
if [ -x "$f" ]; then
echo >&3 "$0: Launching $f";
"$f"
else
# warn on shell scripts without exec bit
echo >&3 "$0: Ignoring $f, not executable";
fi
;;
*) echo >&3 "$0: Ignoring $f";;
esac
done
echo >&3 "$0: Configuration complete; ready for start up"
else
echo >&3 "$0: No files found in /docker-entrypoint.d/, skipping configuration"
fi
fi
exec "$@"
此处就是官方提供的默认配置,只不过是把80端口改成了81。
map $http_host $this_host {
"" $host;
default $http_host;
}
map $http_x_forwarded_proto $the_scheme {
default $http_x_forwarded_proto;
"" $scheme;
}
map $http_x_forwarded_host $the_host {
default $http_x_forwarded_host;
"" $this_host;
}
map $http_upgrade $proxy_connection {
default upgrade;
"" close;
}
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
server {
listen 0.0.0.0:81;
listen [::]:81 default_server;
server_tokens off;
rewrite ^\/OfficeWeb(\/apps\/.*)$ /web-apps$1 redirect;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
}
}
由于基础镜像的原因,该配置文件并不需要配置ENTRYPOINT
和CMD
:
FROM ubuntu/nginx:1.18-20.04_beta
MAINTAINER lyan
COPY ./documentserver.tar.gz /opt
COPY ./FileConverter /opt/FileConverter/
COPY ./DocService /opt/DocService/
COPY ./documentServer.conf /opt
COPY ./run.sh /opt
COPY ./docker-entrypoint.sh /opt
RUN cd /opt && \
chmod +x docker-entrypoint.sh && \
mv docker-entrypoint.sh / && \
chmod +x run.sh && \
mv documentServer.conf /etc/nginx/conf.d/ && \
tar -zxvf documentserver.tar.gz && \
rm documentserver.tar.gz && \
cd documentserver && \
LD_LIBRARY_PATH=${PWD}/server/FileConverter/bin server/tools/allfontsgen \
--input="${PWD}/core-fonts" \
--allfonts-web="${PWD}/sdkjs/common/AllFonts.js" \
--allfonts="${PWD}/server/FileConverter/bin/AllFonts.js" \
--images="${PWD}/sdkjs/common/Images" \
--selection="${PWD}/server/FileConverter/bin/font_selection.bin" \
--output-web='fonts' \
--use-system="true" && \
LD_LIBRARY_PATH=${PWD}/server/FileConverter/bin server/tools/allthemesgen \
--converter-dir="${PWD}/server/FileConverter/bin" \
--src="${PWD}/sdkjs/slide/themes" \
--output="${PWD}/sdkjs/common/Images" && \
cd /opt/documentserver/server/FileConverter && \
mv /opt/FileConverter/* ./ && \
chmod +x ./start.sh && \
cd /opt/documentserver/server/DocService && \
mv /opt/DocService/* ./ && \
chmod +x ./start.sh
可以参考OnlyOffice验证(一)DocumentServer编译验证,自行编译,随后将编译结果打成压缩包就可以了。
在Dockerfile
同级目录下执行docker build -t ds:v1 .
命令,构建名为ds
版本为v1
的镜像
[root@test documentserver]# ll
总用量 822720
-rwxr-xr-x. 1 root root 1220 3月 2 14:10 docker-entrypoint.sh
-rw-r--r--. 1 root root 1366 3月 2 13:34 Dockerfile
drwxr-xr-x. 2 root root 37 3月 1 21:53 DocService
-rw-r--r--. 1 root root 764 3月 1 21:10 documentServer.conf
-rw-r--r--. 1 root root 842447109 2月 24 10:40 documentserver.tar.gz
drwxr-xr-x. 2 root root 37 3月 1 21:53 FileConverter
-rw-r--r--. 1 root root 167 3月 2 13:38 run.sh
[root@test documentserver]# docker build -t ds:v1 .
构建成功后执行docker images
命令后,会在结果里看到下图框住镜像信息:
接下来用这个镜像启动一个容器。因为我的配置并没有去覆盖Nginx默认的80端口,而是另起一个配置监听81端口,所以此处会映射两个端口:
[root@test documentserver]# docker run --name ds -p 9001:80 -p 9002:81 -d ds:v1
启动容器后可通过执行docker ps -all
查看该容器是否在正常运行
此处宿主机的IP为192.168.95.131
,映射端口为9001
。此处访问Nginx欢迎页http://192.168.95.131:9001/
验证一下:
此处宿主机的IP为192.168.95.131
,映射端口为9002
。此处访问欢迎页http://192.168.95.131:9002/welcome/
验证一下:
有kubesphere的可以忽略此处,镜像推到私有镜像仓库随便拉着玩就成了。这里先把之前启动的容器删了。
[root@test documentserver]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d80dd2ea6bf ds:v1 "/docker-entrypoint.…" 17 minutes ago Up 17 minutes 0.0.0.0:9001->80/tcp, 0.0.0.0:9002->81/tcp ds
[root@test documentserver]# docker stop 1d80dd2ea6bf
1d80dd2ea6bf
[root@test documentserver]# docker rm 1d80dd2ea6bf
1d80dd2ea6bf
直接在资源准备的文件里创建一个名为docker-compose.yaml
的配置文件,内容配置如下:
version: "2"
services:
ds:
image: ds:v1
container_name: ds
ports:
- "9001:80"
- "9002:81"
volumes:
- "/opt/documentserver/data/:/opt/documentserver/server/App_Data/"
restart: always
主要就是映射端口,容器共享宿主机的目录,服务随docker
服务一起启动。
[root@test documentserver]# pwd
/opt/documentserver
[root@test documentserver]# vim docker-compose.yaml
[root@test documentserver]# ll
总用量 822724
-rw-r--r--. 1 root root 311 3月 2 22:08 docker-compose.yaml
-rwxr-xr-x. 1 root root 1220 3月 2 14:10 docker-entrypoint.sh
-rw-r--r--. 1 root root 1366 3月 2 13:34 Dockerfile
drwxr-xr-x. 2 root root 37 3月 1 21:53 DocService
-rw-r--r--. 1 root root 764 3月 1 21:10 documentServer.conf
-rw-r--r--. 1 root root 842447109 2月 24 10:40 documentserver.tar.gz
drwxr-xr-x. 2 root root 37 3月 1 21:53 FileConverter
-rw-r--r--. 1 root root 167 3月 2 13:38 run.sh
在docker-compose.yaml
同级目录下执行docker-compose up -d
命令,后台启动容器
[root@test documentserver]# pwd
/opt/documentserver
[root@test documentserver]# docker-compose up -d
Creating network "documentserver_default" with the default driver
Creating ds ... done
[root@test documentserver]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b79ca4c4233 ds:v1 "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:9001->80/tcp, 0.0.0.0:9002->81/tcp ds
接下来直接调用文档转换接口测试下文档转换是否可用,此处是将word文档转换成一个图片:
{
"async": false,
"filetype": "docx",
"key": "000001",
"outputtype": "png",
"title": "demo.docx",
"url": "https://d2nlctn12v279m.cloudfront.net/assets/docs/samples/demo.docx"
}