如何打包Docker Clammit?

Docker

1 基础知识

1.1 Clammit的介绍

  • Clammit具备整合(集成)nginx与clamav的能力,使Nginx变身为具有杀毒能力的反向代理
  • Clammit是一个HTTP病毒扫描检测代理(可以理解为具有病毒检测能力的反向代理)
  • Clammit工作于Web客户端与Web应用服务器之间(相当于反向代理)
  • Clammit本身并没有病毒扫描能力,其依靠调用ClamAV(clamd)来完成扫描并返回HTTP响应码

1.2 Clammit的工作原理

  • Clammit通过代理服务端的应用向Web客户端提供HTTP页面或接口
  • Clammit接收到Web客户端提交的HTTP请求(包括上传的文件)
  • Clammit则调用ClamAV对上传的HTTP请求进行病毒扫描
  • Clammit如果发现病毒,则会立即拒绝上传的HTTP请求并返回异常响应码(418)
  • Clammit如果没发现病毒,则将HTTP请求转发给上游Web应用服务器并返回正常的响应码

1.3 Clammit程序设计架构

  • 转发器(forwarder/forwarder.go)接收来自Web客户的HTTP请求
  • 转发器下载请求正文(至少使用两次)
  • 转发器将请求传递给拦截器(clam_interceptor.go)
  • 拦截器定位表单数据并自动发送(方法包括POST/PUT/PATCH)到clamd
  • 如果clamd返回假则文件包含病毒,拦截器将编写异常HTTP响应码并返回给Web客户端同时停止调用转发器
  • 如果clamd返回真则文件正常,则转发器构造一个新的HTTP请求发给Web服务端并向Web客户端返回正常响应

2 最佳实践

2.1 部署前的准备

2.1.1 熟悉Clammit的安装部署

本章需要你熟悉Linux的Clammit部署,如果你尚未熟悉,可参阅如下如下章节

如何通过Clammit使Nginx变身扫毒反向代理?


另外,本章也设计到Linux的go部署,如果你尚未熟悉,可参阅如下如下章节

如何安装部署二进制GO语言?

2.1.2 部署Docker环境

本章使用如下Docker环境部署,参阅本章建议你先搭建以下Docker集群环境并熟悉,

如何部署Docker生产环境?

2.1.3 准备系统镜像

In docker01

cd /data/docker/images/
docker load -i centos_centos7.3.1611.tar
docker tag centos:centos7.3.1611 docker01.cmdschool.org:5000/centos:centos7.3.1611
docker push docker01.cmdschool.org:5000/centos:centos7.3.1611
docker image rm centos:centos7.3.1611

另外,安装包的离线下载请在能上网的docker环境的机器上使用如下命令,

docker pull centos:centos7.3.1611
docker save centos:centos7.3.1611 -o centos_centos7.3.1611.tar

另外,其他版本请从以下链接下载,
https://hub.docker.com/_/centos

2.1.4 下载Clammit源码包

cd ~
wget https://github.com/ifad/clammit/archive/v0.6.0.tar.gz -O clammit_v0.6.0.tar.gz

注,另外其他版本请从以下链接下载(含二进制安装包,如rpm包),
https://github.com/ifad/clammit

2.1.5 下载Go语言的二进制安装包

cd ~
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz

注,另外其他版本请从以下链接下载,
https://golang.org/dl/

2.2 创建Clammit镜像

2.2.1 创建镜像项目文件夹

cd ~
mkdir ~/imageProject-clammit-v0.6.0

2.2.2 创建Dockerfile

vim ~/imageProject-clammit-v0.6.0/Dockerfile

加入如下配置,

FROM docker01.cmdschool.org:5000/centos:centos7.3.1611
MAINTAINER will@cmdschool.org

#################################
# Deploy Go Language
#################################
COPY go1.14.4.linux-amd64.tar.gz /root
WORKDIR /root
RUN tar -C /usr/local/ -xf go1.14.4.linux-amd64.tar.gz
ENV GOLAN_HOME=/usr/local/go
ENV PATH=${GOLAN_HOME}/bin:$PATH
RUN rm -r /root/go1.14.4.linux-amd64.tar.gz

#################################
# Deploy Clammit
#################################
# Install Tools
RUN yum -y install net-tools
RUN yum -y install make git

# Make Before
COPY clammit_v0.6.0.tar.gz /root
WORKDIR /root
RUN tar -xf clammit_v0.6.0.tar.gz

# Make Install
WORKDIR /root/clammit-0.6.0/
RUN make

# Config Clammit
RUN cp -a bin/clammit /bin/
RUN chmod +x /bin/clammit
RUN mkdir -p /etc/clammit /var/run/clammit /var/log/clammit
COPY clammit.cfg /etc/clammit/clammit.cfg

# Clear Install Data
WORKDIR /root
RUN rm -f ./clammit_v0.6.0.tar.gz
RUN rm -rf ./clammit-0.6.0/

# Config Start Scripts
RUN echo '#!/bin/bash' > /root/start.sh
RUN echo 'echo "Starting Clammit Server...";' >> /root/start.sh
RUN echo '/bin/clammit -config /etc/clammit/clammit.cfg' >> /root/start.sh
RUN chmod +x /root/start.sh
EXPOSE 8438

WORKDIR /root
CMD ["/bin/bash","./start.sh"]

“FROM”指令声明基于“centos7.3.1611”镜像打包
“COPY”指令声明复制当前目录的具体文件到打包的镜像
“ENV”指令声明JAVA JDK或Tigase所需的环境变量
“RUN”指令声明容器环境执行的命令
“EXPOSE ”指令声明容器使用的端口
“WORKDIR”指令声明切换容器内部的某个目录
“CMD”指令声明启动容器执行的启动服务命令
所以我们需要根据定义的文件准备需要复制的文件,

cd ~
cp clammit_v0.6.0.tar.gz ~/imageProject-clammit-v0.6.0
cp go1.14.4.linux-amd64.tar.gz ~/imageProject-clammit-v0.6.0

然后,我们需要预先准备clamav的数据库更新工具配置,

vim ~/imageProject-clammit-v0.6.0/clammit.cfg

加入如下配置,

[ application ]
listen          = :8438
application-url = https://wenku.baidu.com/
clamd-url       = tcp://localhost:3310
log-file        = /var/log/clammit/clammit.log
debug           = true
test-pages      = true

变量“listen”声明clammit服务倾听端口,例如“:8438”
变量“application-url”声明要代理的应用地址,如代理百度文库为例,则值设置为“https://wenku.baidu.com/”(可选)
变量“clamd-url”声明ClamdAV的服务倾听地址
变量“log-file”声明clammit日志文件的路径(可选)
变量“test-pages”为“true”则声明由clammit提供一个上传测试页面(可选)
变量“debug”为“true”则声明为开启调试模式(可选)
变量“debug-clam”为“true”则声明记录来自ClamAV的响应(可选)
确认所需的文件存在,

ls ~/imageProject-clammit-v0.6.0

可见如下显示,

clammit.cfg  clammit_v0.6.0.tar.gz  Dockerfile  go1.14.4.linux-amd64.tar.gz

2.2.3 执行打包操作

cd ~/imageProject-clammit-v0.6.0
docker build -t clammit:v0.6.0 .

以上“.”指当前目录为编译目录,编译程序会自动加载“Dockerfile”文件定义,可见如下显示,

Sending build context to Docker daemon  123.7MB
Step 1/29 : FROM docker01.cmdschool.org:5000/centos:centos7.3.1611
 ---> c5d48e81b986
[...]
Successfully built 10ca0ce5634e
Successfully tagged clammit:v0.6.0

如果镜像集群公用,还需要执行以下命令,

docker tag clammit:v0.6.0 docker01.cmdschool.org:5000/clammit:v0.6.0
docker push docker01.cmdschool.org:5000/clammit:v0.6.0
docker image rm clammit:v0.6.0

完成后,可使用如下命令查看镜像,

docker images

可见如下显示,

REPOSITORY                                        TAG                        IMAGE ID            CREATED             SIZE
docker01.cmdschool.org:5000/clammit               v0.6.0                     10ca0ce5634e        43 seconds ago      921MB
[...]

2.2.4 测试软件运行

docker run -d --name clammit -p 8438:8438 docker01.cmdschool.org:5000/clammit:v0.6.0

以上运行容器环境后,我们使用以下命令登录容器虚拟机,

docker exec -it `docker container ls | grep 'clammit' | cut -d" " -f1 ` /bin/bash

可使用如下命令查看软件倾听的端口,

netstat -antp

可见如下显示,

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::8438                 :::*                    LISTEN      6/clammit

测试完成后可使用如下命令退出容器虚拟机,

exit

另外,你可以使用如下命令查询当前运行的container,

docker ps -a

可见如下显示,

CONTAINER ID        IMAGE                                                                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
1322b1112a25        docker01.cmdschool.org:5000/clammit:v0.6.0                             "/bin/bash ./start.sh"   37 seconds ago      Up 36 seconds       0.0.0.0:8438->8438/tcp   clammit
[...]

然后可以使用如下命令停止并删除,

docker container stop 1322b1112a25
docker container rm 1322b1112a25

参阅文档
====================

https://docs.docker.com/engine/reference/builder/

没有评论

发表回复

Docker
如何修复连接Docker容器虚机无响应?

1 前言 一个问题,一篇文章,一出故事。 笔者最近使用如下命令连接容器发现一直没有响应, docke …

Docker
如何打包Docker Nginx?

1 前言 一个问题,一篇文章,一出故事。 由于docker hub原版本的nginx镜像过于精简,于 …

Docker
如何打包Docker MAC-Telnet?

1 基础知识 一款可以使用MikroTik RouterOS MAC-Telnet协议连接Mikro …