目录
一、业务假设
现在假设有一个我们编译好的服务程序pyfree_svr,该服务程序可以运行在centos7x系统上,运行时依赖一个额外的动态库libpyfree.so,需要加载一个配置文件svrconf.ini文件,需要对外开放一个10001、10002端口,便于客户端连接进来。
服务程序及库文件目录结构如下:
mysvr
pyfree_svr #服务程序
svrconf.ini #服务配置文件
pyfree_svr.sh #服务运行脚本
pyfree_lib
libpyfree.so.1 #服务程序依赖的三方动态库
ln_install.sh #服务程序依赖动态库部署运行脚本
其中,pyfree_svr.sh是服务程序启动脚本,很简单:
#!/bin/sh
./pyfree_svr
二、创建能装载自己服务或app的容器
基于centos7创建一个部署pyfree_svr服务的容器(centos:pyfree),其配置文件Dockerfile如下:
FROM centos:7
LABEL maintainer="pyXXX@163.com" \
version="v1.01" \
release="2022-08-15"
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
COPY pyfree_lib /usr/lib
RUN /bin/bash /usr/lib/ln_install.sh
EXPOSE 10001/tcp 10002/tcp
COPY命令是将依赖动态库拷贝进容器,并接着调用RUN命令调用脚本进行动态库配置使其生效。
ln_install.sh的配置如下:
#注意是先拷贝到容器,再进行连接,因此文件路径是基于容器内的路径
ln -sf /usr/lib/libpyfree.so.1 /usr/lib/libpyfree.so
#重新加载动态库,使其生效
ldconfig
三、服务容器化部署
将基于前面创建的centos:pyfree容器进行融合化部署,先配置其docker-compose.yml文件:
version: "3.6"
services:
pyfreesvr:
image: centos:pyfree
container_name: pyfreesvr
working_dir: /mysvr
environment:
- PORT=998
ports:
- "10001:10001"
- "10088:10002"
stdin_open: true
networks:
pyfree:
ipv4_address: 172.100.100.2
tty: true
privileged: true
volumes:
- ./mysvr:/mysvr
entrypoint:
- /bin/bash
- pyfree_svr.sh
networks:
pyfree:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.100.100.0/16
配置文件中,指定是基于centos:pyfree容器,将服务程序所在目录./mysvr挂载到容器内的/mysvr目录下,配置桥接网络为pyfree,并开放了10001、10002端口,容器IP地址是172.100.100.2。并启动命令工具bash,调用pyfree_svr.sh脚本运行服务。
另外将配置服务部署的安装脚本及卸载脚本
build.sh:
#!/bin/sh
#创建容器镜像
docker build -t centos:pyfree .
#服务部署,创建容器实例
docker-compose up
remove.sh:
#!/bin/sh
#停止及删除容器实例
docker rm -f $(docker ps -aq)
#删除容器
docker rmi centos:pyfree
#删除网络
docker network prune
四、部署过程
整个案例目录结构如下:
docker_test
mysvr
pyfree_svr #服务程序
svrconf.ini #服务配置文件
pyfree_svr.sh #服务运行脚本
pyfree_lib
libpyfree.so.1 #服务程序依赖的三方动态库
ln_install.sh #服务程序依赖动态库部署运行脚本
docker-compose.yml
Dockerfile
build.sh
remove.sh
本测试demo时在win10系统(主机)下,通过vmware安装了centos7服务器(虚拟机,非桌面版),并在centos7虚拟机中安装了docker以及docker-compose引擎,将在win10下的案例目录映射到centos7虚拟机的/mnt/hfgs下。
部署:
(1)运行./build.sh即可,可以提前加载镜像,docker pull centos:7,否则在运行build.sh脚本时,如果没预期拉去镜像centos:7,会先拉取centos:7镜像,命令语句“docker build -t centos:pyfree .”加载会较慢,是网络情况而定
(2)运行脚本中的"docker-compose up"命令语句会构建容器实例、网桥,并运行服务
(3)运行./remove.sh,删除容器实例、镜像centos:pyfree及网桥
(4)启动或停止容器docker start(stop) pyfreesvr(容器实例名)